|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) p9 u4 S+ I8 r9 {9 G
$ D6 w5 W$ V0 eOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 L% v% \% `( p" P% w5 U8 s
#include <unistd.h>- Y6 C$ B. \" T4 O/ z5 ^3 d
#include <sys/mman.h>
% Z& _3 J! p+ N# E0 E7 B. S' o#include <sys/types.h>
i( ^9 _9 d( V u#include <fcntl.h>, C9 N/ N! s3 i2 E
% L, K7 `5 t, H* N* a$ d1 {" D
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 [) P7 s7 @! q+ C# E6 P% g% `0 \; ~
typedef struct' N9 I+ g( Z7 w
{
* q2 s$ T: Q6 {- H! G* v% T unsigned int a;
; w+ j' d' L7 X" L5 w9 C7 @6 ~ unsigned int b;
9 ~- c: e2 p* c8 b unsigned int packet_cout;
4 z( Q- @- x% x, e) Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% {! O# @ R$ [" i: |3 q
+ e5 N+ e5 c5 L& g& K0 T9 n2 p# o2 f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 d L; v8 ?: L1 O+ s1 R# I4 T2 ^unsigned int count_copy = 0;' s7 }7 q4 R4 s: h: k6 M
- i; f2 @: D3 o8 Q4 L' D
. S- @0 E7 Y# Y1 w/ o3 w& c
int main()
5 Q9 a$ L" {7 M9 { |{4 N! M& ]* f+ K, Q1 a
pRX_MSG_PROTOCOL pshreRAM = NULL;
: ^& i3 r3 s1 h2 z: B& [ pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 `3 z+ ~+ T) z# C* K
" v$ l+ M/ h( z8 E v. \ while(1)
* v, _) ^( k/ p! ^5 k4 s( F {
& w! j3 G4 ]3 O3 B9 T+ M read_MSG_buffer(pshreRAM);
% q7 k; q& f; m8 ?8 J9 V } 8 X9 i4 N* h: w' F# ~
}
: J0 r& H! P& t* X& K
- H- f, M4 g1 @9 e8 i+ ~: D3 Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ J# }7 D; L: o{5 F) f5 G" p' _& F3 F' U! ]! G# H
RX_MSG_PROTOCOL buf;5 C8 c V- X3 [- P) h) t/ G
# _! q4 o1 C* p3 }4 h* O) F) {
buf.a = pshreRAM->a;: c: e/ |3 E! B+ z
buf.b = pshreRAM->b;; A1 J3 q+ m1 N4 }5 p0 ]
buf.packet_cout = pshreRAM->packet_cout;
6 L& m$ L6 O! f4 H: t2 P
: h8 X* N; \* x, r if(buf.packet_cout != count_copy)
/ u2 \. l }9 q4 p {8 H7 k/ O3 R1 Q5 l, r
printf("a is %d\n", buf.a);( ]$ _5 y: _! s/ J/ G, p; ^6 }
printf("b is %d\n", buf.b);& r, q0 D/ T9 l" J
printf("count is %d\n", buf.packet_cout);+ I- |' } Y% h( Y% @
count_copy = buf.packet_cout;5 D7 n3 Y, p$ P: M* H2 E
}
& y; |+ k9 a; h+ o else0 J: g4 C) R; o3 E! f
{
2 b) d* n+ S7 N" ~ printf("No effective message!");
- l* H2 X6 U: t( v+ E! A }- v. I Z M& g1 Z0 [# t J' D
}" m. H e2 g- S+ X' Y: I. V8 h9 Q
7 [ l1 s6 t# k: N: `$ s" x
5 H* g7 B7 Z" P, a$ B% \' R9 j
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! S) t3 `* P Q/ P8 `使用下面代码,对内存使用了mmap函数后:0 B! K t! K- C0 `7 a M
#include <stdio.h>
; b* n* y% Z" h. b s5 Z#include <unistd.h>
6 v4 P3 |4 z" F% T8 B" w6 h#include <sys/mman.h>. F/ {9 G! Q2 ]; v( E4 z
#include <sys/types.h>
% q4 M6 e: l- ?' d* k0 E#include <fcntl.h>
% D* l. \+ o5 \ u- Y. u# _$ b6 D% f* n) d8 f/ \ `$ F6 b
#define SHAER_RAM_BASE_ADDR (0x80000000)! F3 Q. D# _8 M* a' V
#define SHAER_RAM_SIZE (0x20000) % w0 S" ^- R# c3 o+ A
3 C2 h0 w+ C O5 {% o/ rtypedef struct
: m8 i# |- O8 {' M{: R# b* }+ K& {5 @ t' T! t( E
unsigned int a;2 }! }4 {, @: D8 ^9 w% b7 B
unsigned int b;) \. c; o, W" H- q+ Y
unsigned int packet_cout;
( I- h0 @2 m1 E3 U* e" A, u! j9 _}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 [6 S$ H+ H h3 s3 s) s6 X
* e( ]1 J2 m2 s, n6 C( I: }' wvoid read_MSG_buffer(int *baseaddr);3 r! M$ d2 G6 Y$ ?( f+ C& n& s
unsigned int count_copy = 0;
9 o" C+ @9 o/ ~ ?9 t9 t' s a" [2 n
2 @' l( p: h: t( i' ~int main()
' K* o$ r& G3 u# ~: G/ ~4 V{
$ g# _! D* I" V7 w8 G9 w* a9 t int fd;
9 k9 l+ H2 A, g; T9 ]/ j$ @ int *mem = NULL;; i8 M1 u, [( x
4 I% V3 P' M9 V( A) m1 K if((fd = open("/dev/mem", O_RDWR)) <0)/ c. y& K; p E k
{' J/ z1 h3 I* L
perror("open error");
1 R& W$ N, @; o" i: z+ L return -1;! D: e# f1 G4 t- y( b
}
# e" K E/ y. |+ @$ j$ y% y
( L2 [ F0 b1 D5 y mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ a' |8 J% u) K: |7 k
' y. g: I7 r6 h. \( a while(1)
! D6 K; [+ q& @0 o+ a y) e {
. i# y6 Q3 ~8 X, c3 _ read_MSG_buffer(mem);
4 z; ~. y6 N. Z9 I s4 ^. ] } : Y% ?/ T3 {4 [
}8 L5 N+ b9 o# d8 c. r
4 R. z$ c7 M# X( R7 b% D
void read_MSG_buffer(int *baseaddr)
( p4 I/ z* Z1 u& ?{! ]4 b ?, l9 E4 H
pRX_MSG_PROTOCOL pshreRAM = NULL;7 t/ t; u' p; ^4 T" q1 c
; F2 h6 r A9 X; p6 u: k. F6 o1 z pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* j O( R0 \4 ]" a! u
6 B9 S: Y* A8 L/ ? if(pshreRAM->packet_cout != count_copy)+ P( }9 S: L6 c# t
{
- s7 R% @9 {9 V+ M8 h7 ~; o/ G printf("a is %d\n", pshreRAM->a);. F) ~0 D# I3 l/ _$ G+ V- T- b
printf("b is %d\n", pshreRAM->b);& J+ d6 s" Y2 w3 i E7 Z% }" Q4 z- ?
printf("count is %d\n", pshreRAM->packet_cout);
7 z" ?* P+ i# d count_copy = pshreRAM->packet_cout;5 x: R) k+ v% R- }: c/ [
}
) r8 z, d5 |8 E" Z: k- f else+ t% h, ]- n# ?' \
{
8 s& b: ~0 S; l/ z3 {" r6 a printf("No effective message!\n");4 Z _; {0 K% O
}
( u" _0 C7 \$ ]# w6 ~}; O7 ?( {- I5 }) c6 v; f
3 ]$ O1 f- l- `# p+ @没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; s8 h c* I% {8 s* Y1 x+ k
6 n9 ]6 a7 H% J B
, i- E v' z! O2 g* g5 d
+ V0 a4 ]) ]& @* u& f) ]' {. Q) D) Z7 E6 x8 H/ |4 P* ^
|
|