|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) V: T2 S( n4 |5 _! e7 j4 {/ S
0 M9 d# U, [% h8 o4 M9 ~, j( }OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 |3 r& w/ B+ [% N#include <unistd.h>: d! q! P7 z& l, r' B
#include <sys/mman.h>
; p; z# N. P2 K# M2 Q3 w$ r#include <sys/types.h>
0 w7 p! e8 Z$ \# \, w#include <fcntl.h>( u) `. L3 R; {5 T, p
" X p7 }" [* K- N/ J& A# R' ~9 }- y
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 r$ ?* v5 U. E. q+ e; e- {% i/ g
typedef struct! j6 C3 k9 Q+ s
{
6 S; [" w j4 D w( ~ unsigned int a;5 Z3 | r6 |: S, p- U# t
unsigned int b;
: g3 f$ P: S2 i4 v( f6 K unsigned int packet_cout;5 s4 s' B8 q# C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, f9 j8 L6 m, P) l" w- X3 p. |8 j' r; e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 S+ D* J: b7 l+ b" Q. bunsigned int count_copy = 0;
+ L! `5 ]2 W6 f0 D# Y8 w, [! \: j s
7 f1 x r# _( i* y/ l6 O: n; p1 I5 \" ]4 b& g1 \/ K
int main()7 B1 l6 M1 Y" y3 z. R; D$ A% ?8 x; v
{
* D; R% j* Z5 r6 X* t0 c pRX_MSG_PROTOCOL pshreRAM = NULL;
1 M, _$ O4 @1 u) a pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ d R, }. ~4 h0 \; b
+ q: k2 h7 {7 k- N4 h while(1)
! f' N8 p: P: p! v {
' A% L# z2 A6 ~8 p( e read_MSG_buffer(pshreRAM);1 X4 d5 u, a: d# _3 t
}
7 r/ l% k/ m$ T1 z}1 e* P" Z- B" C
$ c6 A" \" Q- P0 U8 {! Yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) G8 `# i$ \' s{
9 R' Y7 P% K- w5 Y RX_MSG_PROTOCOL buf;
$ _4 j7 N3 X4 r; h
9 T* h8 u1 ^, { buf.a = pshreRAM->a;
' O! g' u% I" ^8 B buf.b = pshreRAM->b;
5 D. S3 t5 B( ] buf.packet_cout = pshreRAM->packet_cout;% m, t$ S! ~+ l% G! l1 {
' i% u& Y2 {( Z! m; l: c if(buf.packet_cout != count_copy)
% v' ^6 C- T! O% d0 d {. \% J) N' f H9 C9 t
printf("a is %d\n", buf.a);
1 {! f' ~, S7 ?" t; } _ printf("b is %d\n", buf.b);
' A6 I2 Q0 x- m printf("count is %d\n", buf.packet_cout);7 i# k" l6 W2 P% `1 T
count_copy = buf.packet_cout;
% f0 `* T0 P" Q! U& C }
9 S, K+ |5 R6 d! E+ O6 F6 I else3 m, {+ _" Q5 M8 K7 w5 T2 e
{2 Z3 P! \+ k9 ~! S# O
printf("No effective message!");
' ]& O2 w7 P$ T }- X; u: A2 y' Y Q! t4 D* x9 W! t
}
; o N0 x3 Y& J! U( ?. |
7 _2 m7 v% D7 x" X" o( [! D5 w6 R( O2 x) \( \0 q/ T" ]/ e
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, b: K2 a+ @8 N使用下面代码,对内存使用了mmap函数后:
1 J p" M. j) C% H: g; E& ~#include <stdio.h>- U W1 r! f0 y
#include <unistd.h>
( y8 M/ c2 }0 G% m' Q" E4 m#include <sys/mman.h>% g) X& w* G' Y0 h9 L( N7 ]& U* _
#include <sys/types.h>. A+ n" r) `/ E9 ?1 ?& d$ B2 k6 J
#include <fcntl.h>
2 n b U" p) K: {* e8 z9 j# v
0 u3 S* t+ E8 |2 e" a3 m; _#define SHAER_RAM_BASE_ADDR (0x80000000)
. y4 H4 B& G1 a- R" @: @" X#define SHAER_RAM_SIZE (0x20000)
4 Y2 ^# C' ~, V9 V2 N$ p" x4 \: w" B% t( j# Q
typedef struct' F3 p! E- Q$ c
{: h+ K4 \6 b# v1 P `
unsigned int a;
+ F" B$ X" t, Y- y# G unsigned int b;
# U$ U" m1 R P3 _( r unsigned int packet_cout;
2 _3 O8 H4 W: E' a7 t6 Q3 z+ ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 c3 d9 N6 }2 a; n: K" |9 z1 l! {
void read_MSG_buffer(int *baseaddr);
& X3 d- h) N0 [& {. e- w' K) V0 ^unsigned int count_copy = 0;6 S% h, l' g' e, P, |" }% w
n9 F1 A% V0 [/ f( l2 m
int main() K* l k- P) z" a$ ?
{( ?( l1 G8 O0 H; A
int fd;
; w j/ ?3 F1 b int *mem = NULL;! _, e1 _1 l1 g
1 U: j6 y( `# q$ J5 Z' ^2 x- \ if((fd = open("/dev/mem", O_RDWR)) <0)
8 E. F2 U/ Z2 i {4 P- X4 V5 a1 X( S8 B1 U* M! q, H
perror("open error");
, h& H) ]7 b+ _7 `. f return -1;
5 D* @, Q5 f U# [4 y% ~% \4 B }
: g/ D2 k/ o& Y8 C
8 m; r* U9 |. [ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& {' O$ t1 \8 Z( _
. P, i, \. i h* S7 U& K, X
while(1)$ i, }( h" l% d9 Z0 u- z# ?: |& r
{, A& }, W O9 d% y* q6 [( {
read_MSG_buffer(mem);" C+ `. M/ M1 x2 g4 W( F; h
}
( U) i% a( P" d% Z8 j z6 Z, {/ V7 \}4 Z T5 z1 _9 U
& B: C8 c: G' J; l0 F4 z
void read_MSG_buffer(int *baseaddr)( t+ J3 N9 ]0 J7 [7 n8 k
{# s2 q" O6 f( d% f* x. }7 {
pRX_MSG_PROTOCOL pshreRAM = NULL; b; ~; J. j1 W- j I! b
. `( r* k. \- J+ w9 Y) Q; ]# M0 k pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ R# }/ u! Y+ o t+ X. Z s
9 q8 F% v# r2 g9 B2 l1 p* V
if(pshreRAM->packet_cout != count_copy)
/ x7 u& w, R9 Y" c6 N { c& U, B% o3 r. S- n
printf("a is %d\n", pshreRAM->a);: F8 y9 n$ d& j2 {# q
printf("b is %d\n", pshreRAM->b);1 O+ ?- u0 C, V: w
printf("count is %d\n", pshreRAM->packet_cout);9 d, Z S; {1 P. R( U
count_copy = pshreRAM->packet_cout;
. s% x7 u) Q/ C7 O# w$ | }1 u+ F8 y( t1 H
else- h @! r3 q* D' G/ F. I! a/ ]
{2 m3 N1 z1 a5 q
printf("No effective message!\n");/ n: B9 W. x0 s* {# A( \: Q
}) J, K# h' I+ ^' `
}
) @% a' B1 J C; }
: q3 H8 y' I4 I- S! ~7 k没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 I" G2 r0 M4 r/ I% E/ N: P3 @6 h8 d- h. }. V- {* L: O; V; \$ W
% C: a' B: Y1 t1 @: k9 o6 A+ D1 ~/ d1 f
6 Z5 B5 D! w8 _. s& e |
|