|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / p e& V8 A. h. ?, @
& q0 d9 m( D! x0 F: r7 z5 sOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 A( }$ E8 d# c' B, r q1 I: J1 R8 p#include <unistd.h>6 @- t& {7 @7 ^5 f3 N
#include <sys/mman.h>2 M4 Q% }9 V3 c$ Q: W8 L4 s5 V
#include <sys/types.h>
1 V3 J5 Y, L) B3 ?+ d6 S3 }8 y#include <fcntl.h>
4 E9 D" x3 ]! _2 _
9 X# J7 I5 Q% U; s( o2 e5 I% j#define SHAER_RAM_BASE_ADDR (0x80000000)
) y/ B2 u, e4 X
; ~7 Y+ c* j' a( ~3 r. Ltypedef struct
3 v* A0 j; q2 y* p{3 m6 G- S) C8 O% Y5 H
unsigned int a;
9 s. e: G& p E( k' F3 D unsigned int b;
0 \1 M; M3 Y; w! a2 Q' M unsigned int packet_cout;" P* `# J$ n7 q, j6 _+ ~& y) ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% s3 e5 E- f4 q+ W, j
+ l8 o% i" [7 Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 x* b# s8 Z- E4 o( C' C4 s
unsigned int count_copy = 0; b) x4 _, @, J! u4 S
; c2 r8 l) u, K1 Q0 o9 R0 {9 Q1 ^4 z8 d! D* S* f" S( H p
int main()! r- W: K8 Q3 T( B" u
{
- x d2 B4 u+ I+ r9 h E pRX_MSG_PROTOCOL pshreRAM = NULL;
- t- g5 Q8 Q/ @ pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 \8 C$ H2 \5 e3 g9 h& }' M. c" c y; x
$ ]$ N5 S" B4 ?. x/ X9 U while(1)
$ Z" \3 z# t; n# `! @ {
% V; y2 e, C+ \ read_MSG_buffer(pshreRAM);6 m M3 M6 v- M
} & r" K* B7 i- y* a' H% J: `
}
# Q7 P8 e" r5 b: m5 p$ T
' q. L1 G T0 h! |( s. w7 Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 V1 g1 o8 a8 j5 m' |
{) u# l! D- [. I0 O* W0 X
RX_MSG_PROTOCOL buf;
0 G& Z. n! ^& H( N. d4 [. y3 c - R+ X# n# G1 D/ X* x# S. N+ [' Q
buf.a = pshreRAM->a;% O, ~, l) R0 X
buf.b = pshreRAM->b;
: k8 h- T$ D. U5 X1 |$ F# \1 C buf.packet_cout = pshreRAM->packet_cout;& l0 \. D3 p1 f3 [
& X5 Q% m# g8 C% U
if(buf.packet_cout != count_copy)5 ?* k0 u2 N$ |
{
9 O& q3 P* w" Q1 A2 ^8 ?! v: ^ printf("a is %d\n", buf.a);
- p: D, C* _; g& W: ` printf("b is %d\n", buf.b);' N! l1 {$ \1 `# y% @
printf("count is %d\n", buf.packet_cout);; o M1 x" Z7 I% ]- c
count_copy = buf.packet_cout;
$ b, s/ Z! d5 H, j }
+ [+ x& A6 V* O! B4 E else' Z# {* K3 Y" a
{; u: _! [0 |: c7 E1 i
printf("No effective message!");& V9 e4 O% i+ U) w& _* F
}
p9 }0 c/ [' Y T; W, h( M2 |}, ^* F$ G5 a. A( I3 n5 y7 d7 ~
. l! P# x3 w3 _3 g
$ n& }1 T/ m# T( K1 Q$ i" n但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& w, h* r; D' n% P
使用下面代码,对内存使用了mmap函数后:
5 x% J4 h+ _1 F, H5 w#include <stdio.h>3 |1 g- J: G# x2 v5 i: w& z' v
#include <unistd.h>
# b# p6 h/ u7 y8 w& y9 }#include <sys/mman.h>
8 N9 L; _8 y% `4 c- L4 U#include <sys/types.h>
4 x* u/ E! o' F5 s#include <fcntl.h>
% n& w4 [7 S1 o6 K" D2 |
- V4 H A, ~9 R6 G. E3 l#define SHAER_RAM_BASE_ADDR (0x80000000)
8 o* J& E* r' ]4 g#define SHAER_RAM_SIZE (0x20000)
2 }: u( ] _0 B+ n0 l! h7 n/ |& L2 M+ X/ v
typedef struct9 ] X2 U) @+ f. q3 b" X
{* b. |- ?# k: O/ \+ r) Y' N
unsigned int a;+ U* n9 E6 m) }, H
unsigned int b;2 _, K7 t- u6 J H: X' R" n
unsigned int packet_cout;' \- i% z: k* N' |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: J* x. z. y0 `1 e& g8 N' u/ O$ v; o: ~; _3 ~
void read_MSG_buffer(int *baseaddr);
3 b8 k2 P- t: C! Z! yunsigned int count_copy = 0;! C% |. Z6 v8 y$ n2 k
) J5 S! A. k: S% W: W- p& u+ c: q
int main()
Q/ j ?9 f7 R5 S{8 F( a0 W/ B6 e z, X
int fd;
8 J+ ^# t" R; c/ d: \- L int *mem = NULL;' l* x U, e8 W8 i# z
( Q* Y: M+ K' O0 y4 ~) m- X1 S if((fd = open("/dev/mem", O_RDWR)) <0)
6 p/ E* V% _# {6 p% M! B: ?4 d {
4 f i' L5 O2 k# \ perror("open error");
. }8 w5 _) M5 j/ A" M& c return -1;
, D. z" k; @2 P3 r2 h/ d3 b9 _ }% ]) l% t$ M8 S- c
- y# O4 Y/ z' p' j4 {" d8 y& m0 N
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 a: q) D, V) b( T
* p' c1 [( O; y9 k2 u- S: B while(1)7 T3 s9 ~8 v* Y; P4 f' h6 H$ q
{% p M# b9 t/ [6 O6 e7 o: n' c
read_MSG_buffer(mem);, h5 }1 a7 d; v2 Y: ~% ]
} 0 M6 t6 @2 r5 J/ _1 u
}) Z* M$ t D( P ^; e0 D l
! F5 U+ n, V) X$ Z
void read_MSG_buffer(int *baseaddr)
* ?2 C4 X8 z) l \1 E% y6 N1 V0 r{
/ r$ F! `+ V- t9 u" z- D; | pRX_MSG_PROTOCOL pshreRAM = NULL;
* J+ j, d% N! @/ ]
H+ ^) M: R8 @' K# ~4 _ pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;" w- ~1 I- n. s; h0 {2 ?
# {! W9 y: A1 h7 c) o- X
if(pshreRAM->packet_cout != count_copy)
7 m5 }0 r: T5 P1 P Z {
4 l; V Y7 }$ R- Y/ W: A2 M printf("a is %d\n", pshreRAM->a);
- r* W3 w3 m$ j; k. L0 @ printf("b is %d\n", pshreRAM->b);/ |- e& m6 g% @
printf("count is %d\n", pshreRAM->packet_cout);
/ W4 c; i1 |% ?; z5 t% _7 T count_copy = pshreRAM->packet_cout;
7 @! V" o g# j4 D6 O) \ }- G7 o+ n7 b& W1 ^- h& i9 T4 \
else- w* t# X, L# V) F& y- {
{$ R! _, L6 }. v- k! H
printf("No effective message!\n");
, D0 T d4 V4 \) U, z- c, v }6 m: H' j! I6 d" i
}
" d+ w1 v. n- S, o, b( Z" `1 m( e6 u! ? p8 f
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? e1 m' d5 D% h& g1 p! I7 r
, H" n9 H: a0 I$ B6 V) {' ^
$ D4 h+ y5 o# D0 u0 {, A3 A
( U% `6 z a4 m* w
* ~. [) o/ c' h0 i8 z
|
|