|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' s6 q# g6 C. u+ C) {
6 n. L7 l% T5 a; l; r0 H
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- D5 ~, O" [3 y" B#include <unistd.h>( G9 y2 G$ h& G2 W, V% N. M
#include <sys/mman.h>
- [9 f+ j) ^0 z#include <sys/types.h>3 j" I( C) N! P
#include <fcntl.h>+ ^9 {3 o. R7 i, O
( J S' z2 w/ a) C7 L2 {2 J9 B#define SHAER_RAM_BASE_ADDR (0x80000000)
- [2 b" H% Q0 e: Q5 T3 k( f
& p+ G x; }- }, ztypedef struct4 r1 \- B* i; j1 l; ^
{
7 t! M) B- Z4 V# s1 p/ A/ C4 m | unsigned int a;
9 i( {( c" ~; J8 O* _ unsigned int b;
1 J' n+ K. [4 k" L" ^2 A% x, g unsigned int packet_cout;
7 r/ f: [; B; s: S" o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 D& l+ }# j2 T: a
* I7 {1 L4 l2 p4 P9 a; S2 F/ y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. _0 V. @6 l) G* l
unsigned int count_copy = 0;8 A/ } ?7 d+ z* p7 b
% R" W2 {: a4 [7 H- a) \3 K
) j: Y$ c5 _$ d% r2 T% J. kint main()
& k" R9 j1 J$ W3 O3 }# D( @5 F{9 x; |& b O; o9 a" u
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 M0 t% G- j) u2 ^: x. M pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( o+ {$ }: r& N4 `' L
: B7 ?5 x }- I while(1)
3 b3 m( n; L6 p$ M {
1 g) n) B! U3 \ read_MSG_buffer(pshreRAM);3 n9 v; d" g" U; o% ]
}
0 n$ ?7 v7 ~( s- W1 V} G# \$ N+ h% L* c* i/ |
8 Q: D, i2 C: {0 e7 y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% m! h/ H4 N, q7 _
{1 I% H I' L/ H) K0 T/ Z& B4 T; n% j
RX_MSG_PROTOCOL buf;4 ?8 O7 c# J# E0 G7 |) }& S
: O; R( J5 ~1 K
buf.a = pshreRAM->a;$ a/ Q4 z9 C) ~, _- F2 A5 ?; Q4 Q
buf.b = pshreRAM->b;. I% \, P6 i9 @3 E8 `, z* }
buf.packet_cout = pshreRAM->packet_cout;! M& L o* V# |8 E; h" `" d9 }- M
0 ]* u9 b0 c- V
if(buf.packet_cout != count_copy)/ U2 d# ~7 S. I% Q6 n
{
: g6 L" e3 |# q2 E7 f: h0 ^$ b( L5 ` printf("a is %d\n", buf.a);
! \; H4 ~9 g7 ?7 y- e: ]: x printf("b is %d\n", buf.b);
1 y, N% ?- @" G7 J" ~) [) K printf("count is %d\n", buf.packet_cout);# E, r' B/ n& _# D6 B( H
count_copy = buf.packet_cout;3 y' x8 D4 q6 w# `- C
}8 ^( x2 E, E/ e* J- }
else
$ ~7 X8 N6 q/ D. P# u0 w% M. S {
( j; d7 l- [8 b printf("No effective message!");
2 V/ }! h% u: ` }1 ?, ?% N) s( y5 [ S8 f
}
! V' u$ ^7 Z0 f2 b3 B
/ J: v0 E, W; F1 I2 j- U
1 M5 a1 C5 p; u! m5 x Z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 _0 \8 e% m( }% K) J" u
使用下面代码,对内存使用了mmap函数后:
2 f1 p* X8 ?9 J; Z# o' x#include <stdio.h>
; y. f$ h6 U$ O) W#include <unistd.h>7 H2 H; ]1 I8 v4 s6 r9 f. }0 Q5 Z
#include <sys/mman.h>
: Y) M8 g' d H: a V2 Z#include <sys/types.h>! ~# C H( n# T1 ^# @2 e( ~9 H6 x
#include <fcntl.h>
3 _5 s& R0 s* P+ X+ V
; v- ?( g4 Y8 d3 x5 h#define SHAER_RAM_BASE_ADDR (0x80000000)
+ @* s, }# W$ G& G! Y#define SHAER_RAM_SIZE (0x20000) w- Y' O' ~ X$ L6 f
8 X( ~- }" }5 Y3 o2 f. s
typedef struct: }2 ? ?0 ]1 Y# |
{# e# c6 M0 Q% B9 m \8 Q
unsigned int a;
- V S9 V8 K; D# x% S, N9 a unsigned int b;
' c; G4 c! F2 I! f4 P3 k unsigned int packet_cout;* E" s! o- x0 f; X K& q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ K& u" ~- e' [) V' N- y6 }( y" a+ O3 A0 L/ B
void read_MSG_buffer(int *baseaddr);# F5 C- o3 W$ S" A6 Q
unsigned int count_copy = 0;4 e; [( X1 b; _* m. ?( i5 J
( \6 w7 D/ D/ o3 L" _int main(). `7 B# O4 v7 s; O
{' V" Y6 R0 Q+ P' K; t) c) f
int fd;
( C4 G R, Z* z- P int *mem = NULL;
% @( G4 Q p& a$ j( K; j/ z9 {9 Y: Q5 U2 G; A9 x: N
if((fd = open("/dev/mem", O_RDWR)) <0)
) x- ^$ m) ]- N, Z {
+ E# Y0 t! r! N perror("open error");
3 ~# M W+ ^: [5 U% Z( ` H: E return -1;
- S3 p$ P9 K6 A2 r% V% f }
* e/ x6 A) j$ e1 f 9 E X- t. C0 ]/ \6 _( l
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& a5 V: |4 g& m: H8 F% e! P u) w8 j2 z$ c; u; i8 B6 M1 a# m
while(1)
% c2 y) f; v/ U' o7 ^) P {
7 j" _' |3 v% ?) g' Y read_MSG_buffer(mem);
5 M8 `3 P. \3 O q, p } $ G. B n3 }+ a
}) [9 |' F$ h1 n& P
5 C, J$ Y7 e9 b( Lvoid read_MSG_buffer(int *baseaddr)
: A- k" i: ^: p. y. [+ b7 b{. w# B1 `7 y' y- _
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 V: e1 {$ O2 m5 l
7 G; {$ ]2 a% r: M& Z* K pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, C6 \+ e6 j! G6 h$ ~
* p7 J! y. o* l7 `* m; S9 i1 x if(pshreRAM->packet_cout != count_copy)
: `/ S1 r; D. L2 T& y {
, Y6 _& F- z" h printf("a is %d\n", pshreRAM->a);
( F2 K& R0 X3 D- X: H printf("b is %d\n", pshreRAM->b);% t. ?. |2 V" P- [+ K, b5 k! S
printf("count is %d\n", pshreRAM->packet_cout);
- ?* L2 G( L6 z& U5 ~ count_copy = pshreRAM->packet_cout;' W7 E- y4 ]$ t" J
}, [+ c0 f: |4 c. m$ N3 s% ^
else* l# h0 F+ v2 I; e+ Q* U) n1 }
{4 ]# p( Z/ k6 |' S! d
printf("No effective message!\n");
$ i* Y0 z: h) X, Z1 n4 O }
/ d0 I2 U0 S# D6 s! {* n) h}
1 f" ]* W& G M1 \& ~& i3 K/ U$ r# E+ |9 p3 w% w2 k& b
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) `" w. p2 p/ y9 e6 z. E
b& I8 i0 R1 _: @
; n2 ?4 e! S2 B6 a" a/ _9 j# t% c+ {9 W' |
1 [3 J/ U0 @* {- B' j
|
|