|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 Y& }3 s# g! P1 ?' b2 e* _! \; Y# L7 D+ d3 X
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% b8 Z0 F% h7 j4 e# ]$ N
#include <unistd.h>7 N W2 ?. U, [' @ C* g% z
#include <sys/mman.h>
4 p) m# j; h8 b#include <sys/types.h>, T2 \- r6 ~ x' }8 O- f
#include <fcntl.h>
+ B2 s1 h$ n2 N/ G) K# H3 e6 O* t( w- t
#define SHAER_RAM_BASE_ADDR (0x80000000) 8 s. x, @( @6 k5 W+ M# ~, i$ |$ u
* ]+ H4 L$ | htypedef struct6 a m# }. C1 |6 \$ ?! }' e
{
: N7 K# w% H; t& F& H- ~' ?: U( @ unsigned int a;3 {/ }+ q' q# j3 d( C
unsigned int b;' R, }& b) y" D3 O
unsigned int packet_cout;
9 M p3 X& V4 \. ^}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! T8 t0 g7 U! `. N9 i# q
! J+ U/ G: Z# z6 _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 J# f+ Q9 V. s& c1 x: bunsigned int count_copy = 0;# R) Z& o6 [1 E. v( \
3 N4 y7 t- W( i
0 R! r4 V! i1 u( u' Oint main()
& i7 m! s* p% z0 q2 s, H{
6 N4 u) Y$ H; b Y; Q# x& V pRX_MSG_PROTOCOL pshreRAM = NULL;# b5 {* K5 C+ D2 N- z7 o/ w
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; ~. N9 y' f/ D0 X
) f" k* r% q% w5 y5 A9 S- g, f1 w! Z2 v while(1)
) w4 G- G) l% n$ m {# D& U, c2 p/ l) S6 t: m
read_MSG_buffer(pshreRAM);$ a/ k+ m* L5 U$ i" e
}
1 K3 d* ~% }2 l" j \; w& l}
7 v, u0 E n' ?0 ?) D
' C, h* c+ }! R ?$ x) y5 s% p, hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 ^: [6 n0 r+ c4 n; T8 S, A
{ U9 e) B% } O+ o, e% Z% _" }
RX_MSG_PROTOCOL buf;
& p3 v; @ g/ o/ j4 ~2 Q) k" }" v( p( H/ m
: w8 I8 o6 t+ o# o6 D% ~4 l) d buf.a = pshreRAM->a;: A- b) a+ `5 M9 `2 d; j
buf.b = pshreRAM->b;
$ U( A$ Z3 C$ `- Y buf.packet_cout = pshreRAM->packet_cout;5 o6 P2 u( h* r) I" e3 G, h
' V o1 Q8 G# j/ A& n if(buf.packet_cout != count_copy)
4 S: p e$ Z+ h ] {
2 G+ _, K. a* i8 E; q4 | printf("a is %d\n", buf.a);# ^0 H9 N6 m+ @3 X, F$ A
printf("b is %d\n", buf.b);
8 R7 _' f+ B7 B) l5 g' T printf("count is %d\n", buf.packet_cout);) Q% q8 I' s9 S' ?' [
count_copy = buf.packet_cout;; [1 h6 p# B" U1 K7 n: I
}5 F @' H3 k9 O- r" r
else9 U/ I/ q! }2 g! A& E( A
{
; Z; k& K& P c6 p; ~ printf("No effective message!");0 E# I! o' a7 l j t9 @
}. z4 B. D+ ^7 K
}
* C8 l; {1 o6 x! i! d5 g
, ]8 ?4 S" D# i' L. y! n/ c! d& g* ]" S) C
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。. [5 {$ m' c4 h0 ]) h" }; }
使用下面代码,对内存使用了mmap函数后:0 S0 N- l7 h8 y7 p- T, w
#include <stdio.h>" J2 b" F% K. _- `% q) ]! N
#include <unistd.h>
% @7 h/ d3 \- T; U% h" L#include <sys/mman.h>
7 i* M6 Q3 V" n. w0 `. Q5 e) h8 {0 v#include <sys/types.h>9 _( g$ e& R, s2 f$ v
#include <fcntl.h># a' a5 O' w8 P/ G6 u
/ E: }/ j! L' B% y% O
#define SHAER_RAM_BASE_ADDR (0x80000000)8 l$ X* h; `, J
#define SHAER_RAM_SIZE (0x20000)
( R" u; M9 n/ P5 m
! _6 ]; J) l! ]typedef struct. |7 |0 q* ~2 _8 v& r* M
{
# p6 s; c- ], d( `! u5 c( x# p) k! o unsigned int a;/ p2 R+ c! K! s. M1 R
unsigned int b;
) z5 a% i8 z- n W" m unsigned int packet_cout;# P$ v8 }5 F" @+ S _) ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 U5 V& V6 x- Q% ?$ w: Q2 w! q+ `( D' x6 I8 w0 g
void read_MSG_buffer(int *baseaddr);
+ `8 W# i! [& W4 eunsigned int count_copy = 0;
7 ~4 @* C2 P6 N5 l' c
. f4 l0 Y) d1 ]6 Sint main()
" [- x O! o/ m: a& b" ^' O{7 }0 z2 {& Z) D% J/ B7 Y$ [ v
int fd;! J, j- T* m4 e4 M" a6 f W
int *mem = NULL;
( N7 H' F0 p |) v5 }& H+ m; r
+ e" Z2 J" S/ x: l B+ k if((fd = open("/dev/mem", O_RDWR)) <0)
4 c6 f7 A" R% H1 l- d) S5 e- F {! W& L1 a# [" [& \* V
perror("open error");
) M: Y9 ]0 k. I return -1;
$ t2 y* }, r1 v* e% h* X. b% Y }! G" \, Q2 I9 a
& z3 U/ B# u$ [; J$ p) ^$ X
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 X/ b( B# [2 I' _: j) G; u
1 A# v8 u: N! k2 M. I* J while(1)+ j6 u% p7 Y) b& }
{
% E/ P! K7 T6 W- O2 @ read_MSG_buffer(mem);9 y: z+ E+ T, z
}
: s1 B; e0 r, w& j( y: \3 b" K5 w" ^}' P; M% w2 e4 |+ w+ W; n! n+ n
0 v1 z+ E+ m) E( |, g! t' {
void read_MSG_buffer(int *baseaddr)
4 b& E' X0 K8 g. R* z) u{3 f) U9 s+ Q0 o. z( F! l
pRX_MSG_PROTOCOL pshreRAM = NULL;0 W D* s# T! D3 |: W" s! f
! A7 [' S) j" S3 u$ s" W$ l- o
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 z3 k6 T8 R) @5 C" Z3 r9 f
, y' ~: r9 `% ? s: Z& m3 o/ P
if(pshreRAM->packet_cout != count_copy)
V7 {' u( n! H4 H: ^5 i {! N" s/ W; |9 L2 r! k6 q3 B5 E( b
printf("a is %d\n", pshreRAM->a);
; v4 K6 g: u1 w/ h$ x# l printf("b is %d\n", pshreRAM->b);" t$ G! z, ?) x4 k6 Z2 S* j
printf("count is %d\n", pshreRAM->packet_cout);
1 b. b3 ` P% E' X7 }' L count_copy = pshreRAM->packet_cout;
& X1 n$ l7 v1 ~0 H% F }7 J0 y- j/ h+ W+ S7 F( _2 v. B
else1 p( A- S, S3 R
{& D m! z- o: n2 J3 Q% H8 D- d
printf("No effective message!\n");: t X: |% {# w# d. G
}' P: d0 A9 _* s9 L5 s
}
1 ?- K; j* F( a4 U% v) |: S% c$ n! U$ h; I, _0 M
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' c8 m& ^# Z5 N7 h
7 Y; y& h9 i% l2 H
! i& Z) l( x2 X" G) J1 n* g5 l
. `! P% t' X. K/ c4 a+ l6 V) c x8 v* B6 A3 @: _" g9 S& V
|
|