|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , U0 ^6 B* W/ A' _6 e c- r
! |3 I# I% _- f. S( R2 W
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 P: N, s) p3 U& \4 M' e8 f: i( l#include <unistd.h>
- L: t2 z4 x- u7 I) Z. N#include <sys/mman.h>
( Y7 T7 _; B; g) x#include <sys/types.h>
1 C1 R h6 p" J% }9 \1 c6 T$ J4 b#include <fcntl.h>0 U5 U' ?) H, d0 {# Z5 u
8 E y/ I; ~/ F6 F#define SHAER_RAM_BASE_ADDR (0x80000000)
& W! W% u1 x0 N% z( ^# _3 Z8 @8 h4 u }, j ~1 j7 u( }
typedef struct
: H) B& V, h7 h5 v/ ], K{3 N2 U2 I8 x- ^; i; _. P D; h
unsigned int a;- b) T$ G% j2 u- r0 t2 Z; n4 L
unsigned int b;
8 w3 I6 x, ?) X) |' K; y6 r1 [ unsigned int packet_cout;0 X: A# m2 l" ^# L. Y4 |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* r8 j7 M* _9 X9 ^5 g/ s/ B
4 k* y; [) K" B6 ]# Avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ @* P% b. }6 ?( g( R1 ~7 r8 ^. R0 ~2 ^unsigned int count_copy = 0;, e8 Q* U7 t, t9 s+ O* g( R
! \& X( I: H0 E1 |7 C6 _% d
, Q! N! d" v: r3 }; l, w, j
int main()
" u2 ?" x! x% F# O, I- s, f h{5 v5 K/ F" q' m$ g0 ]
pRX_MSG_PROTOCOL pshreRAM = NULL;, i1 Q& I# t% k# u; E
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) ]' e% j+ g4 [# W
8 _" b$ t1 J+ ?& s8 y% M while(1)
$ R S0 {5 O6 K {) g5 f( }, J, _+ |* K! u; J
read_MSG_buffer(pshreRAM);
; c( N. [2 h! Q% W; m6 J }
9 v- ]# x! Y. f8 J# d; y" `' X7 K}
5 _' W, G2 F4 Z7 x% t! Y. [* Z3 ^8 ^7 J8 C9 b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 B. X- [( O8 o+ ?/ O7 E+ b{+ v1 M( S# A% j U: ~
RX_MSG_PROTOCOL buf;& m! B- H$ w9 ^! a r8 j) W
2 m& U3 F( |3 R' }9 I buf.a = pshreRAM->a;
; p5 N4 k6 e6 p" I- u7 `% ]* W buf.b = pshreRAM->b;
' _) u$ `6 S* v buf.packet_cout = pshreRAM->packet_cout;5 @6 o" l4 |) h
4 z& [6 o' {8 T6 z# M+ Q: ~ if(buf.packet_cout != count_copy)9 L/ }: e& ]4 a+ P8 T7 K- D4 d
{
$ v7 W2 d$ i! D I: _: i1 _6 e printf("a is %d\n", buf.a);; H' ^6 g y* w3 u( L
printf("b is %d\n", buf.b);7 u6 L: a: f3 |2 i3 D: J! u
printf("count is %d\n", buf.packet_cout);" x. x5 [' p" W" L# U, {5 X
count_copy = buf.packet_cout;, P4 F( X1 X. h4 A7 H
}6 ?2 {. ~# |! r
else# O" L( W8 D2 t9 c+ A9 }
{
5 b$ a; W! n& A printf("No effective message!");
8 P" m% c# H4 L* V2 W1 k w0 F }! N$ Q8 M- K3 X' g @ U
}7 h2 q1 v0 k) `7 \" |
, g" t# m% J7 Y9 L8 S
; p0 j0 X+ L" o6 m2 L! O6 [
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ |1 R, X" I9 ^4 M5 A7 ?/ P使用下面代码,对内存使用了mmap函数后:( n: X7 X% G. |3 X2 t8 I; j
#include <stdio.h>
2 x- ~- T: L% o- Y! d#include <unistd.h>3 d% c) L6 \. B6 ]& V
#include <sys/mman.h>
, ~4 f2 v J$ K( }: H9 \' F#include <sys/types.h>& e/ u% E# I w) _# w
#include <fcntl.h>
! v; F9 W5 i9 K' k
/ A! G7 x* |# L4 Y6 B9 b6 B3 [6 M#define SHAER_RAM_BASE_ADDR (0x80000000), i, S! _! u+ q- i- _
#define SHAER_RAM_SIZE (0x20000)
2 I: o/ j2 c) B+ i2 ^" }6 k+ `' n' B& {9 ~8 f( m- d
typedef struct
; p! G! Y7 ~/ B{
/ `# V: z( k# P unsigned int a;
9 V, ^& W: o/ x. V) h8 s unsigned int b;0 P5 G U% R t! n4 n/ T0 A3 o
unsigned int packet_cout;
# u+ ?- e) }" { A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" R! a% q1 w* s7 t: w0 A& W% Q: H0 b/ s& U( N7 U8 S& R2 k5 O5 P; k; ~
void read_MSG_buffer(int *baseaddr);
7 H+ `# ~( S9 _7 Iunsigned int count_copy = 0;
! W7 [4 x. U+ J6 p) H, R x
+ m8 w. ^/ B% s8 }! f+ Y0 Wint main()2 o0 S, H& r5 z0 I* g
{
( p; I5 z. ?. v4 m9 r+ a+ [7 _ int fd;8 d( c `* W8 D" r% C8 v+ O" C" B
int *mem = NULL;, }; r" n+ ]# F3 F4 n) V" n2 c0 s
6 t$ J1 K6 z: ]+ {$ @" F
if((fd = open("/dev/mem", O_RDWR)) <0)1 {7 E; o2 u0 p' O+ }3 Q( a
{9 T% a+ p& L8 l) \ c1 ~8 l7 |
perror("open error");
5 i/ A7 V6 g0 s" y0 Y return -1;
}' \8 a$ z+ j2 c$ j) T5 c7 V }
. _ v4 X3 y' G$ T8 I
( c% g5 l. O( d4 i mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. n' j0 [- J$ A& C( G! v, B+ r1 V7 }8 J
while(1) ^+ n" g1 u2 G4 `& J# K4 _% P
{ [6 { D" l2 G* r
read_MSG_buffer(mem);& S7 s5 R+ J2 o' ~7 G: q) A
} ( s* o3 z' u& a% P5 S9 {# `
}
2 Z' W3 Y- c- p8 \0 |
q# }* S7 Y* Z0 b9 [6 |1 tvoid read_MSG_buffer(int *baseaddr)
* D: [) ?. Z- G6 f% K{
2 J+ J6 \. L( C- x. m5 e( Q# g2 h pRX_MSG_PROTOCOL pshreRAM = NULL;
1 J2 h" s, |! x R* @( m/ P2 z7 E/ p* k7 Z. z
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;) ^. ^" T' o5 f, @- t2 B* ^
# X7 Z) ~$ Q( w0 g) s9 O7 I0 O" P
if(pshreRAM->packet_cout != count_copy)
. U6 Q6 F# ]: i5 H% T0 F0 O. b. _4 L {* r* V! W9 m" W, ]) Q) V5 G( B
printf("a is %d\n", pshreRAM->a);7 T( R+ ?% G% Z4 N1 c0 L
printf("b is %d\n", pshreRAM->b);
$ G$ [; h) Q5 q7 L+ k( j printf("count is %d\n", pshreRAM->packet_cout);
8 I" g- X6 K/ }8 N5 A5 o' d5 c count_copy = pshreRAM->packet_cout;
9 w# Q( _2 a1 c4 r: w }( P% y+ R5 S4 p3 g! u
else
$ c% w! p3 n5 y, F+ Q' Y {
9 o: ~! V/ ^/ ^' Z printf("No effective message!\n");
0 Q/ z' C, y- o }
9 ]% l6 l O1 T* x4 s X0 Q}
% e) |. ~+ G! l* e v! }3 l* T9 i" ]& s; L! d& I4 }4 P" ~
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* h1 }& }* ~' M; m4 `8 y
s) M" m$ }* w" n3 ?% P- i1 j1 d; m
" P" c/ D* D% O8 r2 c/ {# b) T6 b" N+ q9 u
0 F4 l( G9 P( |% _# I% s& N |
|