|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' j3 C" W0 _, ]9 b
+ g" m/ G& X5 k3 GOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* G+ u) S7 j% C" a2 p: A
#include <unistd.h>
. S8 S# `7 W! K#include <sys/mman.h>0 |4 |8 K" [( i% w9 G
#include <sys/types.h>
) l8 `+ ^! U. T2 [* u7 T9 l#include <fcntl.h>: F) b7 W) T# E7 E2 y l
0 ^; x- {2 o% o. D' I- ]7 U5 { H5 {# G
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 e& M2 s$ E n% S! |( L
8 M( S/ l2 Y- ?! _0 ftypedef struct$ g- B0 Q0 E: x. _) b
{. V k0 V, x/ l! m+ f* G
unsigned int a;% }# ?& W7 a- n& ]
unsigned int b;
6 e' v! X+ D$ |/ h( y3 X$ c unsigned int packet_cout;, F: j; L1 w0 K+ g6 I; N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 F; b; O8 i# T! C9 G3 z! O) l8 e. z+ ~& A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 `6 T, A% }* runsigned int count_copy = 0;
; d6 u7 g2 ]7 }7 Q/ R* H' a7 X9 l. ~7 F6 R& c4 n3 i
$ U, ~& e9 c, u8 u/ n" a5 Aint main()
s5 U9 o8 i! k O9 _3 U+ i{! Z8 U' t0 T$ e
pRX_MSG_PROTOCOL pshreRAM = NULL;/ G3 P# ?! }" t' B( ~7 X. V
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 W) I. ~: o/ A0 F: W% U
* r- N! \5 z" W/ h while(1)6 T" @. U4 Q, R9 ^5 A
{
G! a4 u$ u6 b0 k9 {9 [( |( U read_MSG_buffer(pshreRAM);
/ w+ c7 g+ S h% l }
; r2 t7 k6 P9 |4 F+ H2 m) w6 X( t}
/ H ~& r) b0 m* O; d$ C2 ?% ` S- {% f& \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& l# v: ?* B( g1 N
{- I8 g) F. s3 f7 y# m* J. c. `
RX_MSG_PROTOCOL buf;0 j" M$ A$ l; F2 u4 o) l9 O* M0 n! ~
4 r! D, @* {3 w1 b6 ]$ o1 C5 d buf.a = pshreRAM->a;% n; k3 N" ^. @& s% T2 @
buf.b = pshreRAM->b;) i2 H. c0 C& q
buf.packet_cout = pshreRAM->packet_cout;
9 U8 Y; l# L% b5 w6 U & W8 x- h# J% l" H/ T) q
if(buf.packet_cout != count_copy)* L$ p+ E5 P# P! I0 ~3 z( Z
{
1 Z( T7 R' o$ o6 q1 O printf("a is %d\n", buf.a);4 M$ n7 W Z/ Z E {
printf("b is %d\n", buf.b);
9 L: t! S7 i/ v& _3 G( z printf("count is %d\n", buf.packet_cout);' J9 ^4 j: d3 {7 C5 v
count_copy = buf.packet_cout;1 k1 J1 D+ V, Z: v# f
}" Z! L( [5 z; D4 W6 k" z) y
else
( D1 Y$ l7 W m3 h0 U {
( x1 |1 r' C, t) P. C* j printf("No effective message!");
% @2 T2 \- B, D }
$ L$ a( M% L$ S3 Y- n" c5 _, S}3 T. y7 m. g% t+ Q4 w, i6 {
z4 p. F8 K: m* T0 G2 J% E. ^$ Y$ ~+ _& ~* ]: g
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( Q# ^7 |! t6 c& x0 @( d+ U+ u
使用下面代码,对内存使用了mmap函数后:( ~$ r( M0 H8 \) F
#include <stdio.h>
- S7 B3 C1 \# P+ B. S3 E#include <unistd.h>
# f; V( W/ h. J! L+ W8 k# y- S#include <sys/mman.h>) e9 p9 J: L2 ]$ ?- @$ o
#include <sys/types.h>$ D& Y) K7 [2 p7 l8 p9 k: {
#include <fcntl.h>2 S" s, W; l @( A) o( D. F" I
c! u# X2 Z* N+ L$ f
#define SHAER_RAM_BASE_ADDR (0x80000000)+ w/ X4 _! i) ^% A) ]4 l
#define SHAER_RAM_SIZE (0x20000) ( b. T$ q( D- w6 @
- L& ?4 y9 g) G. t( G! ]0 i2 s0 T
typedef struct
, x w; V9 b: n) `4 z{" w! \$ P3 p% r1 j
unsigned int a;; M9 |8 N0 a* e) C$ V
unsigned int b;, h* Z, o2 k. h
unsigned int packet_cout;: R; t( j) _3 A8 o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; Y9 v6 h7 v& Y: C$ y
# u/ `5 M0 U4 uvoid read_MSG_buffer(int *baseaddr);5 ^# C4 J+ ?+ M/ |5 f8 ^8 X
unsigned int count_copy = 0;" e0 J5 \$ f8 X
+ P9 f& q- F$ B* m; N R9 g0 _. I; T0 [
int main()
' o i- d( f4 w) w* K; X7 ^{. p( A5 X. o) {9 U: Y; @
int fd;
, _) r j1 l/ e; |! q% q7 H, _8 u int *mem = NULL;
; s/ Q6 H4 n3 s V' |% X* [" [. }9 _7 e8 s( x# |
if((fd = open("/dev/mem", O_RDWR)) <0)
; b0 L$ ?7 `5 D5 R, N$ I {- m9 [; j* m$ @
perror("open error");
, a7 n+ I* M: t: e) v) R* _ return -1;6 \2 s" @* {/ Y9 U3 L! L% D
}
5 d* D' t6 w6 Z0 G1 }- s
% y, C$ Q+ R) `+ o; S. t2 m4 Z mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);* D: S3 |1 |* T ?( W/ D @( V
7 _, E \/ ~ G: I. K1 e while(1)
1 G6 p0 e5 |/ S m7 h r9 e {
# E: |( m* f, q' q/ X read_MSG_buffer(mem);
+ E8 I1 A! \; [+ ^/ M% y } 2 t# I/ B5 M" _
}
1 z4 V1 d! t8 p4 W; U
4 n: M$ v) [& M5 Kvoid read_MSG_buffer(int *baseaddr)% z! G- ^- E. Q+ N6 _5 L
{
( M5 ?9 C9 F* e: W. B& K pRX_MSG_PROTOCOL pshreRAM = NULL;9 U! t! P- p z" h
9 @# S! _+ y7 p' j* _3 f1 j% Z pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* U/ T! E- E! D2 z0 w9 z6 W
! O4 [" D0 f4 G) z4 c
if(pshreRAM->packet_cout != count_copy)5 P3 }0 g7 _* y, @8 o
{
: h' W& E; b Y+ b2 k printf("a is %d\n", pshreRAM->a);
9 s5 _6 R \# e* E: P printf("b is %d\n", pshreRAM->b);
5 Q7 J$ }$ k7 o printf("count is %d\n", pshreRAM->packet_cout);2 H7 G% _4 l" p1 P% z
count_copy = pshreRAM->packet_cout;
9 }4 @0 K" N) S }
% u3 O+ _" o, L else
; p) t8 _. O# W {2 m3 L! d* H: A0 v# x. a* C
printf("No effective message!\n");! u4 {! M F' d% u
}/ P$ y8 W/ ?, t, {, G% u9 h
}
X# x7 F1 ^8 I# O: }" @0 v5 o7 c' A& ?( t# M3 ]& x: {) }2 u
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 Q! D# s! ?5 P/ s0 [. L/ Q4 k- P8 n! v, |8 d% C
& N+ k% s; }& j5 d3 ^ Z
+ A1 c5 y9 d a1 `
% u6 }% O& c4 `7 Y9 B: u1 y5 ` |
|