|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 P0 W7 Z& p4 H, h7 T& P0 q/ r6 M( q. Q: p3 b3 E
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 q, i, L# t/ f$ f% ^7 x* }6 ~
#include <unistd.h>
( Q3 B9 o# D r- C; }#include <sys/mman.h># B" K# E+ Z* L. d
#include <sys/types.h> G6 y. q% `- M. J; i& @
#include <fcntl.h>
) `0 \; s! f6 ^6 y/ Z. E0 Y0 f& e/ K h) ~! n# Q
#define SHAER_RAM_BASE_ADDR (0x80000000)
% e+ @& F* I: f2 \
6 `# K% d% D* X, z3 ^typedef struct6 A$ {2 s6 N8 `/ I. j* m3 P! L
{
! ~- a* Z# |; Y% j unsigned int a;
4 u9 N2 o2 t4 [ unsigned int b;
2 j' ~, W5 n1 D) b2 B2 k! e1 y7 k5 f unsigned int packet_cout;5 p: o! Z3 h" M$ y9 ^9 ^% W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) t( [# r* @& I! p. q4 T3 Y' T* @. e
4 u) U5 \' ~2 a7 v2 c7 t, V
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 ~ I% F7 P$ K' L' y, Z. u0 `' T0 i+ Gunsigned int count_copy = 0;! g' P- z( Z% }3 f! r
7 Z& O; o1 P: z2 q
$ \! x1 u8 R8 w# d. |/ Sint main()
' R5 F4 ^& y- t$ {0 H* d2 b3 N{
+ _' C, q, b- L2 y9 q- X pRX_MSG_PROTOCOL pshreRAM = NULL;
2 R% e, _% ~; P" m pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: u6 N( h' }! G/ ~7 M" d, A+ R7 i! j- L+ U# c
while(1)' l s8 \* U1 _
{ n! R% j5 a8 F9 `
read_MSG_buffer(pshreRAM);
2 y/ V( r, }- p } 2 z0 l: M* N5 x4 B+ Y: A+ m
}" I( B6 a- n/ `5 O, y: X9 {7 v* D
* n' X# Y X+ W. e* g& ]; {! @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- Q E; d- k" n* w
{
1 a0 \! m" c+ m9 r- r( W RX_MSG_PROTOCOL buf;
2 R7 z. j9 ^: T6 d# C2 Q! Y 9 k: k' _+ m* [: \
buf.a = pshreRAM->a;5 R2 d9 y4 w1 x7 D2 ~
buf.b = pshreRAM->b;3 S6 N: H' K0 C( E; A
buf.packet_cout = pshreRAM->packet_cout;
6 h Y9 [" s* \, W# ~; l6 M
+ b' K) G2 x: g( p' p if(buf.packet_cout != count_copy)
5 q" |7 u" l5 { n, ?( B {
1 D% ]/ n" M9 Y; A* d printf("a is %d\n", buf.a);4 [. }3 D( x9 e8 z4 b
printf("b is %d\n", buf.b); e9 \8 r2 |" @/ i
printf("count is %d\n", buf.packet_cout);% N6 P2 Z( \2 j. H5 f1 X1 l& O
count_copy = buf.packet_cout;- f7 ]* v2 ~, o c" g; @
}
5 p% {8 ]3 F: r6 F' I else# n, j: m2 I: ]% b5 N8 |
{; Y% ]3 y. ]7 m. I8 J
printf("No effective message!"); ?3 D2 {( N6 C0 R8 k7 C8 M
}
: Q" W) s1 L' Y d. s}
9 t) k% T8 N% j: R
3 m/ T1 Y! M6 A- z! p! Y$ w5 C# o3 g5 ~ Y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 e2 ~3 d9 f$ n' a* @
使用下面代码,对内存使用了mmap函数后:
+ A9 B- l m5 s/ E9 y. G#include <stdio.h>. L- D; E8 Z! f) }1 w7 m/ w* Y0 O
#include <unistd.h>
5 u1 G$ `- i" X) c) z#include <sys/mman.h>
4 r( t3 u: k, A& D7 u( E" S+ X* z/ |#include <sys/types.h>3 S6 R, W" q+ S
#include <fcntl.h>
+ k; h" y2 f- J
" L# V; g: `* T/ F( ?$ @# _#define SHAER_RAM_BASE_ADDR (0x80000000)4 ]# C6 E! b7 G8 @! r" y
#define SHAER_RAM_SIZE (0x20000) 1 {& ~1 T3 Z* } \2 k; e S* \; i
- I( j. I4 H" @( F" y! y0 I/ g* h
typedef struct
) k E2 S) E9 h. }! T; _: N+ M{
( [- K' Q7 B' U c/ } unsigned int a;; [: ~/ G8 c+ d# y- F. I
unsigned int b;
' X+ s* f$ L% o0 y# O( A$ q- D unsigned int packet_cout;) }' ]% K4 d P4 i9 v7 n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 F+ \2 H& O9 H1 N
- x8 V1 U/ q1 l6 |* @* P2 f& ?' O0 vvoid read_MSG_buffer(int *baseaddr);
, H) P; A7 c hunsigned int count_copy = 0;* y6 q/ Y M- ?* u3 Q5 C
/ n; c& C( M9 C6 P1 ?0 n6 V; X- S: hint main()/ B( |# p! U, {% d5 a. m" E
{% i! o' Z, @3 f8 o7 P; z
int fd;$ f) z6 @0 Y+ b7 \! |( B/ B
int *mem = NULL;+ }) ~- }, P2 [" S+ p1 c: \" j
' w: p4 G7 L' B
if((fd = open("/dev/mem", O_RDWR)) <0)
6 N* B: E, c- w4 w& N. K/ c {0 @4 |8 V+ ]! V3 ?7 C' |
perror("open error");5 v! B# j$ N1 ~9 @- U
return -1;
6 L, E0 i# H2 m5 D( u }! r( M* U/ y6 y6 ^7 g# H) Z. F: N
' j6 M! S% Z1 B mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 o! p6 \- D/ O6 K. y7 I
, a/ J6 I9 I9 T B7 a! G z while(1)5 Q7 ]) g( ^1 \9 R
{) s/ p* h- z2 ^5 P% I- Q
read_MSG_buffer(mem);4 {$ E, Q( @* P$ n3 t
} ) d% i9 ?7 A3 M
} @$ l4 N2 w" E7 c" }% Q" o
6 s1 L7 [2 ?" @: S2 uvoid read_MSG_buffer(int *baseaddr): o. v6 b8 @9 \
{
" c6 u0 U# X0 ~4 F pRX_MSG_PROTOCOL pshreRAM = NULL;) b) W) b& _/ C' ?
, f0 F( z8 O' l) y: }; J3 X, y pshreRAM = (pRX_MSG_PROTOCOL)baseaddr; F+ ~7 H" A9 C5 k
) t7 y5 A* _6 t if(pshreRAM->packet_cout != count_copy)* h+ i' ^: X' X
{
5 Q# j7 d: V; w5 f1 X. Q printf("a is %d\n", pshreRAM->a);; t) w' J( E$ ?' s1 p, j
printf("b is %d\n", pshreRAM->b);/ L: f: j+ d7 R/ T6 P1 p7 E
printf("count is %d\n", pshreRAM->packet_cout);, h" d3 T' M/ z b3 }; K
count_copy = pshreRAM->packet_cout;
& H6 P; g8 Y8 b: Z0 P- v1 K# K }
0 _% e6 K% ^/ s5 ] else
7 @* z2 r8 t! T2 n) }" F* N {
' d& `, a* ~% P) E) b( \ printf("No effective message!\n");( c9 ~! c; ~( q( l; X8 r- V
}
, Z0 k0 ^, B. U}
V/ [+ {7 j1 i$ s1 F
, a( Q/ ], b4 i( `* q: q. B% Y( ?没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% c; x1 @* N8 X$ T
8 n9 W- E. i# p, v9 ?3 U
2 B9 a& r5 [& b$ r; ?. ~
6 O. ^7 [- e/ |3 D9 _/ E
7 V8 w! b( G7 T% a- n' Q' _0 M3 r7 c |
|