|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 c* _% X8 Y. s9 J( s; f0 H
( A5 B& [7 i+ r- L0 vOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 u, O+ _7 m& n# K; a7 v#include <unistd.h>/ q" Z$ }5 w2 K9 e
#include <sys/mman.h>
* m2 t# g" q* J4 N#include <sys/types.h> d+ L# `* f k
#include <fcntl.h>. g% A0 Z& e% n
) P, P! t2 s2 q#define SHAER_RAM_BASE_ADDR (0x80000000) $ h: U, e) a1 Q6 u8 K
6 e8 Z* l& |# }& Z% v. ^) otypedef struct6 I" z) e) M" U; N4 ^
{/ Z: x+ |2 d9 h+ i9 d! F/ n
unsigned int a;
& n0 r( x! ?. i/ N# e. p/ W6 d+ Q unsigned int b;: F- c' N8 \ ~8 r) T, P8 E
unsigned int packet_cout;6 N( g; \0 d* u4 K! C# r1 d- H4 V/ H; f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 h5 n6 M2 N N( j- o
% m5 P0 a4 _) H7 n0 hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- w6 m7 O+ y; f5 h* w, z* ?& w
unsigned int count_copy = 0;
8 J6 ]3 l# h! a9 z; m* _
) q3 w& a8 d Q$ [: s1 G4 A
6 c9 Q$ _4 l" j, fint main()$ q+ A& t# ]5 W# y4 W
{! Z- z, U D5 k, }
pRX_MSG_PROTOCOL pshreRAM = NULL;
, b. F, W h/ ~' T1 I- M& l pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 Y& p4 p% l& {- @8 F2 C. ]
6 ^) P! k1 }1 e( x$ u; T: h- C while(1)
* W* r" r% i+ a3 M7 Q {. X6 W/ \* J* _: t; F
read_MSG_buffer(pshreRAM);4 {7 ?+ u6 i8 O1 g, h- S! s* V8 ~, u
}
A2 ?+ C; g" [$ I A3 E+ P% ~5 P}! E) |2 b4 W, c _
8 \" W% f# m9 H; J2 mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
& P, G n0 H! G% Y9 n{4 _' E7 a: |( l. O
RX_MSG_PROTOCOL buf;7 F# ^: G! l1 e8 T/ F
8 i% y" O. c/ Y3 ^ buf.a = pshreRAM->a;4 D# g) ]- h4 E2 m3 i/ |; T: }
buf.b = pshreRAM->b;
, \$ z* s" G X* m# s buf.packet_cout = pshreRAM->packet_cout;
! f. J& A* ~8 \. _! S; p) r0 o% k+ O
5 a8 ~6 _6 H. U0 n" _+ H# F8 [$ F if(buf.packet_cout != count_copy)
" S# B8 w6 ~9 v4 b# A* c {( b6 `0 L3 ~+ ^' Z( i
printf("a is %d\n", buf.a);
6 k. ~3 W; j6 I# E8 R+ d" d8 r" G printf("b is %d\n", buf.b);' i' k4 m# b5 M6 Z' V% L0 E0 F
printf("count is %d\n", buf.packet_cout);
# G) h! ~1 M! T count_copy = buf.packet_cout;
) v4 F3 B, H J: V M }
# F- B, Q w& \( e2 Z6 n0 } else" w5 J+ }: ~4 r- n" K" a7 F6 r
{( N( E% Y8 O; o3 J/ C
printf("No effective message!");1 v! K- J) |: U) r. L- K# f$ K
}$ E' Y: r; G4 |" e
}
* p( j- N E7 t: Y; N7 ^! X' Z+ B& |' E
F6 [9 T6 k/ ^0 ?/ R& l
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* I6 l0 e: ~; Q* j使用下面代码,对内存使用了mmap函数后:3 y5 z, S* @) h9 Q3 Q$ I
#include <stdio.h>) L* S: q, Q: b1 N4 [
#include <unistd.h>
( W! L! G$ ?) L" m5 F9 U1 @#include <sys/mman.h>7 v" U7 m6 X- ~3 y6 {0 U, k& d, f' t: ^
#include <sys/types.h>
) Z- L7 M' h( |#include <fcntl.h>0 P# w Q" n- ^: J/ p- v* L
5 _( n% r- h' |$ R }) p8 z#define SHAER_RAM_BASE_ADDR (0x80000000)$ k4 o: i3 a8 G# u X
#define SHAER_RAM_SIZE (0x20000) 8 B4 t5 t! V8 s( g
" r) k5 Z" ]7 f2 B' O; e' Q, ]typedef struct
$ i: k6 B" f2 U1 v{9 W& P7 `* u2 C
unsigned int a;
; [2 _4 Y8 N1 R1 |6 Y {0 t unsigned int b;. \- E* |( s) S
unsigned int packet_cout;
) X; y/ r( m3 \; }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; D0 q e+ `) K v* _7 E9 Y) {5 o- j$ V/ s
void read_MSG_buffer(int *baseaddr);
& x9 K2 A% [* u2 [# A8 @$ v1 Munsigned int count_copy = 0;7 S& |% S# J0 c# L) i
* L1 X$ q2 |! l# X
int main()
- B# }# l, e8 n{
" ]3 G' G* z. K* D0 s int fd;& e; x' L S1 y5 `2 j
int *mem = NULL;1 E }0 w, F. U# f
9 d5 l+ Q& N* {' ?2 i if((fd = open("/dev/mem", O_RDWR)) <0)' w- [! ?% `9 v7 @# i! ~
{4 h) W8 _9 g* e
perror("open error");' E) y) W$ q+ k. {( Y$ n8 r
return -1;" U' J3 h) A( o2 p$ T
}
6 s8 V7 \+ d1 y, A, p9 H , |- a. x! U8 b8 a: T' _, k: ~
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ X" R- Q7 u' _
; E4 ^( O- B2 n& y while(1)
; x3 [' z1 I/ D& E1 Z6 d- | {1 v% x7 z8 } F# V' R
read_MSG_buffer(mem);
! ]8 B/ ?: C- M( ^# R" \/ w }
0 G& ?/ v9 w( M @ F}
& {* ]! {' X1 ?1 j3 o
/ u5 b3 L# V9 b4 T' rvoid read_MSG_buffer(int *baseaddr)- `; s; s; Q" X* \- {
{; f$ J' o4 P4 I1 z4 w. A
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ |% j, ^; P6 V8 t) G' q3 P, d6 s" O$ |8 U0 E
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" M& p: b- M% n( w0 a& W4 x6 I9 G8 D; `9 f u5 n4 y! L: p0 r
if(pshreRAM->packet_cout != count_copy)! A! ~! N; f9 A, r
{( r2 A6 h6 P& B* [ l/ \( O
printf("a is %d\n", pshreRAM->a);; P: ^$ e( R \0 R# s1 F `
printf("b is %d\n", pshreRAM->b);" @, [/ j, n, }2 Z, v! l4 ?
printf("count is %d\n", pshreRAM->packet_cout);. p a- ~" K3 L" x9 U+ E
count_copy = pshreRAM->packet_cout;* t2 b" [5 y7 S4 s4 y- O! g/ i
}* _% i' a# E& ^8 Q; U/ i" ]
else
5 ^. @$ x9 Y% ~ {
2 d U5 Y- X5 L6 N4 e0 P1 w printf("No effective message!\n");
6 f$ Z/ B5 V5 N6 Z' Y0 { }' V0 e1 f; ]+ a; h; n6 o' ] X: L* B
}
* V1 f9 h N" q! b: @1 n% k, _3 F
( U# Q% ^% R* i! S没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? k; n+ _; N3 |% k4 }- H5 [
4 `3 t. ^) L2 e+ X- s& Y1 h6 ^ [ n/ X9 `. c; K: E0 a, V
8 ~ c6 N4 B' B4 x
4 o- F/ @! o& O' J: ?, j
|
|