|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " n3 y; w5 B s8 y- y3 F
9 h8 k' d9 n R$ J8 j
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" Q6 `. ^5 a- E: Z# x#include <unistd.h>
/ @) P3 C5 O: k$ J#include <sys/mman.h>
" V5 T8 I: ?( ]& |0 _#include <sys/types.h>
3 r; X; _ j9 t l. P1 l& m% [#include <fcntl.h>
9 R* K% A, B) W |9 ^
+ Y, F% L# C2 P3 h, S#define SHAER_RAM_BASE_ADDR (0x80000000) & |: ]+ l; V) Z! A* `, } }
$ p- H& q4 ~- y6 _3 {0 q) s
typedef struct
: G: O5 ]( O1 a2 ?6 ]{
e# a. N5 g7 z% ]9 H5 f unsigned int a;
* V# y3 w5 Z! I1 I: m unsigned int b;
7 @; Q, {, v8 u7 ]' T' a2 S unsigned int packet_cout;2 C8 Y& j" Z% V. m5 {3 S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& h5 x1 m& y- U8 ^& O( h" g0 g1 ?
# A3 Q- @- W3 N8 Y9 j# a. r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% P) Z( I1 Y& K8 h0 U; p/ p. X
unsigned int count_copy = 0;$ f+ P6 L, Z- U& Q) g1 d
1 \7 a0 K5 \- q5 f& G
1 n& k& p% Q3 q4 w. V
int main()
, Q3 O! A& d& j' c{7 [2 p0 b9 ^( I2 u6 M4 X; [. C
pRX_MSG_PROTOCOL pshreRAM = NULL;- w: H, Y+ H) V2 n' X( }. B( M0 o
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ |' a/ P, n- E) y, {% Y
( M0 P1 n) d& N9 y
while(1)
$ c$ r# D; B) ~' J; X& f# B {) u ?' T: {% ^0 {/ R% g+ u- [5 k& E
read_MSG_buffer(pshreRAM);
& O' u5 `: J) D- n- [1 E! ]$ k9 w( Q } : y" r/ |% {+ I* x
}+ e# T. U+ w) { O0 Z4 d5 I
6 m- l' G$ Z! w- k5 Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* g* L7 A" H7 h( h2 d' \8 R3 r
{) |) @3 [% W2 [6 R0 M) z
RX_MSG_PROTOCOL buf;8 @+ G/ G" w2 U; v
3 q. A l# n/ p; c
buf.a = pshreRAM->a;7 R: O, e1 T1 g3 L b
buf.b = pshreRAM->b;
# Q- B# i6 i) G8 m6 J* U4 }" d buf.packet_cout = pshreRAM->packet_cout;
h8 g+ D" s8 F5 H
; w- k, v; O* R4 Z% S& F) N if(buf.packet_cout != count_copy)
P) f# Q& a) h7 _3 q {
: C/ s% u0 a, @3 v n* c printf("a is %d\n", buf.a);
4 v% n) U( U1 O2 q printf("b is %d\n", buf.b);3 k$ B1 [" |" L% c
printf("count is %d\n", buf.packet_cout);$ Z$ G- j P! \/ n# G4 n% X
count_copy = buf.packet_cout;' M5 o( n/ ]- w/ T* w' ]
}) D* R. ^% @. u% v) b2 |/ ?5 v
else9 S0 E: N5 I. _$ p& T( o5 ]
{
- y& [1 h Z9 \# D printf("No effective message!");
' [% o( {+ ?( u$ L: _+ ]$ i: E1 Z2 \( y }
/ }8 J0 w1 ]9 U( L0 n. n# D. e8 M+ c}
+ x7 @8 _& |% o0 U, y# ]
, Q$ Y2 q" l( F i6 D
: n& ^' s" ^9 C但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" N$ S$ Y2 C1 ? ]1 h1 v) g- W9 R
使用下面代码,对内存使用了mmap函数后:3 B$ d; Q3 ^2 a) p
#include <stdio.h>+ A# b. w. d5 Q0 R* w+ \
#include <unistd.h>) R L" R6 W4 L1 {
#include <sys/mman.h>8 p! J I7 g- B
#include <sys/types.h>/ I1 e/ k( m: i9 c
#include <fcntl.h>4 r$ ~! H9 b. p; q$ p0 f) \/ t1 a9 B
) V( T3 e2 I% s& J2 U7 Q$ G0 u( Y4 `- S#define SHAER_RAM_BASE_ADDR (0x80000000)
+ z+ ~2 G5 P( J/ G; \#define SHAER_RAM_SIZE (0x20000)
8 G7 f( y' U9 W* d! `- Z
7 Y1 m' H% v2 s/ E! j0 etypedef struct
+ X, j- M0 r7 K" y) P{
3 B9 f3 [5 P. v8 N) Q unsigned int a;
/ M* p; b1 G7 L) j( _ unsigned int b;
( P, X, @4 c9 R' r a7 ^ unsigned int packet_cout;# b0 r9 {5 E% j; `( E; r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' S/ M# Y \2 B/ ]- X9 J/ ^0 ]% n' v' w# {8 L+ d* K; Q
void read_MSG_buffer(int *baseaddr);
% y" ^" A9 N' {5 l ]unsigned int count_copy = 0;
. ^+ `' p! P' F2 M: Z4 X' X/ ^5 p$ R8 p6 c5 q, p) {" p: F0 U& ^
int main()
% b# M5 U! t/ ]' |& v" A8 `{1 N# C9 W! F+ t2 O8 c
int fd;, Q0 o* x. }. r. ]
int *mem = NULL;6 g9 r: {3 p5 d! B7 u+ k7 l
# s3 E. Z Y$ w/ N- e' @( S7 O) ] if((fd = open("/dev/mem", O_RDWR)) <0)
, q3 X/ o/ C5 L: S; h3 c {" u1 W. _/ [; ~8 Q- c m
perror("open error");5 l4 s% o$ y- ~7 s' v7 b+ s
return -1;
7 P# a8 f: R# {, V/ S }6 c- ]5 N* C; p+ S/ P! \& D
$ \1 _# ]% m. u( } mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ r" H8 C/ X( G4 x0 Y7 ?
6 F, s3 `; o3 P r5 y2 }$ t while(1). i/ J- F j7 }
{
# H9 `' J( ]/ C5 s0 d read_MSG_buffer(mem);
d3 @( K; r9 B1 k& j; r- Z }
& T5 O0 K" ]2 [4 r/ o) a4 @}. @7 M: s/ f" ^$ t( l5 ^
& m1 D @- o5 S2 \6 ~
void read_MSG_buffer(int *baseaddr)
7 C$ ?" k0 y7 T{
6 n9 C g3 g5 p& F a7 V pRX_MSG_PROTOCOL pshreRAM = NULL;
' q" {+ L6 O. i6 |$ k1 K0 W
4 r/ x2 ^# g2 O pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
\# [0 _2 m' g, G/ {' K; {& [
if(pshreRAM->packet_cout != count_copy)
% E4 M v( @$ L6 a; i {
& b2 K0 v: B6 p: d7 p printf("a is %d\n", pshreRAM->a);
; H2 Y- G3 U0 k7 Y printf("b is %d\n", pshreRAM->b);9 ?3 G' B" a4 z5 Z' B$ d- o
printf("count is %d\n", pshreRAM->packet_cout);' _8 l/ o# p; d/ ?! g2 h1 D
count_copy = pshreRAM->packet_cout;
9 U: E& `3 n7 |) w8 o1 ^ }# C% O" j ^! i( |4 @
else6 k7 N& u& ~8 m% x% b% P8 B! Y/ B
{, O1 C7 Y. p4 l8 s2 R. p0 _+ B
printf("No effective message!\n");+ I) W/ Q8 z( V5 `4 |" Q3 j
}
0 |/ W6 A/ y+ A" K/ R" u}$ x5 j( b1 ^$ P" d
2 Y- P& z% f0 u1 v& z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" d3 Y. A n3 j* p; [5 C+ A
0 W, {. _1 q6 }$ j
4 k$ K( [0 H# m9 O: P. X
: u& x& H% v% r6 I ?
* c7 h$ R' e) Q" B$ T% ~/ [+ U |
|