|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . N. ~- S: R, X0 C
2 w& r# S/ ^+ u$ y: x! e/ K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 l/ e$ M1 g3 S% \$ N#include <unistd.h> Y! H5 t/ F( [$ D
#include <sys/mman.h>
" w3 y" [6 q. r2 t3 U#include <sys/types.h>
. l. Q( a( z! I4 e- ?: T; D' _#include <fcntl.h>" B- {+ [9 @& n' x0 z6 \4 N9 `
5 {; e5 q h) A6 T$ o#define SHAER_RAM_BASE_ADDR (0x80000000)
) S; w3 i6 D7 u+ X O5 V4 X o- h) L5 `' ^" K. W8 n
typedef struct% f0 r4 M5 I: \) N" M; {
{( H: K* I5 Z2 c; K: w" S& }, Z- U1 n
unsigned int a;( {& C7 j5 N) ^: E8 x2 w
unsigned int b;3 U. c( H5 x1 J; v7 f+ Q
unsigned int packet_cout;
6 l! V _( e' g5 P% P8 j8 V3 w7 Q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 F# [7 Y3 z5 T8 o$ y% Y' t2 V* D, H+ p& Z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 o- e" T# Q! k3 G0 w" l3 }unsigned int count_copy = 0;7 O9 c6 q) _- B
9 M* y- ]% b5 P
) @! k2 x4 n+ N, ~: uint main()
& s* a2 ^$ x0 s6 s6 D{$ C) k( q9 `. M, @
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 E- h; T) \' F; S( j pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 Q0 n2 F: i- m. }% A6 P. o" M. r) ^7 l. ]
while(1)) _7 n& u3 H5 h: e: k
{# @ m/ U. k( L# z6 H- I- y
read_MSG_buffer(pshreRAM);% N0 ~ o. A, }/ R
}
0 ^9 U% C$ q: N! d}& \" i1 i& Y! _$ L
: i* D5 c2 ]8 X t) x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 d7 S! Y6 M' ^' i3 j; I
{
, j( }1 E4 e4 p1 ?4 ^0 P$ j; O RX_MSG_PROTOCOL buf;) T7 a; m }( G r5 y. R
. Y1 c% ]3 B, \" g. ? buf.a = pshreRAM->a;
, z7 j8 Z! q5 _; u( _ buf.b = pshreRAM->b;* Z+ k; S1 q- O, B
buf.packet_cout = pshreRAM->packet_cout;0 ]6 g- n. W( p# x k, L
: ?- R- H$ _& D' ^ Q
if(buf.packet_cout != count_copy)
* x7 u5 J; _' N( m( A+ a1 m {6 {, w5 B# X, d, }* r K
printf("a is %d\n", buf.a);4 C% O' v8 x8 Z5 V2 j7 J1 y2 p* u
printf("b is %d\n", buf.b);9 E5 u. E3 @# S% [3 ]% b
printf("count is %d\n", buf.packet_cout);
, t+ _) [( ^8 ~9 a count_copy = buf.packet_cout;
& Z, a g- t# w9 _" N' b: x3 @ }/ Y: ?2 c& C- m# ^
else4 I0 j9 E5 }4 U h% M7 v% F
{( ~6 L1 \/ g) Q& b; h/ u6 p4 W
printf("No effective message!");. \3 j+ Y! z1 _1 X9 l
}& d% {2 z0 f! y3 s7 {4 R n
}
. a3 I' B W0 b9 c% d$ c l/ a% r6 m& f5 U6 Z3 P
. N' `2 M2 Z4 K8 q9 C8 @
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ p- V/ N- z. W% U) T
使用下面代码,对内存使用了mmap函数后:
0 L! H, x! t/ w, I; v9 @% N#include <stdio.h>5 r* D, b: F t, @, A4 A1 F
#include <unistd.h>0 Y$ \/ v$ Y$ t8 d0 O
#include <sys/mman.h>5 L' K: ? Z" M
#include <sys/types.h> t# {9 Z$ a: u5 ~1 |2 J9 J
#include <fcntl.h>& b3 j2 S0 _ z. ?: }
4 a) k$ ?: Y, n3 n" K0 Z$ E
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 \" I0 v. @# ~) q! Z3 X% p0 @& i2 J- r#define SHAER_RAM_SIZE (0x20000)
8 H9 j9 z( F" ?8 A, r( X& ^ o7 E V. [2 {! s5 W* U; X* @
typedef struct; K+ \1 Y2 b; p( X- J* g& o1 f! ^
{
, W( a- x3 [1 d* V unsigned int a;# e" L1 X/ j, n/ s9 O
unsigned int b;; C; n+ m4 h: s# s
unsigned int packet_cout;
/ R& X [% Y p5 L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. d7 ? O) U. k$ P# Y; @+ V
; U$ |, b; }! S
void read_MSG_buffer(int *baseaddr);
: z8 _: j0 q7 y" C# E2 \( ^3 Gunsigned int count_copy = 0;
+ ]: S& [- K, Z: i4 v1 @0 _) i C; F* e$ S
int main()' t9 y0 s) Q6 C- a! K8 S, C. g
{) h8 l. A s. D! D' U+ _
int fd;
6 y) A: R% p2 W int *mem = NULL;
( S0 @& o4 Q( a; ?, }4 v' P1 L
4 S5 ]$ Z6 R4 K( j* X0 z' Q if((fd = open("/dev/mem", O_RDWR)) <0)
; |* M9 ~- S/ y6 i) I1 s8 }! d( _ {
( c% U2 P1 l1 a$ z( E perror("open error");: }0 ~$ `( D6 `6 r E
return -1;! E a# L% T; \- S+ U7 J5 U7 w; I
}; D( h/ C, C; W! b5 w1 L3 Y
# `" d: Z( l- U3 L/ L mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 G; n- X- `, A4 o
- ]0 p5 g0 Z9 R/ h! r
while(1)
6 k) `' G3 ^5 o {
2 s) k) ^/ P7 T7 U6 h read_MSG_buffer(mem);2 s J6 w7 ]: T; M- ?: ^
} 0 v: d# p8 ~* s- H, u+ o
}$ W7 } |$ X) O( d- t' \! m7 l
* M/ m. v( f/ w5 G5 I$ Pvoid read_MSG_buffer(int *baseaddr)& g4 i$ t4 M/ N/ D4 y: @
{
- T) D. Z8 N5 t/ B' f: l pRX_MSG_PROTOCOL pshreRAM = NULL;& T" e6 O) K7 {7 F# Y
5 z. l" D& r/ m2 D3 h
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* O* u, D" c% d3 b ?0 x# G
" r$ ~" d, t" g if(pshreRAM->packet_cout != count_copy)$ t/ s- M5 _. C
{
) D; N6 H# P" e& l1 A8 F5 q printf("a is %d\n", pshreRAM->a);% R( A. \. H) ]$ V8 Y* f& ^
printf("b is %d\n", pshreRAM->b);) M5 m8 y/ }" G1 v$ x
printf("count is %d\n", pshreRAM->packet_cout);
W* i! u+ n" U- w" L) `3 _7 D( x3 ] count_copy = pshreRAM->packet_cout;7 n5 v% h( W8 D
}
I; }9 I* y+ l8 } else8 R% \/ x! {5 f' ~9 h3 Z
{
B% E6 f- D z2 O printf("No effective message!\n");
8 d- v+ B! u7 {& x( d: p }' q8 K; T+ P7 i+ l: \
}
; L1 v' o3 C" [ ~) h- Z7 q$ k
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 a. v' V/ f3 t X1 o1 ?9 n8 A) g4 C; z' m4 k' t6 [& r q
! k* b! ^" I1 p, ~6 t c
! {) {! o, r! c/ S4 B9 K
3 F0 u& N m! n3 b1 i/ K+ d |
|