|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& Q* ?8 \# Y3 n% l) v
) u; J7 _' i* z8 @4 q1 Y; E. bOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ a) ~+ |6 q5 {2 j x#include <unistd.h>
+ m/ O7 _. g/ k0 C2 ]; `6 v0 G! g#include <sys/mman.h>
3 f7 k- V& s4 r6 @3 g( D* d) i ?#include <sys/types.h>0 L; G6 b8 m' {, j" K& q4 u- z
#include <fcntl.h>% G( T4 e9 h# |: I0 p
, \5 _( g3 a% Y9 X! e+ w; a+ n
#define SHAER_RAM_BASE_ADDR (0x80000000) & [( \% m- D9 s1 V2 D2 }9 z
7 L2 Q6 K. l* R) E& Z. O8 k0 S/ X
typedef struct; e6 k% ~" M- h) @' P
{, [7 c8 O7 p% m( a- m6 x3 M9 H9 G3 ?
unsigned int a;( ^# P% @6 @ M5 A
unsigned int b;- [: T+ C2 N/ k) y
unsigned int packet_cout;7 \' x" F* v+ W. N" d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 y! y4 [2 B: T6 B* g0 v; ]0 J5 l- |/ R4 X4 f |7 d( i s5 w+ ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" N9 k! C7 ~! w8 o H( m4 X
unsigned int count_copy = 0;7 M* D _! M: z& X2 `. `* I
1 ?2 @2 k7 L A# m! V
; c# M( W$ S: H4 E$ B( S
int main()
+ K: N) d& S+ y{! N/ U' N8 u5 _& X! F
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 c2 G% J$ q! H' f2 ? pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! b+ O6 x% r3 _
% D! W& n+ G/ ?
while(1)* T! B) r" k* z9 [7 w* V
{
+ k& `8 L# i/ k" i( z* L read_MSG_buffer(pshreRAM);
+ q" G9 w) c0 Q0 b- [, u9 A) R0 b }
" K2 B% y$ t: n2 I}
/ }) b9 p: f$ N2 q% G6 s
( b* U! ` `# Jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) f! d8 J8 v6 `6 l5 _{
+ }$ L+ n& L: s RX_MSG_PROTOCOL buf;
# p+ w( N3 d4 t ; l* o4 N9 }. T' z/ j# }4 s
buf.a = pshreRAM->a;8 o$ Y* M' T3 W. g( I9 n, W
buf.b = pshreRAM->b;
' |# @8 E k$ ~/ j. U5 ~ buf.packet_cout = pshreRAM->packet_cout;
0 m. O9 Q4 X. K9 Z: c 7 \, c! a$ g" L
if(buf.packet_cout != count_copy)' F* U {9 g8 F# a: s
{. }; I$ x- r& \4 C- U
printf("a is %d\n", buf.a);! {' N. ]# ?2 @2 t& B* q" _& B
printf("b is %d\n", buf.b);
9 g, a+ B f/ o3 R/ @ l printf("count is %d\n", buf.packet_cout);3 l" f0 I+ n: x2 X; B7 s
count_copy = buf.packet_cout;' t6 f) E2 n5 r1 X& p/ c
}
. f3 \& o/ r3 h3 Z$ d# d( c. A else
4 d: {: \9 |% W$ b: ?1 F {
8 [5 y% n1 f" U, h. B% t printf("No effective message!");5 [( s' J' z9 r6 l! w9 e
}- S, L* S. w- F; }
}/ a1 K& e7 W" }/ {' Q) ^
0 q: _( @* s% |% g4 [" @4 X: m. h
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ x, U/ b# x) D
使用下面代码,对内存使用了mmap函数后:2 B* x& O; A; o: I t) @0 d, O9 B- y
#include <stdio.h>, U+ G0 ~8 a* e4 k' C
#include <unistd.h>! @# |7 f* ]6 j, R4 y" r
#include <sys/mman.h>
5 Q0 A d8 f( d2 Q- j, v#include <sys/types.h>
5 j8 |' p. }' ?- y: }, F" p#include <fcntl.h>, [( o b2 j8 A' Q2 C/ g) X
7 s" c+ J* B$ y$ O. G#define SHAER_RAM_BASE_ADDR (0x80000000)
7 S6 _' ] r$ Q& o#define SHAER_RAM_SIZE (0x20000)
; _0 X- d- i" Z" [0 ^- |: z- [4 F6 c: ~5 w5 Q k) e' b) o
typedef struct7 c6 Y# I# p* z: j- I+ n* a3 P
{
$ X2 I; N2 r P7 ` unsigned int a;
N, r+ I5 s! W; P/ w unsigned int b;
9 Z1 ~: k# M2 f3 C/ A3 i4 M unsigned int packet_cout;& q4 d1 p4 I6 ?( W# e, ]1 G1 ?! D: P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 Y" y& B- I/ H% u' g1 t
7 J: l3 ^, P& b0 w: Nvoid read_MSG_buffer(int *baseaddr);
# {6 c; v7 t O" ]5 T( _" eunsigned int count_copy = 0;
7 w& {7 Y. J" y, W# p3 A8 Z, |
! H- E, B" I0 W0 I: Nint main()
6 ~: K" _! k; S8 z* S' [. p{
2 o$ [9 Q/ W0 h5 \7 \* Y ` int fd;8 f ?0 o$ { q2 y. G: p: `
int *mem = NULL;
4 u% [4 P' s3 u r) k; C4 f8 I) @9 m8 C5 A" u3 K1 N- b
if((fd = open("/dev/mem", O_RDWR)) <0)
, b0 P, r- h$ {% V {
7 I- V! D! D$ q+ Y perror("open error");0 a* t3 ^0 B3 ~" C/ }0 k
return -1;
( s/ H) w; H, z% t5 J }, L& ]; M3 @/ k. B. T; T
- h, _( F8 T0 @" ]1 m A) J0 t5 L8 s
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 T( q1 j+ P. V# m
1 J6 Y) w* O. P' p- H( x1 i- K. I while(1)
+ }& j6 \ K" g9 i {5 J( g7 o" B( H* S" h
read_MSG_buffer(mem);
, c* I! v7 H( d8 h6 o( k. i }
1 T) c7 r( x* C9 z# U/ Y}# D! k. z0 _4 f3 F9 k" E
. f/ \- A8 `5 b+ S: t$ q7 A+ ^0 q$ {# I9 ovoid read_MSG_buffer(int *baseaddr)8 I/ e5 o9 N; g5 D" N' {5 \
{
0 Z1 g4 r! ~# x$ O- X pRX_MSG_PROTOCOL pshreRAM = NULL;
5 Y1 |0 b9 j" {8 [
2 C3 w$ s, J* F' ` pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ j% I% U2 ?0 } o" G
, ~% q$ i/ c5 [7 }7 X. z
if(pshreRAM->packet_cout != count_copy)
# J; X+ h- t! s" R3 A {
1 y+ @( X! x0 L; K) |( L/ Z' } printf("a is %d\n", pshreRAM->a);4 q* D5 e" e0 P2 Y5 k" n
printf("b is %d\n", pshreRAM->b);. P' Q7 @6 M/ F. G3 d) ^
printf("count is %d\n", pshreRAM->packet_cout);
& j0 \- j: e5 c( A' G& z1 t count_copy = pshreRAM->packet_cout;1 v+ a+ A7 ] I" S9 I% F2 V
}$ ?: Y) B6 k5 V6 f4 V) O4 ~
else. t, N" c& O: @4 [) G
{
, s$ ]; E0 d6 Y: S, \ printf("No effective message!\n");/ v" K, p# ^( }! u: Q, Y
}
6 B( v5 p4 Q0 b6 u$ @0 `}
' Z: o a% O" w, m0 Y4 ^& ]+ d! E& o$ D0 e U
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 f" b7 t8 u" q- n( ]* ?
( |7 k9 Z# Y ?. _( ], L8 ]5 e: L T) N2 ~5 l, z
$ O/ ?+ g4 a) Q2 S
) f6 c& g+ c. i; N! `) |4 d |
|