|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) M: D9 |- ]3 C% y- z" w! B, Y9 n- L- z) W2 o: N# V# T
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 d) K0 K2 E0 D3 c( N
#include <unistd.h>0 w; s$ x+ t7 M" n' `$ ^& C$ k
#include <sys/mman.h>
/ p+ Y; c+ I* s& _6 T1 _. k& u#include <sys/types.h>7 s, ~) z( s, ~8 B
#include <fcntl.h>6 Z& Z! c9 r! e
0 m6 D! H- W: Q1 e/ k% _" v" x#define SHAER_RAM_BASE_ADDR (0x80000000) M% S. K" l: U! h2 v
- f7 M. i. \" j8 j" K. @6 gtypedef struct
! p7 x- K8 S& S7 G. ~{
, J* T& e$ {9 t+ F; P' i2 T unsigned int a;
' X8 M7 b* r0 C a+ a7 n7 S" H unsigned int b;/ t8 a s: Y9 e' e# ^
unsigned int packet_cout;6 w. l( _2 G9 u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ E+ f9 E0 ^ k4 c
0 q3 n1 M$ _8 \ }' Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
- m" \7 a3 X/ y% nunsigned int count_copy = 0;
# N) _4 Z7 |* [* k4 `# i0 k1 T0 `+ V; {5 E
4 u- M: t: N9 H# ?# o q
int main(): T$ K. D! Y9 R ]/ v
{3 h: ^( `" ^4 _) m( U ?
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 z$ e9 R+ s, `) l5 x+ D$ @# n pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 U( ]5 Q% E: q) V: x( `
, S/ J8 a$ X/ }2 s9 ^) s) m while(1)5 b1 a2 s9 J. O. F/ @
{
- n& }9 M- E: d" h5 `2 S: L read_MSG_buffer(pshreRAM);/ C% Q4 B# i, p# a8 [+ f5 h; v
} 7 Q/ i: h4 h5 `9 v% q A; `8 I
}
$ R( y1 t& ]% p5 x9 }2 M4 b# z0 r3 ~& E$ o! ]% Y1 x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, u X! U0 ~% b1 d" R{1 k( O: x, H3 R7 i& |! n1 c8 a
RX_MSG_PROTOCOL buf;
0 Z/ b. C1 ]1 ~
4 q5 u, T/ y6 x$ l8 C. I buf.a = pshreRAM->a;
; n5 r: c; y0 q. a0 _+ U: Y buf.b = pshreRAM->b;
- [- x- R* a) |+ @. N a7 B buf.packet_cout = pshreRAM->packet_cout;& E$ a7 n C2 `; Y6 O
3 {0 d# h% d. B8 Z4 |
if(buf.packet_cout != count_copy)" m8 w0 H+ e4 W+ t2 g U9 T
{
" N5 }, f7 c; \% k6 R+ ?; I! H printf("a is %d\n", buf.a);) U- V! n* @9 h) h! |
printf("b is %d\n", buf.b);
: `5 i3 F/ I9 X printf("count is %d\n", buf.packet_cout);4 ] r) \' \0 p( u1 S; G& N, i. W
count_copy = buf.packet_cout;
9 d; Z" \: f% }) C) D }5 t: ^! G( A: W( {0 w' V; i
else
) ]' F( |) @0 c/ M% N' Q {
; F* {% { \7 l+ Z! K0 e. { printf("No effective message!");
" {# d* y) r. D0 q5 ~6 Y0 z1 U }
/ J& \# @ F6 G}
6 [$ z. |' u v1 q
/ m$ a# N7 f" R( H2 x% T: q$ `) o! g7 ^$ W/ g2 r% B
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。5 F1 l& F# t8 C7 d, q* T5 \
使用下面代码,对内存使用了mmap函数后:
K; V( k' n4 i) B9 l; P0 J#include <stdio.h>: c ]6 @; R4 o8 w6 t0 p
#include <unistd.h>+ s- d1 d4 Y+ Q q$ q! s
#include <sys/mman.h>
, G8 c# ?; l0 w5 m: Y) \#include <sys/types.h>) P+ R1 r7 l3 T5 ?& X' c2 f& Q! V
#include <fcntl.h>2 Z; W2 e; Y- ~2 {% v
1 t2 h/ D* I! P* V1 p9 j
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 E9 S# L" z3 Q* h( x& R3 V: Z- V#define SHAER_RAM_SIZE (0x20000)
( a2 V' h* {4 e* n3 d/ {7 q) w1 Y) u- Y5 O' D) {7 B
typedef struct
# o" w$ E# y# ?9 A; C0 c{6 r# a0 c0 Z3 m# Z$ h- W& G
unsigned int a;
# ~+ @ m0 g1 [: i unsigned int b;! E4 U: M$ [/ [/ p4 j
unsigned int packet_cout;
1 X/ u; B4 [6 h( ^" U& w}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 \% f1 C( ^7 j" H, f1 T4 M3 u
; W& k4 c% W# e" i# fvoid read_MSG_buffer(int *baseaddr);& s0 {) E. h6 F- _
unsigned int count_copy = 0;% I& W% }/ }8 K* ]8 k% a
3 d9 o6 i/ G! t7 k. D. Y7 nint main()
& I: N% Z4 }6 w6 ?% c0 O0 |{! D2 r; M3 g% Q( H" T* h
int fd;
; _% R6 w+ }6 M3 z5 Y int *mem = NULL;
) z$ X$ _, d2 U+ D0 E- a
. P; l4 g% V4 C if((fd = open("/dev/mem", O_RDWR)) <0)
! u- D3 ~' J+ y% W3 L {1 X* D( G- h0 C8 U# F% `
perror("open error");6 y# j+ w/ q3 t0 P6 A- e4 a
return -1;
/ f' s" h( q. R, O }
: @" F& ]( q5 o, y7 b' F# | % e4 q: V: K( H* [
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 X1 X* D8 N8 F8 U i
4 i* D/ {3 W9 N. O, [# }2 n4 [ while(1)' [/ i9 K1 y/ S
{$ S! ]2 q- S5 ^- Q. G* w
read_MSG_buffer(mem);
& x3 c! A; p( ?/ q, e( ~+ \ } 3 w3 ~. N( O; R6 M7 X2 D" D$ i. B
}/ [& \: [) S4 `: n) G
) x4 m% `: }( k3 g3 A7 g9 l) E& G x
void read_MSG_buffer(int *baseaddr)/ N" i0 M0 E6 B4 j e
{
) N, n/ @5 l3 o# V1 F! e3 G pRX_MSG_PROTOCOL pshreRAM = NULL;5 B0 g& A' B* A1 f
$ f% V: x. ~1 b pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: _2 a- R% l6 Q/ q7 \) G4 w8 p( S8 e
if(pshreRAM->packet_cout != count_copy) ~- N/ x2 c5 h/ B& H) u
{
4 W6 c1 Z* z N+ E printf("a is %d\n", pshreRAM->a);
# _6 X- ?; Y; c7 P printf("b is %d\n", pshreRAM->b);, ^9 a) k# r0 c+ `, g
printf("count is %d\n", pshreRAM->packet_cout);
2 E4 d7 U) R G; w3 S* h count_copy = pshreRAM->packet_cout;
; B5 G, N+ t2 h; _: H- z9 I H }
- R/ W3 \- L9 |; m( u else
. ^( a0 H5 a1 Z( Z3 p {; Q1 {0 ?) b+ E( r( [
printf("No effective message!\n");
2 x/ j! \% [1 G1 a+ l7 i9 A }9 ^$ q0 S: l1 m4 P8 c
}5 F/ W6 b o [
9 S" ?5 P Q* A( U+ X' f0 L: D没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 Q9 d8 R6 s+ q0 {+ c) f2 y# n- w9 I4 ~
% Y* [+ A8 k% `7 O' p% h! G
& a/ {; v5 J4 K% r2 ~4 E' |7 E2 X+ s8 R) V* q6 U
|
|