|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . F2 g: J5 z3 F' b: p j
% K- i, d- c& t# p/ q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* d+ t0 P; |# m/ B& m
#include <unistd.h>
4 r0 p; p7 _) `% B6 n2 O) Q#include <sys/mman.h>0 U/ Q8 }+ n9 G- A1 c _
#include <sys/types.h>4 p+ T' j0 `, ^6 f. Z7 m9 s
#include <fcntl.h>
6 O" J5 l1 r3 j- O( w! [
" H& j/ H9 g# Q4 m6 M7 Q8 l#define SHAER_RAM_BASE_ADDR (0x80000000)
; C3 s) }, r3 f9 r y0 n0 r8 [+ e9 J" f) G7 [0 C. E
typedef struct5 ~, g9 B+ ~" b7 c& g
{
, M( K$ h& C% w$ W" d# \- K1 o0 n unsigned int a;
! |+ k y# \0 Q unsigned int b;" z( |, T* u$ f: L" x- {
unsigned int packet_cout;# ?& N+ V7 X2 \1 } J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 `; H0 g6 R1 v+ U2 s) d% \* L ?( o
" s& ]- p6 U4 F! W& E d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 F* ]; m# e/ w4 n7 v( |0 I0 D
unsigned int count_copy = 0;
. B4 e" h: c6 h1 j. X3 K
0 }# I% H- v( d& Z2 N$ A
2 G8 n# B/ ~, ]int main()" K7 _1 o# b! s
{4 l6 { X2 o+ |$ [- M
pRX_MSG_PROTOCOL pshreRAM = NULL;4 a1 z& D4 u9 H, G$ B& a# Y
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# l' x0 ^1 s" Y6 O' ? [
7 s1 M+ v& E! p1 l" c
while(1); D$ T8 V# g% F" Q) S5 o7 C
{8 V' A; G8 `0 _1 I) E5 s/ T5 o
read_MSG_buffer(pshreRAM);
7 h* B7 m6 Y( i3 n* V7 e+ i9 M7 W } + g2 v$ h2 B2 N
}+ O7 `; g/ }- l, D. U; m) \
& R9 R* A4 u7 L- M" l; Y" G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 o- I5 H9 D4 U
{
% K9 W/ y+ T, J: s- `# g+ n. S RX_MSG_PROTOCOL buf;* w2 B- d% B1 u, N
. a2 y! O: Z8 X! ?& Q! _9 a buf.a = pshreRAM->a;
5 M9 h2 H1 P' E4 o* x buf.b = pshreRAM->b;
6 }9 u7 N! r- g- a' R buf.packet_cout = pshreRAM->packet_cout;
) G: k; n3 C: h . r7 H! ?9 b8 h5 o3 _
if(buf.packet_cout != count_copy)" h6 Q* \! D8 h% c P* r( T: ^
{. z! b1 K+ }6 D
printf("a is %d\n", buf.a);2 `( l ?9 t, ?0 Z V$ B4 n
printf("b is %d\n", buf.b);# C) a% g" B+ g! e
printf("count is %d\n", buf.packet_cout);
. M( Q1 a% n" o0 R; u0 E count_copy = buf.packet_cout;
. F9 T/ M5 `, }# l* u }8 c, g$ }6 Z+ j6 H$ a- z( f: I
else
9 h) l, ]# P2 n8 o- ~ {0 c" }+ ~# f- [: O9 s
printf("No effective message!");
1 j; h: Q; }/ b4 ] }
0 D* g6 R/ I" \& F+ `: Y6 g ]} O, x# |, y# O3 @0 A& {' M
1 v8 D, U% E% b5 \; ?/ u. g a( H" `2 o) y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ i( l( L& q* ?3 Z8 l; p( o
使用下面代码,对内存使用了mmap函数后:
/ v- w; l9 e: L- T#include <stdio.h>
! i( L/ O: p+ ]+ e* I#include <unistd.h>
) p h* X/ g/ E% s6 ]8 p. s#include <sys/mman.h>" B6 v1 Z$ ^, j
#include <sys/types.h>
: Z+ K+ s1 r3 j" m4 Y#include <fcntl.h>
0 e9 X, z; F2 v
X ?- y2 ]! h' Q, U! m/ v* L6 V#define SHAER_RAM_BASE_ADDR (0x80000000)* a" J5 ^7 d! e
#define SHAER_RAM_SIZE (0x20000) ) [/ ]* r8 Q$ t0 R* p; u# J6 Y# K
; \4 |! i2 M3 j7 i9 P& q& c
typedef struct! _' |6 B7 B4 z
{$ s0 j; E5 u$ ~. x9 H# \, [0 H
unsigned int a;
& W, \3 B2 b% l) _/ _2 U unsigned int b;
4 M: s# g' y7 \6 q unsigned int packet_cout;
$ k9 t+ g1 g1 r" T& R; e' Z# _}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 |/ T, g" b8 |0 f" t9 \4 ?, A& ^& T9 K' o: b; X) F$ B
void read_MSG_buffer(int *baseaddr);
! x7 S# l! `3 _0 S9 R% Q! `unsigned int count_copy = 0;9 k; ^1 [6 a) ]. T, o
. q+ Y4 R1 X% D5 b, q, X& W' w
int main()
, x2 F7 b- _# N& \{
0 K- @- S6 X, s1 j- l5 E int fd;
: j _6 Y. I& [ int *mem = NULL;
; }0 H* m+ f! q u" l2 B
- g( k/ u0 D4 A if((fd = open("/dev/mem", O_RDWR)) <0)
e R1 i/ b z: |& b {: J- K7 M. U; m
perror("open error");
; ]( H) D- {: R! ]$ N3 u# [1 { return -1;7 S e' Z/ o7 A
}( T3 X& {; `( {; v6 V$ i! F- n
) L! h; u+ P: g8 R, Y mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* L) Z; N+ g+ @
9 f: v* r6 R; h) W, f+ Z1 Y while(1)
$ D/ }+ S9 ]4 {) e {, W I" M( d, Z' Q% f" W
read_MSG_buffer(mem);
! @7 ^2 b6 N4 w }
l( i% L/ C9 j% C/ ?6 A}; A' m6 a( o J( f
% Z# |6 l1 V% N9 z! F, }void read_MSG_buffer(int *baseaddr)
7 H: H$ x; \& k* J/ m: n{
$ ^6 V3 g* U; S/ E pRX_MSG_PROTOCOL pshreRAM = NULL;& V* `+ Q8 R, X, ?
- M3 `/ G; N6 G" _' G! D pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ y0 [9 l+ b' a$ N/ c" T3 ~
( o% f: Y/ r8 c- {" _! }* g
if(pshreRAM->packet_cout != count_copy)
9 z+ t% s; [1 e \0 m% N$ Y {* R: X) R6 I( \3 ?! l) ?
printf("a is %d\n", pshreRAM->a); l$ M! }! h% W0 d& l# V; r
printf("b is %d\n", pshreRAM->b);) | l% Z7 y, Z( P- g
printf("count is %d\n", pshreRAM->packet_cout);1 c* y# q$ o, |+ y
count_copy = pshreRAM->packet_cout;
" \" a" e) e, } }
# b& d' P# o/ `% ^1 u else
1 g1 w7 Z/ d/ D/ d$ m" ? {
8 ~% C7 a5 C( m9 r1 G printf("No effective message!\n");. o: l3 W7 w7 X% k- u) n/ F2 k0 Q
}6 @, p4 s( X( }7 Y
}
% f: Q) A" D0 j2 u% [" n
8 F, H% s+ K2 k% [$ [+ B没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: Q+ O7 P) z0 c2 U1 `5 ]
5 D3 A) c m9 \7 V- e7 `- l% z2 i1 G4 y
" U+ M/ w1 `5 K M7 C. ?
1 M! h5 d9 u; u. b, ~3 I |
|