|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, i" Z. ?: j: O1 e/ a6 o- g* Q, n1 e( D' ~1 c' s
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; Y8 l6 F( S1 S$ Z4 I' C: a+ y4 G
#include <unistd.h>& U# C& h4 _3 w# Z& q' ~
#include <sys/mman.h>
8 [/ w& D+ o4 g# J) ^# C#include <sys/types.h>
* {4 m7 e0 |* i#include <fcntl.h>6 g; F( |9 l& D+ `8 Z$ @% I
: @ h- Y' Y# \8 a" |& |; c4 j
#define SHAER_RAM_BASE_ADDR (0x80000000) 7 X; |' @4 j1 U) H
- R$ ~, J/ n& g7 d! {, mtypedef struct
2 k2 [& D( \$ {9 `( M: ]$ w) q{
1 ^& a) Y) e) h" ?1 f/ X unsigned int a;
0 q0 N& S" B6 b" Z! l2 t1 d unsigned int b;; h, N C O0 T
unsigned int packet_cout;: N( c' f. m3 ~, I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) B' }( G+ s/ q) F4 ]
# D* T( \$ `* `. W0 [void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: S" Q* @; W( L% _! eunsigned int count_copy = 0;+ B' Q; k* K/ M' h; @7 ]
. p1 ^. I& C* x( E* g, Y. M8 j/ v! z# e. d2 g
int main()
' ]% ^) k( _& E5 o9 h6 \{
& E: A! v3 u2 J7 R! G pRX_MSG_PROTOCOL pshreRAM = NULL;
% ]1 {: t3 H5 r, D; c$ b ] pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; C% [5 G: w. z" m7 V
" ?' R( w3 R3 B" w" F6 b* Q
while(1)
. s; }" Y# A5 ]4 r {
6 j# \& F5 T. ~# @+ N read_MSG_buffer(pshreRAM);
* ~/ h; a+ U0 q# Q# h2 O }
2 G' V7 n5 L5 @9 m}& |* S0 z/ X) r( B
" b$ h. W! k3 _/ s* J: C9 y2 ~6 l- i- W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! b! l" E) s% K" W; s{
& O* M% F' V4 v- t RX_MSG_PROTOCOL buf;
5 F5 ]/ r ~' A
4 ?- S5 L7 O0 L: p buf.a = pshreRAM->a;& ?* l$ S# L2 S8 z* ]7 O0 L
buf.b = pshreRAM->b;, {7 J7 ]9 s; n8 L: u+ g
buf.packet_cout = pshreRAM->packet_cout;
& X4 A! y5 E. u, L7 q
+ A# L5 @% T1 h/ M2 n. I9 G if(buf.packet_cout != count_copy)2 f3 `3 E& Y5 l* l
{5 q* X* |) B. H% @# r1 L! t
printf("a is %d\n", buf.a);
$ r8 T6 s( b2 ` d9 g- \2 { printf("b is %d\n", buf.b);
5 m6 L' e* ?; |7 O- O3 A* E* Y ? ? printf("count is %d\n", buf.packet_cout);0 w- Z6 b8 G5 a( O2 V2 V4 b: V
count_copy = buf.packet_cout;
. I3 I* @% A1 H2 Z }
& d, ]% {7 J1 Q$ d* L; D! [ else
& B7 F' u% P- X, }: C3 D( @* x {- S1 e: s4 A- l; b9 b0 I) u
printf("No effective message!");
5 X) |8 B7 l' v) {' ~# m }& P ]9 z; d) w; c* E- t9 ] ^
}! R: u, b+ o4 c z( X
* R. q! ^6 m. k2 R) { ]! [" P
/ z1 p5 f+ N% j但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 T6 p% [) z; Y, l. m使用下面代码,对内存使用了mmap函数后:
8 e ?! {% [3 r+ ?, Q#include <stdio.h>/ s' b- G0 |, F8 x
#include <unistd.h>
$ C1 g- ?1 c0 m* x7 D; J#include <sys/mman.h>4 O& f0 i" F) A3 v
#include <sys/types.h>& y6 k6 O0 i) f: u
#include <fcntl.h>% Z( u8 a% F- E
* Y! f* ?3 [3 a- e% ]#define SHAER_RAM_BASE_ADDR (0x80000000)
: F. N# ~. _. M! L#define SHAER_RAM_SIZE (0x20000) & Z0 ?1 g! n" w$ n' U
/ B5 i5 a. H. b' ~* j3 jtypedef struct% o F2 B( y$ b0 y- F: P4 X
{# r4 F& n e+ {, n7 {/ ?% u
unsigned int a;% g* B- {+ F8 _: J
unsigned int b;
- h& u' G9 U1 C" B, G6 T2 ~9 b unsigned int packet_cout;% C; b5 L' m: l4 ~5 i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 ]7 Q/ t* t5 l6 J0 q: L0 S
q/ e& n$ K. F8 t- Jvoid read_MSG_buffer(int *baseaddr);& g1 D4 M: q! v# W% X, [( o! D
unsigned int count_copy = 0;
/ l Q% R1 x2 |9 L6 ^1 }7 D' |0 E0 Y7 v" P
int main()
( Q$ D/ O; F' E& I9 H; ]/ Z{/ R7 ]8 J- d7 b2 D i
int fd;$ @/ n r" A4 ?0 Y% z. `% v, L7 ]
int *mem = NULL;
1 Q, ^# Y& a% ^/ M0 F8 y+ O' e/ ]) A( B% W
if((fd = open("/dev/mem", O_RDWR)) <0): d( K/ H! W( w/ s: F
{7 `1 b9 s% j# ^6 f
perror("open error");' y2 z1 _% u) [' z9 M9 V- o
return -1;
. j/ \; p9 R/ y8 p9 [- z7 q }
% {8 ~- N/ N0 j : m0 N7 U3 R1 j# s3 P2 E4 N) k: [
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" M$ [# C5 ~! z$ i/ B: |
5 B+ `# D M9 c6 i0 r while(1)
" R) `' j. |6 T$ w: X {
7 S( F6 F0 o- Z read_MSG_buffer(mem);6 b8 z. b. h* p9 l) r- J
}
6 `1 b. [5 G* a& D: [; Z! |}
& G& F) H8 d5 h" J6 i% \1 C, y" E1 q' m# ]5 P$ C) o1 R0 z( l! l" q
void read_MSG_buffer(int *baseaddr) q5 e* p; A, D! J
{
- v$ H0 ^2 I8 o$ H! t7 \ b S& ^ pRX_MSG_PROTOCOL pshreRAM = NULL;
: A/ i2 T. n3 k2 s6 \4 S% `( v
) V: A4 e5 o. n pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 A! S, [ t+ U# s, {! X- }# L' |4 \+ m
if(pshreRAM->packet_cout != count_copy)
: y& O% n1 s+ V$ i3 J) V7 ? {/ n/ N( N D& [2 b2 x/ W; ~ d
printf("a is %d\n", pshreRAM->a);) a# |1 r2 ^0 h" P5 M
printf("b is %d\n", pshreRAM->b);
# h1 a/ }) g, V$ l) c; e printf("count is %d\n", pshreRAM->packet_cout);1 |! ]9 ~( ^% \/ u/ ^ D) D& w I
count_copy = pshreRAM->packet_cout;! J' W0 }, z& }: I$ v8 n [6 v
}
- W) }! [( M9 Q: j, Y# H# U; N else
3 ?8 H; R6 Q$ u! z. T* q* W3 Y {- _) W7 J* R1 b1 m) ]7 J/ c
printf("No effective message!\n");
, s2 _8 A1 J0 t }
1 R5 T: T1 a& Y/ T# `% f}% \9 f9 ~$ ?: @& z; e& |
Q Z" ?8 ?: C
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- R: E3 F* O$ S( a
3 g; u: O9 z0 q6 [- ]. W0 u0 n" g) H# z$ z
. X- e: U5 G: r+ g6 Y) X5 f9 @5 A* m
|
|