|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' }, R& Z- | C: d; R5 _
4 @4 l' s) A, ^9 f$ y) L, |OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: `% E! t9 e/ b& Q
#include <unistd.h>
$ Q7 g- V1 @3 ]# c5 |( a) A! b#include <sys/mman.h>+ P4 E# q5 w# |0 K# Q6 F4 M: ]! G8 L
#include <sys/types.h>
6 A! }! A" w n% d) E$ E#include <fcntl.h>& M/ |8 T+ M1 V6 F( W
& v9 @9 n2 o/ g: y1 s& V#define SHAER_RAM_BASE_ADDR (0x80000000) z: `: e6 p4 }
9 Z: l* z4 g9 h4 _+ F" S4 n& r
typedef struct
5 f9 i! A G0 D% J. U' d; o{9 S. @' J+ P/ n( T& t. [! x
unsigned int a;6 ~* e0 R+ y8 X" K( j: {
unsigned int b;
3 H* R# @9 ]- ?+ l9 O unsigned int packet_cout;& ^' N' c, s8 u& \! E& p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 l7 O+ m* v6 G, Y1 j/ N
X; t- I+ C ?. G' |void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! U# T7 y. J3 j( [" gunsigned int count_copy = 0;$ i/ |; `+ Y" E2 X( f5 Q: ~0 K$ L9 ?9 G
! I9 q9 ^. d' N' T
9 ?- W( n, q& B; c, h( d1 j: L! f
int main(). ]2 u5 M7 M3 \8 l: M: a) V7 A
{1 _( l2 v( K# @4 W! C$ X
pRX_MSG_PROTOCOL pshreRAM = NULL;# T7 C( Q$ l; M! t: L( p# Y
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 J* A: Q/ A; U: G( A" @! |! `
! k$ a" s, }6 J/ r. ?1 E8 y* v while(1)
1 q: e' c/ |* k. X i {
9 t5 e% W! @" R# z0 o read_MSG_buffer(pshreRAM);4 X! P$ H' w/ ?
} ( q" ]9 \* R) z: T$ p0 v7 s
}9 e1 H0 C0 F/ u
& w5 r1 T' E, o( F# B0 h9 z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* ^% d7 C7 F$ t' p{
1 ~8 O5 J" b& {9 H/ E RX_MSG_PROTOCOL buf;
1 H$ W5 h: ^" ~+ L) l; I S9 U
. {5 G( O, H% p* ]% H% Z buf.a = pshreRAM->a;4 v I% D( Z' i+ r% w3 L! D4 d
buf.b = pshreRAM->b;9 m" g5 t* l6 k, C& V# s" s* m c
buf.packet_cout = pshreRAM->packet_cout;
9 `4 A+ ?) `9 K; v3 w
; H2 b5 |" B/ s& N* F if(buf.packet_cout != count_copy) U6 P8 i& Y4 n& T/ n2 G
{* |* j0 t2 H0 E3 o
printf("a is %d\n", buf.a);1 M* b5 B* m% U& d9 \( U
printf("b is %d\n", buf.b);
# ?3 ?0 G& G+ q: x1 @$ @ printf("count is %d\n", buf.packet_cout);
" ~. m Z. G' Y( G ?% p count_copy = buf.packet_cout;
5 @ X0 T- x7 w }
5 h& M) K2 @% }3 S2 l8 F else
# M* m4 N& @% D {
* `+ {; A. h4 z! i9 l7 ]7 N3 G% Z! n printf("No effective message!");
4 g1 f( V0 N2 Z% _! E, F }
3 |( ^# C3 v2 B9 t; G: Y# V7 f( O}3 d( f1 @5 [3 d" k5 j% _7 D5 ?
3 c3 z5 w4 g6 O. V U
* I" J2 w1 S& b5 }4 ~9 `但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! I+ z- B+ X0 K& u( Q. Z3 Q使用下面代码,对内存使用了mmap函数后:
! C9 h6 q" c6 ]1 }. @& G#include <stdio.h>
+ |" P$ m' x# v#include <unistd.h>$ {5 ]+ g; e9 m5 d" S7 `
#include <sys/mman.h>( M9 [$ V4 B+ I+ j. Q+ ?
#include <sys/types.h>1 S3 q2 r; s! J0 B$ F5 X3 J" K/ w9 k
#include <fcntl.h>! g* |) y G5 Q+ k1 |7 X
2 i7 B; O& ]! ~/ o; v2 `
#define SHAER_RAM_BASE_ADDR (0x80000000)0 y7 T3 k( n4 p4 A Y, _& a
#define SHAER_RAM_SIZE (0x20000) 7 ]/ g" S" q* Z
3 D3 _3 w7 G) X5 b( Utypedef struct' H; |. ^: D2 { b5 P
{
1 _# E K( [. H: V5 |9 m" ~ unsigned int a;
8 v- _1 s0 c ?: Q' ] unsigned int b;
3 x1 m8 m9 e p; L unsigned int packet_cout;5 [/ f0 a v9 `# ]+ r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 k" J8 b6 S) l, c
/ o) I+ s+ R& h. Jvoid read_MSG_buffer(int *baseaddr);: _; G4 T1 s c/ X5 Y/ h7 V$ k" d
unsigned int count_copy = 0;7 g' } ^3 s: c9 }7 w# N; s+ b
; S! _" `' ^$ l6 f* e
int main()( ^# N: ?. [7 F
{1 J3 z$ m3 _; W* I8 |% b: C" y1 a; o
int fd;
" @* V3 |; n% E! p% t: \3 n7 n int *mem = NULL;2 ^6 d) u0 j/ ]+ K; d6 \: }
% L/ A& R: |0 ?+ s; \
if((fd = open("/dev/mem", O_RDWR)) <0)
, H) @. g r/ i {
7 M |0 a+ H8 I" v6 [3 f perror("open error"); w) A4 j& L6 R
return -1;) t! t8 d7 s) U
}
# O8 `* T( A5 T/ r: H, O" h 9 ~4 \! ^! u" _0 L+ M# b9 |3 V
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! m0 H: R6 h3 B* ~
/ E: o$ N" Y* k8 H' c
while(1)8 p& a7 D& A* m9 P8 W/ E
{8 ]& l s2 `4 D) b2 h
read_MSG_buffer(mem);& V. K3 @, I j! G z
} : T% O- T0 z& r+ ]2 V
}9 v6 W M# Z- L, D' g
$ ]9 _$ z3 B {: {- Y0 Nvoid read_MSG_buffer(int *baseaddr). J0 x& z! `% i8 ^8 z' `$ J( }
{
) z; V8 D2 G( s6 S5 [8 o- K# C: o pRX_MSG_PROTOCOL pshreRAM = NULL;$ Q) c% @+ o. J- i) r" E! e% X6 \; K) Y
# q8 f. g7 t! w! _0 X. B7 z2 C pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 f, C% n$ B/ @& Q
) B8 O0 n q! k! ]9 H+ ?* U/ p& m6 n& ?/ S if(pshreRAM->packet_cout != count_copy)& Z1 v2 {2 d+ f! r; `* S% Q& h
{
' S, Q+ M1 q" N' k/ t printf("a is %d\n", pshreRAM->a);1 Q+ I! {- n7 J/ _+ S% d
printf("b is %d\n", pshreRAM->b);1 L+ i; V$ j) I% M1 H; O5 T) Z. z
printf("count is %d\n", pshreRAM->packet_cout);
7 l ~" g) U5 T! A% C count_copy = pshreRAM->packet_cout;
% K% b z1 s6 ^' ~/ s- \9 D }3 L" m: I) v4 a- A8 b0 j' P
else+ S' v0 @* y6 a( e8 o& T, ]
{, I7 A* L6 F4 u. v0 C* N/ q7 t
printf("No effective message!\n");
& ?6 G( B* N) q4 V$ K4 F }
9 i) Y2 v+ ~1 y* h! o2 {+ v}# Q, X8 X) s J0 |8 J k/ B
& [3 D! s* j" a9 S- r5 G8 k* f; @* E' T
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 a1 N; T6 u! v
. n1 q+ }! N& j% Z. W/ ]- K8 I+ J
+ V* d1 O/ O9 P f+ g! a
+ V" M7 X M6 c: k, B( x/ W; G. r) a9 f9 `; h; o
|
|