|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ N8 B* K" }- B- q
# h/ ^% ~2 o' n- g, oOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
Z. O" P! H( i2 D+ _7 Y#include <unistd.h>+ {$ }0 `% x1 z& a- z$ R+ A
#include <sys/mman.h>
) Q1 I4 E" q: O$ x#include <sys/types.h>
3 @' C+ B2 N$ a* ^2 L& P#include <fcntl.h>$ A/ H: d- q3 ~
# T* a% b' c, _#define SHAER_RAM_BASE_ADDR (0x80000000)
) {4 E: ~, ^, [0 F5 H- @6 E7 I: ?5 H1 N" q* T2 f
typedef struct
$ t' s; @" q3 n4 _, G4 C$ R{) i7 P1 ~0 {5 x% K! l8 o, d3 J
unsigned int a; D O% y% y- o% {5 L
unsigned int b;$ B: x5 g4 K# h9 Y# ]0 ^8 a7 m) y
unsigned int packet_cout;5 W, {6 j* F( C5 L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 J- ?2 b& d# _8 ^. o) c/ ]/ K7 L0 u+ F, N$ w/ t- G9 ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 a# J. a+ z2 R0 w3 w
unsigned int count_copy = 0;; w: R. T* y9 r* V# x9 u# d
* o1 i& k8 ^% G5 n1 D8 C& |/ J8 J2 p4 G. T- D* ~+ w1 | ]* E: C( ^* w
int main()0 M/ T6 g8 H: X5 W
{$ a# M# C+ @$ e! R' f. A- i) F
pRX_MSG_PROTOCOL pshreRAM = NULL;# N4 e( V& ^5 [& l5 h
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# w0 B* m0 z# _' i# D& a0 n. |9 l
5 P' p1 |% W+ t/ j while(1)5 H( h; d N$ E. X6 T- b9 N) _. b
{
3 _- u0 k& h, x8 s# r* ]' J9 w' k read_MSG_buffer(pshreRAM);
( H* m8 Y( h5 z } 0 s R3 @4 w* U5 D- Y0 a
}
3 q) f+ a( C6 k2 f+ n A1 t9 b
' i* O+ a4 u% S0 l6 Zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% \6 h- G( K+ o$ T{
7 t* q. E" o7 O RX_MSG_PROTOCOL buf;
+ N9 f1 p/ D. I! [- q$ c
8 }$ w6 @# Z) `) `& ^' Z- a" q1 [ buf.a = pshreRAM->a; g3 T. }0 B9 n$ x" t4 |$ U* b1 I) S
buf.b = pshreRAM->b;$ S$ w% H( K6 d8 d+ Z
buf.packet_cout = pshreRAM->packet_cout;, f0 ?4 v! ]1 x
" H8 m% k- r3 H7 I: G; z) J+ i% \
if(buf.packet_cout != count_copy)) K7 h9 t7 C$ P8 _% |" Y
{: W+ {% }3 E F6 S4 G
printf("a is %d\n", buf.a);
9 X: h8 r- T- Z printf("b is %d\n", buf.b);% K- L8 V9 d; z2 S' ]; T
printf("count is %d\n", buf.packet_cout);
7 q# {7 U, U/ b6 K. J$ r count_copy = buf.packet_cout;
: W/ Z4 A+ W4 M7 Q }. L' M" n$ `$ J0 E& d# @# H
else
' H3 j7 l ?' k- \% w- `) r {- G- k0 |# n; R$ S6 r# V4 N
printf("No effective message!");+ y( a4 U3 k( M6 z w4 z1 v
}
. d! T4 _$ j( t) k0 V9 A}
: L2 o# Q0 s5 w' U2 q' }* N; l H/ f8 b$ ?; B! d7 Y
6 }8 j* F7 @$ U& T% {0 ?6 C但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 h8 n' D0 i i
使用下面代码,对内存使用了mmap函数后:
/ B) r- p' ~( }& x& ?#include <stdio.h>
5 g, I( q+ ~& `, w+ T6 U# E; z$ M#include <unistd.h>+ D8 M, [3 b! V* p* i' R7 O
#include <sys/mman.h>7 Z0 E, z _$ J% j% t
#include <sys/types.h>" B1 s/ \& O# o' L: p h/ W. K b
#include <fcntl.h>
. q) |# H1 q- l7 ~& z* G5 H5 \
: c8 q7 i" k0 h#define SHAER_RAM_BASE_ADDR (0x80000000)
* c( S0 O) x' a" n$ q#define SHAER_RAM_SIZE (0x20000) , u- M; U. E7 X9 X6 ^
, Z" E0 t$ U9 Z* O' W; xtypedef struct5 Z! X$ S0 J1 d- N1 @& \
{5 D" V M$ Y* T/ X% ]
unsigned int a;8 C8 }( o9 F# {* N8 p
unsigned int b;8 M3 [) Y( e" M d/ ]' `/ X# _" f
unsigned int packet_cout;6 i. K' X% C1 q6 ^. t) ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; Q& [7 d. E- c. z7 v/ |3 I
8 K$ c J4 @$ qvoid read_MSG_buffer(int *baseaddr);% c, F; j" l4 F
unsigned int count_copy = 0;5 p; `! N5 l- I$ g4 e
- J# s: M+ J$ v: Q
int main()
" u }6 I9 g' K9 m6 v: p4 s6 @4 V, V{
& @ P1 B1 B& N) ` @" M3 K$ P int fd;
6 o- f- u& ^8 e: d5 C9 e# \ int *mem = NULL;
) C! R# w8 z- \( X4 E+ b4 Q; v. W' @+ K3 z$ s( a
if((fd = open("/dev/mem", O_RDWR)) <0)
7 ?7 ?5 @- Y% s& W) ~2 m* Y {) J. f( e: g8 n4 P
perror("open error");
1 y; o% {8 I) c) f) J3 T" K6 z return -1;7 v7 R5 R7 u- g* R
}5 W2 S: W) {9 b
* B3 ?) C9 _0 B mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 q+ c9 b% ]3 ]: D* U* y3 e4 L) e& X
while(1)
( Q0 O/ p! U6 x% M% y {' [, ]) V- d% N6 J" s7 r- V
read_MSG_buffer(mem);; F% t5 J- s% e9 ]: E$ C
} }& `8 e# A5 q8 n1 g7 [: Y( H
}
: d$ X7 w0 O2 P+ F! O( o, k
2 b/ ?- p8 p1 kvoid read_MSG_buffer(int *baseaddr)
- @+ W8 _+ r: }+ Y6 z, y{8 Q* {; y; M% A" r1 c
pRX_MSG_PROTOCOL pshreRAM = NULL;$ o' v, o5 c1 |3 z" B0 I
, t' ^0 ^" C, P pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 i1 i1 j( q9 v0 c! [7 |
+ C; {3 o& I2 E8 m* d$ K if(pshreRAM->packet_cout != count_copy)9 J! ?" N1 k7 d# p6 O3 | ?
{
1 }2 f; z0 ]# ]3 r: K9 |0 {0 ] printf("a is %d\n", pshreRAM->a);
- R. `) c/ W2 F1 v" \' G printf("b is %d\n", pshreRAM->b);
* W% B: U8 q# t6 e7 G+ c printf("count is %d\n", pshreRAM->packet_cout);
' ]4 c- ^1 W. G& l6 `: L. y$ J count_copy = pshreRAM->packet_cout;! S5 g6 A/ `% F0 D4 ?- f0 N
} m! n2 x! K: `5 q, S) p
else
+ ]$ R: }+ ]3 X# @2 D- V {
4 |4 {0 Q3 D$ K$ R7 g, v: m printf("No effective message!\n");
z. B4 e6 X0 S; U5 I2 k }
7 j V& r+ [" H$ x I8 p n}3 g/ b; Q1 y1 |6 R4 d1 v( y; `7 W3 }
3 D, a; Y2 a- {- t: K1 B( r没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 V! Q1 t I" Q9 D# g6 g# L0 q$ _
! p3 C4 ]4 h b$ P6 P
+ v/ o5 a7 ~, D1 b0 r
3 j" ]5 v h- ?* Q/ g2 ?6 L' ]
|
|