|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % [2 Z$ g0 [& S$ {. f% x4 U* z
9 y0 z( k* i( e# ]5 T5 M. g" c
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>3 C3 h. o" B0 @
#include <unistd.h>
. I! p P! Z; s#include <sys/mman.h>! g7 l9 p0 M; |, |4 }
#include <sys/types.h>8 w. T' }. X4 {
#include <fcntl.h>
9 T; d* N9 n: s% }+ n( u
0 w) C" c0 Q( t" y8 E. T5 K#define SHAER_RAM_BASE_ADDR (0x80000000)
2 C' m7 @$ o0 v; o
* v9 M8 O0 B$ _2 A9 F" z, Ttypedef struct- w P. {& c- }+ C
{
) l7 Q' I4 A: G+ z5 @ unsigned int a;2 |( P8 l4 C! E$ D- @1 s z& \
unsigned int b;' ~( h* ~. Z$ [; a* x$ D
unsigned int packet_cout;
' }8 }; s1 \" R+ T n0 R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& c& _5 F6 j7 P" _. D7 R8 ]
0 I7 X$ ?% ?' A2 x& tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; r* J- g$ x/ u: y$ a
unsigned int count_copy = 0;
! \3 O' E" x! u' l' w" `
, t2 H- O; @* c4 Q
, v; n0 l5 @/ s6 j( cint main()/ F+ d7 E* `5 B* s4 h3 V: a3 b
{
2 G) O" e2 ~' S2 F, Z, T4 b1 c pRX_MSG_PROTOCOL pshreRAM = NULL;
( s! F* ~: I" y8 ]0 @6 A pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- M' s k1 J$ s0 K/ ~0 K% I
* A* F; L3 @* K4 Z6 J/ w
while(1)
1 D& n3 J) h% \* Y2 e: ^+ Q k+ P {
+ p2 @, S8 l2 N read_MSG_buffer(pshreRAM);
0 F& h! B( h$ a9 x0 j! v }
3 P+ N m$ y6 U) R" _! }}* a" L9 V6 v# R! j; E
8 Y/ n0 N t5 ?; L1 q4 B- b- Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 w* n' ~- G% i$ ~9 Q' a
{
& t U2 V% N) d% c% s1 u# Z6 U1 t8 A RX_MSG_PROTOCOL buf;
. J/ V8 h& W$ h5 W
8 ]5 i" U" d3 p' U$ s3 P$ v buf.a = pshreRAM->a;( [& q/ r* K; D) e, g3 T F
buf.b = pshreRAM->b;( X: J0 y! c& c" V2 d! p" o0 j
buf.packet_cout = pshreRAM->packet_cout;
+ f, j, G% @* e/ B! t - |9 d, u7 x9 e A8 y0 v0 C& R4 L' t% `
if(buf.packet_cout != count_copy)
2 _3 a6 s' ?2 Y- J* I" t {, r( X* N. O2 ~. ~1 b( I" ]' H3 t' o* U
printf("a is %d\n", buf.a);7 [5 z4 `- c$ r: m9 r4 C6 _ D: K
printf("b is %d\n", buf.b);
) F( m- b. P2 T: d0 W( W2 T printf("count is %d\n", buf.packet_cout);
; g' i* ^7 }# w J count_copy = buf.packet_cout;# @+ s- r0 f& t. r5 X
}, M4 ^' P( ~* H% B1 e
else$ t5 i2 ~2 Z1 N+ W
{: x. z4 t- `( t2 s' p* A) J
printf("No effective message!");
k0 |: Y( d$ }, [# T% g4 P+ y( Y }1 K2 }+ V1 S+ X$ A% e8 y3 c+ Y
}6 Q6 B) N3 t. \; [. Q' `4 _( E
; ]1 N4 D+ r" E
+ K$ {! o( _: h) j- H: M( B但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ z2 h3 C: D% @# `& s: N0 M1 a使用下面代码,对内存使用了mmap函数后:7 Q. Y! y- w; |( G7 R0 L% w
#include <stdio.h>7 n8 d1 y) M, ?, m; T
#include <unistd.h>
2 Z# T* o: u: `; T2 V, _( P#include <sys/mman.h>
. Y4 p# u$ ~6 l$ k#include <sys/types.h>0 B; v' }; c# u$ u4 L$ z6 T+ [, _
#include <fcntl.h>" A- B, B, h! u4 H, _! D
5 I X5 P4 A2 g; |5 J- a: U% q
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 O8 y' u! @% @3 C. E8 }& {- a4 U#define SHAER_RAM_SIZE (0x20000) + q/ T! f& _5 V8 H& \0 `3 { n+ S6 s
/ g# r" U# K; f) N+ ^8 t9 H) J0 }
typedef struct! t/ ]" y- D0 a! S% T3 i( C; B
{
+ a' i; Z8 _% q/ ~# f unsigned int a;
6 X6 u% ` K _6 D- J* s/ g unsigned int b;
9 J% @: |7 O# [ unsigned int packet_cout;# N" c- a- R3 ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 r$ w( U; e" {2 l1 W8 i" }
& P+ @/ E& h4 J- g$ x* Jvoid read_MSG_buffer(int *baseaddr);" x6 N* H5 w; `3 Q7 ~
unsigned int count_copy = 0;4 f9 a" P1 _) b( z5 }9 d: Z
( }) y4 P/ n" Q: h! pint main()
# s5 M# Y& ?0 ]5 \{
t* u+ u. x7 _5 `- H% ] int fd;. c- I0 o. ~( Y, w4 ]1 B- u2 N
int *mem = NULL;
0 y2 i3 x3 ~' T# X9 ^( K' c
( U. q, `7 }4 G" Y! `8 R s if((fd = open("/dev/mem", O_RDWR)) <0)- M& Z$ K5 R/ Q
{
9 E( a6 J, x8 U3 z5 s perror("open error");
! `% L2 s' N% v% h. O! n return -1;* r( n: s$ y* |* }; R* {
}6 @" v( v9 u Q* a3 \% g2 T7 K
" j/ o/ N4 K- Y mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) K5 k3 Z7 l" b# G" r/ f
# A/ {( I' u; G" d n: L while(1)! h6 J( A( K) x# {+ H/ {: ^$ G8 B: m
{
`0 d t8 s2 M) h read_MSG_buffer(mem);
+ S/ {. ~7 o- G } 6 }9 V* S8 e3 T& _. M: I
}
8 P3 p8 }2 |) q4 { L4 {7 N0 k7 h( \
void read_MSG_buffer(int *baseaddr). o/ j) e+ N- h$ b8 j
{. t; z0 D) g! t( H/ ?* L; V
pRX_MSG_PROTOCOL pshreRAM = NULL;
: @+ a4 v) B4 R) f5 G
9 ^! T0 T3 B' G; a) n+ b pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 f# |% g4 D2 w- J7 D
1 u1 f+ ~* i$ u& C if(pshreRAM->packet_cout != count_copy)
' e6 L, e) M- ^+ ^8 f {
8 L+ x4 i- @2 F4 y2 k2 j printf("a is %d\n", pshreRAM->a);9 N6 z& |# t& D
printf("b is %d\n", pshreRAM->b);
, \0 B* s% Q% N8 ?$ M$ x printf("count is %d\n", pshreRAM->packet_cout);3 Z7 R; P& \. b5 H, ?! k
count_copy = pshreRAM->packet_cout;$ s1 p( w# V5 {) y R1 Y" S. \# C
}
4 ]! ~; [$ F" ?' b3 _4 L else
/ |7 d" F$ ^. W. y6 a {; h1 L* w0 Z: y3 w; Z; O& {
printf("No effective message!\n");
+ ]+ j1 q. c& @0 j4 `. N4 D1 k }
% ]- M g$ o* t* T}3 E, {3 g; e9 d, o2 v; E. z
6 J7 ]" d; r4 i8 ~8 b( Y8 {$ Q没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 b1 V7 Z+ l% L# W! F" N
3 X; S. P' j2 G& I# p" |
* f- B7 }5 |7 Q+ e ~+ ^
# `& i8 r) j3 N. R6 \1 W: v& B4 ~0 O _% e5 w. r9 h9 C
|
|