|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, x! j; k, I$ m* `1 H( y, A9 u8 K: m9 i5 G( M6 j5 h+ x7 ]
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* I" F, z6 c4 G( u: d
#include <unistd.h>
( T) N* x$ F8 E4 [* O#include <sys/mman.h> y \) S7 e5 J& F7 i: a8 i4 ]
#include <sys/types.h>
! |6 x, b9 y/ U/ @# i/ K7 R#include <fcntl.h>0 [& M/ }: i5 x9 n5 P* \" C
: B6 |: S4 r! G; H) Q
#define SHAER_RAM_BASE_ADDR (0x80000000) 1 K( j* q2 X: o. l x+ a
; A2 E: F" N2 D; z8 Etypedef struct
9 f" L% [" v$ h% _! |! U{/ w9 } Z% {* w# [+ A8 Q/ Q
unsigned int a;
6 }9 c; U! b8 d2 Y unsigned int b;
: |- r9 t! F1 U3 P- S! Q$ A unsigned int packet_cout;) q8 a) P9 Q; Q9 q# n& l: a4 Q! ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, G4 n: d$ v" O! d- }3 ?7 `+ z5 }
% J' K" e+ E4 |void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) V! H' o+ F( S+ D/ J qunsigned int count_copy = 0;, G" H" E4 w0 e9 c0 U
" q9 e* E: g# h1 Q* j1 V; M$ P$ O0 Z: u+ [0 x7 ^) c
int main()
0 R8 m3 C6 \7 x5 b) g{: Z$ c% E% B; l3 F
pRX_MSG_PROTOCOL pshreRAM = NULL;
& Y4 t; ~2 ?9 `5 ^ pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 N& E2 `8 E4 D; |. f- A8 f6 O# |9 N% q
while(1)# K i/ d9 }, v/ ] H8 b+ D4 ~
{6 a0 u1 c+ W1 f" c
read_MSG_buffer(pshreRAM);. w8 ~3 B; j J+ Y6 j
} 5 M/ I- ~5 o5 M4 w9 w i R- v3 l
}4 n5 m; e3 U- A2 f$ W* ]3 ?+ p
8 r& E5 f. o$ V
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 ^: q: {1 ?; I' L$ u- ~! X{9 q9 n) u K1 C
RX_MSG_PROTOCOL buf;
, @* o! B2 i: @7 M 9 k9 P% D' p6 x
buf.a = pshreRAM->a;
+ i, S! n) q$ Y) F+ @, X buf.b = pshreRAM->b;; x" i8 M N, b! n$ Y* @
buf.packet_cout = pshreRAM->packet_cout;
" O" e7 z. U9 h& E# A* K
T3 ?2 c/ q& L( q( g if(buf.packet_cout != count_copy)
3 K$ c. a% C# z9 w" ^! j+ ~ {- Q, d; R. f" T
printf("a is %d\n", buf.a);' O$ C+ X6 v9 O& i* f+ ?
printf("b is %d\n", buf.b);, z' w& u! V. y8 T; U+ l3 v2 |
printf("count is %d\n", buf.packet_cout);) r: X; M3 [4 N: K) W! E. u
count_copy = buf.packet_cout; [1 Y" L5 E( d
}& c% S1 K( o* t; T# G
else
: b9 N" q2 e2 j, R9 y4 x. s { A! `% R* W/ Z8 @ e1 i v
printf("No effective message!");7 m, g$ c1 G4 v0 U8 X8 ^
}
: v/ t1 F, S. l4 C6 _. M5 ]}
; F& y7 R6 p7 s5 V& h$ x0 G
; X4 o6 u$ Z2 W1 O$ m) n/ {% Z0 { a# B9 `0 q8 v. ^
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。' ?! p8 g# K( ?. K+ L
使用下面代码,对内存使用了mmap函数后:* l$ k+ m4 Q$ X/ }# H; s
#include <stdio.h>
7 ^. t8 f# T+ S' N& s1 S0 f0 q! j" }/ x#include <unistd.h>
v; k u4 H1 x# Y6 n1 d; e0 p+ G#include <sys/mman.h>
6 R8 n2 | f7 V/ @#include <sys/types.h>5 ^' ?+ k, L' S! T0 L4 z% p
#include <fcntl.h>
0 e0 V; n6 c$ R& x
# b4 C, t, k% z6 S3 l- X#define SHAER_RAM_BASE_ADDR (0x80000000)
; U6 q% w. v* ~/ k, F5 h#define SHAER_RAM_SIZE (0x20000) & J$ }( J4 p6 ^$ V/ G2 {" O$ D, z
4 d" Q0 b& W* e. f! R" U8 H
typedef struct V+ Z9 C3 c9 f7 a5 U5 R, G
{: \0 x9 H$ d+ q; \
unsigned int a;
, \4 e- w- p3 w: ^ V( ? G unsigned int b;- U8 O8 R) u! j
unsigned int packet_cout;
0 Y% A- U$ W% d" u. n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. q. X! w2 j5 G7 U* [ I+ a
! v2 h( V% |; s* V" q' Lvoid read_MSG_buffer(int *baseaddr);5 | K- D) u/ |
unsigned int count_copy = 0;
! B# q% q3 [7 z U! S) r9 P8 H: E( J% b& Z: N& _
int main()& `0 z! M* f' q8 N
{
* w O$ {0 H% e1 x int fd;
( b u% m8 y+ d5 P' r; U# ]1 @1 I int *mem = NULL;9 v" W2 L% [6 k( M! D8 R
9 C+ p' H; p; U- h* e if((fd = open("/dev/mem", O_RDWR)) <0)3 k9 m% t0 ~& V! ]8 p/ Z- W
{0 y% N9 ^ |8 u F
perror("open error");& {! \ m0 z4 @% B8 A0 ~- ^! I
return -1;5 Y" m) p/ S G A
}2 ], Y6 H8 F2 U8 e: k
- X0 V) q7 z+ v: N4 N
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ o+ h% _. I ]2 g1 g
. }9 R( U$ k! ]5 c5 l6 }, g, U7 j while(1)
g$ s8 [3 p- l# h4 \! \, B0 e {% }( Y3 M2 ~1 H# _" i
read_MSG_buffer(mem);7 x+ R! E0 g3 @
}
7 g' v B% Z7 e}
: `6 P* h% ?* g
) s/ i( f- y1 X& ? l1 ?" l, gvoid read_MSG_buffer(int *baseaddr)% x: M1 {5 |4 A# r1 N2 m, I" Z* @
{" k3 ?: [* w8 a$ j7 Q; T
pRX_MSG_PROTOCOL pshreRAM = NULL;% ~0 b1 ^4 r+ \+ e; d
/ r- F- r U. ?% A( ]+ X pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: W; l/ o9 d$ M' _& f( P2 V. n; F
if(pshreRAM->packet_cout != count_copy)& k3 F) Q2 T2 v" L3 Y& y# U
{! r8 W* E" @! q" Q4 j
printf("a is %d\n", pshreRAM->a);6 t9 f0 o3 p) z8 W; K) c. p) Y r
printf("b is %d\n", pshreRAM->b);5 y% p" I. W$ S6 E- P1 S, ~
printf("count is %d\n", pshreRAM->packet_cout);4 N4 e- N# z2 T, ~ z% U
count_copy = pshreRAM->packet_cout;
( T6 ]9 b7 ]9 G- {! {& Q }9 k6 h3 p( q9 G; t' Y
else
: n- p6 E/ P' X: a+ c9 C {2 s" B- H0 R! X+ \ K
printf("No effective message!\n");
( {+ Z7 v$ ^( M6 T7 D }
+ N- M" Y% D9 m4 Q8 w J% ~9 E. |}" e: E9 `" J0 Z; o: S" x0 Q4 T
' w$ q" K3 @1 F8 e! y; N5 d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# E5 Z0 U* f3 z( P$ _9 r5 _1 b4 J/ T
! {9 l+ H; O! o
" O, M, l: U; A8 V# Q* `& X
( P6 A( v! J! _! J% e |
|