|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " H% b' Y- Y2 i+ V5 \% \
p ?) c( l7 h; R4 OOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 }, M7 a1 W' H#include <unistd.h>
# A4 y6 i! t- T#include <sys/mman.h>
f- J+ x: l! h( {1 Q+ J1 C% Z( y#include <sys/types.h>' L ]- y1 G) F# }0 Z
#include <fcntl.h>
2 c" m6 Z: q5 L! L. \ K
q- b7 l. m. H+ U" g#define SHAER_RAM_BASE_ADDR (0x80000000) & R- b, b& C+ Y+ b$ z, D
, y' J- {0 q# x" j( ^: f8 Z, s
typedef struct
1 Y l. Q% l8 e- F8 M. L+ r) y{- }& ?! R) O% E2 Q
unsigned int a;! _. |# q4 l0 t. Q. u3 q7 _
unsigned int b;9 T, x% U+ e9 ?! F5 B. A
unsigned int packet_cout;
0 u+ l+ y& p4 r% c2 D- r) s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 X% H& s- G W1 b6 H: }; W3 @) s7 N- ]/ w; U/ b+ A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. |3 g! M5 {2 ~, T9 @, p
unsigned int count_copy = 0;
1 V' x/ N- @) b( H
8 k. C& A% ~( v, W& v
( ]9 ?2 B8 Y; u6 hint main()
6 `! Q5 H( v3 K) D( V, x0 K{
1 j& T% t0 K' w% r0 Q pRX_MSG_PROTOCOL pshreRAM = NULL;
9 V! Q0 N7 e* C) |1 [4 k" M pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 I0 Q1 _% _, U- _7 z. d% w, H, B: j( U/ g1 m
while(1)
; j' f" _2 }" M$ A {! N! P+ y9 W) V6 N
read_MSG_buffer(pshreRAM);8 X1 g6 [0 Z) O- z M) G; B
}
. [# W1 d1 Y+ Q- Y+ s}
: i+ V x2 i1 O) s7 h0 }: N+ s
G$ r) D5 A+ C- Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. O$ ?- O( ^9 M' ]1 R& K{
8 h" y- Z8 H2 E1 l9 q RX_MSG_PROTOCOL buf;
$ D* P1 ?4 [9 X" J5 y6 B
7 R, g7 _2 _( n( V" S$ h* ^ buf.a = pshreRAM->a;
5 r4 b8 {, Y' J( y buf.b = pshreRAM->b;, r( l+ r4 [& [6 |4 K0 C8 s0 {
buf.packet_cout = pshreRAM->packet_cout;
3 r3 Y; c) Z2 U2 _9 ^' J2 U
: G& F" A: Y$ u6 ~- V: | if(buf.packet_cout != count_copy)( y% J; g# Q9 ?- R0 r4 s; j; C; E7 I
{
& k0 a- [0 _5 [ printf("a is %d\n", buf.a);' R& g6 g+ n, f/ t x1 [
printf("b is %d\n", buf.b);3 {6 F3 C; z9 h- l! {
printf("count is %d\n", buf.packet_cout);
9 ]5 W$ \. z0 D. G5 p7 y- X! } count_copy = buf.packet_cout;
/ }! M% c+ U- o. @ } w! A: C0 C }9 B
else4 C0 `: }$ S5 g( t; r- T7 g
{8 ^4 ~6 i" T7 J
printf("No effective message!");
V* P* \; J2 [' C }
( l4 x) U0 x) [$ B: [7 A}. x) z7 {: b' y: o9 D& p
4 j: B$ L" m: C. U9 _3 k$ f% ]
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 ]8 ^9 Y; O/ z' Z L
使用下面代码,对内存使用了mmap函数后:% C, W P# i7 l6 i4 P, P! k
#include <stdio.h>/ ?' L+ _5 j/ |# k0 ^* J d3 l2 X: d9 u
#include <unistd.h>% C2 ?; P* B4 q: @/ Y/ a. v
#include <sys/mman.h>
. D0 v& s9 v: _2 q8 f3 D! k: R9 I1 U#include <sys/types.h>0 ~) ^! x# k: f- {( X& f
#include <fcntl.h>6 w' o5 @0 ]. _
1 d- T! A8 ?9 M4 k0 o; ?
#define SHAER_RAM_BASE_ADDR (0x80000000), W5 @9 t7 N9 I/ v% a$ M. U( O; A
#define SHAER_RAM_SIZE (0x20000) * S, T5 }3 h8 G" @9 c9 Z d5 H! L
0 f% |6 T( m, J' q
typedef struct
" {! z+ U& W! c- D{# J* m! ?# y) B
unsigned int a;
& q) P6 b, q7 m/ Z: c7 H: ` unsigned int b;5 P1 }: h; E; z5 }5 ^, I! n
unsigned int packet_cout;4 D5 \/ T) i( L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ @" C8 G. B8 Q8 \9 k! Q' K; W/ `
4 ]% d. M. |0 K9 [/ e& Hvoid read_MSG_buffer(int *baseaddr);& o# b: r C- l) Z
unsigned int count_copy = 0;& s1 T3 p6 u P
3 n! J$ N8 n& F; Q9 V" N
int main()4 _! S* D1 g* }# ~
{ p8 g- W/ S8 z3 c! @/ b& i
int fd;' d& V2 }' _. n- {! j
int *mem = NULL;7 T* n) ~0 p7 k) d: O
; V9 w5 I: a! E' P4 z
if((fd = open("/dev/mem", O_RDWR)) <0)4 v) s* P L2 }
{% c2 _9 v) y% g/ L
perror("open error");. a4 h0 G v+ d7 O! G: ]
return -1;: u* j3 m: z# [
}- z! p1 W+ L8 F! l" D" l( D2 P9 n
9 R; \2 m$ O5 }- E9 P
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 I4 a' L6 i/ ]9 H0 |4 U# [
3 L% k3 G/ t9 _2 U2 a6 w3 i- h6 x/ A
while(1)$ g- h5 m4 N/ X( I
{
3 a9 q% f% @6 j5 g6 b$ P ~, F read_MSG_buffer(mem);+ `, W+ v1 D+ b1 _
}
0 R( Z" ~$ ~6 g) U" Y; Q}
7 W" |: h3 f8 M# p+ H, T, P7 T. N2 C$ U: B w6 ?% C
void read_MSG_buffer(int *baseaddr)/ T/ o* A9 I9 u5 O6 j
{
# V9 }: O1 c: @" w- p/ _ pRX_MSG_PROTOCOL pshreRAM = NULL;
' m" F3 h f" w* p7 _" u
, a$ H* R C6 f R( b pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;" m# D$ ]( M5 U! ?- ^1 j3 h! y
* O/ S, ]1 q; P* t( T) {& b5 { if(pshreRAM->packet_cout != count_copy)
1 B! f$ b- b" l: y! B. \) k! i {3 I0 y% g- l7 N5 n7 p
printf("a is %d\n", pshreRAM->a);
+ p% i; L# e* m% j& I, [ printf("b is %d\n", pshreRAM->b);1 w6 t. g5 s* C& P5 C8 i" h9 t. S- {
printf("count is %d\n", pshreRAM->packet_cout);
- |; I+ Z1 i/ n1 X count_copy = pshreRAM->packet_cout;" s* x% g) e5 g
}
1 s! _; T8 @. M9 a7 K: {( V else) H0 g; s& p% |/ r3 n
{( h0 w4 p8 C5 a4 C
printf("No effective message!\n");$ {, E5 F# g0 l) c( `) [
}) \, D0 U/ \2 p0 b" C* E
}2 k3 K; h0 N8 p# Y0 z
2 l" K6 F/ K1 ]( O没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 M' Y) @+ E3 F) U0 F6 [4 f! c( |3 o6 z. P+ ]' V
# G& T6 \0 |7 G3 E& c$ v. R
: Y! k7 w3 T4 M1 d
~! O( A2 O4 x |
|