|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 E* Y" N1 s* ]; w" a4 [* L4 a. H# u3 B" s5 D1 K" ]- J
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 r* F5 h: Z& X0 g) B#include <unistd.h>5 O6 K; R: b' Y' d# _* s. T; M- ]( q* Q
#include <sys/mman.h>; n0 {* \0 [1 V/ M
#include <sys/types.h>, |. P" Z6 _# L9 e; b
#include <fcntl.h>
8 V% ]$ v( O) |* M6 [) O
" t) J) X) g w#define SHAER_RAM_BASE_ADDR (0x80000000) . ~& ^( U# U, T" q* y
! C6 q m# k# {typedef struct6 [, @2 J- D4 @4 ?
{
8 `& X( _! q2 K. _1 o1 B unsigned int a;) g3 I$ n: J( T' P
unsigned int b;+ J3 X( m, E6 i) v% w
unsigned int packet_cout;1 }# y% h: }% n! S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ R4 f3 d/ x* {$ m. b
: `7 W$ X7 X, ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 C' I+ `& \. g& P" a, @unsigned int count_copy = 0;. X6 C9 S [) W/ Z% y! H1 Z7 p
% s9 w$ U/ @0 j! K% |+ P6 c, g
% E' h; U) v/ J9 G! ^0 e7 Z2 P% Uint main()
7 G: N; N, p4 L6 x& L{ i/ W1 H: E+ Y9 I+ J: S
pRX_MSG_PROTOCOL pshreRAM = NULL;
. D3 \- X! P) I# i1 L6 B pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% }) B; H! O; Y K: _# ^6 ?
! T6 B* g& Y+ y; d, n
while(1)9 N6 k; n! z$ u8 u
{( T- \ ^/ D! W) b
read_MSG_buffer(pshreRAM);
! o/ `: L3 Z+ z( \: J5 v; `* |/ p }
! @1 M4 w4 S% g}
2 b I, b0 n6 ^+ E. m
& n- G' ?8 Z/ m6 i, S0 N" o, bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 A5 B! K7 f: \( @/ r. N' p$ B
{
- j u& D( A5 n RX_MSG_PROTOCOL buf;
. X8 K+ F, @5 j/ \) w, G+ X7 U
& q1 q' L% h7 Q4 p0 C+ M5 c buf.a = pshreRAM->a;* A+ W0 s: k' X8 m0 j
buf.b = pshreRAM->b;
, k, v% X' L9 J$ e/ }: v; c buf.packet_cout = pshreRAM->packet_cout;
9 P3 L- f- R2 D: i; _ ( M: m) {! m9 H& o7 _
if(buf.packet_cout != count_copy)0 ^0 e8 P9 g$ D0 a: ]
{
P6 r o0 r3 j printf("a is %d\n", buf.a);
" w6 A6 t* b/ b# O; }. u% c printf("b is %d\n", buf.b);# w: u2 i& K: }+ P
printf("count is %d\n", buf.packet_cout);
. H: P; S l% _ count_copy = buf.packet_cout;
' n! Y3 S6 m1 [1 q7 y* g9 V }3 |/ L+ n% A: t" ^
else# w' K& H! r3 }7 i" h- C
{
0 E. o2 w, Q/ j; o printf("No effective message!");
8 G5 W/ Y( a; J! p; U3 f1 E }
3 P* g- N( ~7 K. K6 l}
, y; A9 w/ L5 ]5 d" [, z9 _9 A- F/ i
& R* v5 o5 k3 i0 Z; E+ O但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( J2 p* S( @* z
使用下面代码,对内存使用了mmap函数后:4 k/ h6 G K4 A$ H' W
#include <stdio.h> ?4 j; |9 A6 P1 s0 ^5 F
#include <unistd.h>) C0 f* ~6 m+ \( j& R6 t- f
#include <sys/mman.h>' a6 E; }% s. a& R1 S
#include <sys/types.h>
8 H* w% }- u' x7 T#include <fcntl.h>
! h; s% ^" a# T: ?9 w+ D
. k! u. n& D0 X& Q* T2 Q! @#define SHAER_RAM_BASE_ADDR (0x80000000)
; }7 ?5 Z; B# _3 l#define SHAER_RAM_SIZE (0x20000) ! ]) H- c2 {4 k5 I7 S3 l9 M
$ e* v- g+ F( E5 Utypedef struct
z5 k9 O( U5 V+ p4 L{/ o" z, S( R, h8 L
unsigned int a;4 D9 T; V8 K. Q; Y- c* J
unsigned int b;$ Q% U3 u. ~! K; z! E
unsigned int packet_cout; G* K9 T/ _) @$ I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( X4 V! F$ n4 _8 \5 c. T! |6 w5 q+ P6 y F/ i5 Z$ h2 H
void read_MSG_buffer(int *baseaddr);$ z' d, N' @) v8 I
unsigned int count_copy = 0;
: i2 C u1 N, E' \4 {4 ?; M7 j6 n/ Q& y* y3 G% I& B r
int main()/ x. n" y& A% f" E0 L# E5 |
{
8 F* ~" n# I! Z, L9 S+ b/ R int fd;
9 O. O- D, [/ e0 W! y1 S( e int *mem = NULL;
; }7 d1 T M2 d- `; N9 A7 a
3 {( k7 }. Q2 s% ^ if((fd = open("/dev/mem", O_RDWR)) <0)2 g5 [3 n# v! V! K- W
{& n; O5 \5 ]0 a* K3 u( v+ c/ `
perror("open error");
8 m0 `) [% Y9 @% s- r9 D! _ i3 l return -1;
! J: h0 R- B d, B! X$ v3 w4 E }, u6 S% |* \5 H1 O% X& J
\; H3 D" n! V7 g8 | mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( j. q3 ~7 ]5 j: a
+ F5 ?- r: W7 ?+ m& a/ x, e+ C while(1)
. a5 x9 O' b, p3 |# Y6 O3 Q+ e {
3 T k& _; ~2 \. @ read_MSG_buffer(mem);
9 J8 ]9 Z9 l' e* E$ h }
4 q9 P4 \) v; G3 y% p! D3 }) I}( C* m; w A5 u3 V
; Y+ L: A" t$ c( _
void read_MSG_buffer(int *baseaddr)) H, Z5 ~. i2 T
{9 m$ {+ K" ?2 T+ ?8 j0 P
pRX_MSG_PROTOCOL pshreRAM = NULL;1 W/ U2 d1 ~1 x, t' [/ \
4 @3 I& q) g& B: L; F8 U1 a4 Z
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- s8 `* E% ~7 _+ \( B U% o0 N3 b/ q, A6 @& _, h5 {: t
if(pshreRAM->packet_cout != count_copy)
" s9 E* s- I, b3 i% ?( }" G {( K0 \% T Y) _& ?
printf("a is %d\n", pshreRAM->a);
3 ~6 V: U R' z0 L! x8 c% X printf("b is %d\n", pshreRAM->b);
- O" u4 @" }3 b, }2 E( _, r printf("count is %d\n", pshreRAM->packet_cout);
0 q7 D G3 }: Y; h5 [; W count_copy = pshreRAM->packet_cout;
% \( A; N! V: f4 U }
& Y- q' g) o, z( d else0 ~ x0 D# K6 X2 @! N1 O p
{
; v3 T( k. L1 w. O a4 h: k printf("No effective message!\n");4 Y* Z' e; i* q4 K+ o) K
}
: u! Z2 l3 A$ l6 |4 v. U# q0 ~}* ~( X0 o1 b) a1 \3 E/ l
7 g5 Y$ \2 v/ c
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
E( i/ h( D7 V0 x$ b0 h8 y; l' \9 K3 U% ]
, Y' ~* i/ B7 J% \% b8 }; [8 @1 y4 a! P" b+ p. x
; k* h c8 f% H8 T |
|