|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& S5 T8 Y: {) d5 s/ K8 u* C1 X# S5 v, W4 L% w
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 u0 {9 N- K2 W J2 T; g9 s2 R m: I
#include <unistd.h>
5 e2 V/ N# P1 q#include <sys/mman.h>
! {, H4 R, y7 I$ {% X#include <sys/types.h>
$ \5 h+ T' b6 M6 b4 B( u& c#include <fcntl.h>
5 w( O! M7 A. _2 H0 U7 N
1 J- {2 J: D# f" k: m, Z% T#define SHAER_RAM_BASE_ADDR (0x80000000)
- I0 X6 |) M; `
3 E t& u+ n# R( A- o, @5 _typedef struct
" i1 J4 H) I( n. w* V{
' H& m& `; W4 Z6 J; U* N8 m5 O unsigned int a;
; R- O0 ^. a& M G* s8 \ unsigned int b;% T! ~. h* t& M; Z4 h
unsigned int packet_cout;7 z4 Q. E8 Q9 L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 N/ T o5 \0 r0 v
( c; @$ O$ A% l: Y' cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 u5 }- R: C$ A& ]4 B
unsigned int count_copy = 0;
$ O! l1 S, o; f* Q4 a
. b" c. _! y% j" O1 V
6 A) H2 |) x# w3 lint main()
- y6 [( x; W [0 i{' y+ B0 F* Y, M) h) X, K! c
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 Q" a+ }4 h9 K# c/ Z* W pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 |0 I+ q3 E$ J$ j( w' k
- Z5 }" T: O9 u while(1): [( D% u! k/ w" K" e9 _( a
{, u A ] R; |4 E& F* J
read_MSG_buffer(pshreRAM);
, |4 R( `9 x( R1 K* ?3 i }
- Q8 v) D9 N0 r0 t8 t}( ~9 g/ [( s5 j. u, b
: x, ~' S/ P# N$ Q0 h0 Rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ i l( E$ A# K" R
{
) k% D5 [# i5 G# `9 ^; ^- n7 T RX_MSG_PROTOCOL buf;
% B) @5 O$ |1 a8 ^4 t- C7 r * a9 e% g O; O2 d6 `. L3 _6 q' U! X
buf.a = pshreRAM->a;
2 @% [- o5 b2 B( Q; e buf.b = pshreRAM->b;
' _2 g6 w' x! A2 _. O, i9 g buf.packet_cout = pshreRAM->packet_cout;
6 r/ p- p6 Y, G * U+ {# _- n& @% t' L: i/ C: h2 J9 |
if(buf.packet_cout != count_copy)
$ e" V8 D4 o& j: I- b4 D& G {
! D A4 W4 M9 x. O printf("a is %d\n", buf.a);
3 X: l3 s3 G1 x7 O& [+ e printf("b is %d\n", buf.b);2 B6 K% u, q3 I0 F1 G8 A
printf("count is %d\n", buf.packet_cout);' e) O: L4 E" P" s% y8 L. P7 I6 h; k
count_copy = buf.packet_cout;/ V/ g. k& k: H8 X3 K- X) x
}5 ?6 I1 q; S" a7 j
else: I/ ^+ @# N" H/ R2 R
{
( R, T1 [" g' q0 p% s( u3 v8 F printf("No effective message!");
; {5 |$ x2 Z$ ~, B, t; E; p- ~ }
+ C0 f! C+ t9 d$ a ^+ L# ^2 o}
7 e3 h: O9 u( c( N: d$ S" j q
8 c8 t, Z+ W) ~) S7 P
5 b- d/ J' x' V% D但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ @ O( \4 j x# ]6 ?5 p7 m使用下面代码,对内存使用了mmap函数后:2 f5 V- ^# h4 I% T( Z0 e( s& n
#include <stdio.h>
0 [* |5 e4 c- n% A! r) l#include <unistd.h>7 H: }0 Y; [( y5 S7 w& {
#include <sys/mman.h>
) k0 x5 m, e: ]: v0 ?#include <sys/types.h>/ T# _1 V' X* Y8 V: `+ l( W( A6 ?
#include <fcntl.h>4 j: n M/ ?9 e, d% N, ]3 ~
4 H# a( C& Z5 R. e; ]#define SHAER_RAM_BASE_ADDR (0x80000000) t1 z, U3 g! A
#define SHAER_RAM_SIZE (0x20000)
: N+ n* C/ C2 [: e0 l/ k, O0 I( q) v) `9 }) B9 i
typedef struct
! j$ y8 ]# |$ w9 ^: {$ K{
; T* @/ t9 i5 N5 E8 O9 O unsigned int a;& q) l- H4 C7 ]6 E2 `1 ^
unsigned int b;
6 ~! E% W7 b1 o& m0 j K4 J unsigned int packet_cout;- K3 N1 _$ C% O8 ~# q$ s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. b8 o5 o. L9 C+ F$ a( x
- p7 i0 P# y1 d \' n9 c% X8 Z5 Ivoid read_MSG_buffer(int *baseaddr);% E1 n: F7 M) X2 }
unsigned int count_copy = 0;
$ s# x5 [! z/ N$ x7 e; Z0 W; Z; p9 S& C9 ]* e
int main()2 r# I, s5 Y- z1 q
{& ?5 d7 j; s q; p+ \" L, y2 [
int fd;
5 U: N4 u) O3 j1 y3 v5 x5 [ int *mem = NULL;
8 H ~3 P. R$ j( C l: n7 O) w. u% a' j1 u s X: p' X. x( R" K& Q
if((fd = open("/dev/mem", O_RDWR)) <0)
* \' @* A- ]( |+ Y ?) G {; I4 y. @( e% z( |, ^8 V5 @
perror("open error");
4 c p4 d: n- h: l return -1;# W0 Q7 r% ?. }/ P- X' {$ M
}
" v2 I4 V7 G# e; z* Q8 T5 d
/ [$ T: z: y& L; D mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 m. ?5 @$ y3 _
9 A, V+ ^1 M( k while(1)' P/ [ b4 i9 X- R
{
; T" j0 E& g* W* d7 Y4 ^1 P8 e read_MSG_buffer(mem);% ?" Q; K! m$ U; g2 q; Y
} 3 Z+ h# z; [& N2 |6 @
} |" _* g! q N8 E
. |6 `; O0 X% A7 T6 \
void read_MSG_buffer(int *baseaddr)
. E- K {/ k, P* F{
' d$ X& u4 b) ]& T. p pRX_MSG_PROTOCOL pshreRAM = NULL;
( @9 A7 A; K# W4 Y7 j$ x* V- L# q
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;( M3 N4 I8 A+ y9 Q% c$ r
T. j1 x( Y, B& I/ ~% u$ @: J: I
if(pshreRAM->packet_cout != count_copy)# j" p4 y3 m e: |
{ g' ]# N6 r* [" z1 Q" f
printf("a is %d\n", pshreRAM->a);
) C% R8 J/ I# @4 |. P3 S1 \/ K printf("b is %d\n", pshreRAM->b); P' {2 F+ T E
printf("count is %d\n", pshreRAM->packet_cout);
1 K2 c' p" k, { count_copy = pshreRAM->packet_cout;4 J! N7 p( ~: \1 N" N
}
+ B7 p9 H( A" e- \' d else) C) _8 C5 U1 Z8 K
{
0 x6 s+ ~! p) ]9 q x, q7 G printf("No effective message!\n");
$ L* i' o$ O0 I, h! b8 Q9 _ }
& v0 w* T+ |9 R, V. H2 `}
+ N+ a+ p7 s% D8 x8 c* Z* ] D, `' c% O v
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: K) h) y% ]3 ^* k" d2 Q
# i3 w- G0 T, A5 E; s) B A% V- n) ^3 `; b k; o8 G* V! w$ S1 p
# U: f4 y9 y* x1 ~4 ~2 s
1 Y& M4 J, Y m) k3 I |
|