|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' C5 R5 U6 ]4 ~
3 F. x3 c1 l% ]' ]% GOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- k; r- H% g$ L7 z#include <unistd.h>
% C% V' W4 }6 V+ D4 r# ]5 o#include <sys/mman.h> P' e9 \; K* [( X
#include <sys/types.h>- O* K7 y1 ]1 O# i- Q$ ?+ f
#include <fcntl.h>/ U0 g7 e- F) \- s! s: H5 N
. ]( |; l. e, {/ n& z; t
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 _2 ?- Z' B( A
- ?! H) Y4 m5 @/ Q htypedef struct
3 J- y' a( e4 d' Y7 n6 J{7 P( m. |* Z0 c5 z3 l
unsigned int a;
5 F9 L) b/ v$ z- u. q4 f unsigned int b;
# M J5 @1 c/ f1 G$ _ unsigned int packet_cout;
, K' W+ v1 r+ T) A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: g- p7 k& u' O! {2 g Y; A, u( J( j) Y$ P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- B4 R, ]! E2 \7 c- P4 m3 Q
unsigned int count_copy = 0;
5 c3 c6 ?, C5 z" P& O7 e
3 n M% u' D; s! h0 S$ C
* W; P& B/ L' X8 [$ }7 }int main()
) d9 X+ E- w+ e2 e+ o* q{
' @& Q; z& V. _5 T3 B pRX_MSG_PROTOCOL pshreRAM = NULL;
9 t/ r# ^% z' [9 b1 a& d" | pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 L' I# ~& I% T( T
3 o# C# c5 O" K% g. W* Y while(1)
) M* e3 p1 _" K {
1 w" u( L$ a1 E6 B1 Y read_MSG_buffer(pshreRAM);9 ?9 T1 L( L4 j# P7 Q7 ?5 s
} * u: p$ S5 V, J7 o$ F
}
( k- l, Z8 w" \0 k8 D {% R
- S) ?- P' j. L' {# i nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. P! m' J. I7 p" |{
/ ], B) U) X6 E9 `+ A* { RX_MSG_PROTOCOL buf;) J& Y: t- d. S$ _4 B
- L' ~5 w% Z) d7 [
buf.a = pshreRAM->a;" e% W1 Q3 N0 _8 V! m
buf.b = pshreRAM->b;. P( t5 k+ J2 J+ \. W( [8 ^' h( M
buf.packet_cout = pshreRAM->packet_cout;6 A, P4 d: c3 s' ]
2 G7 X+ d" ]% H* j6 D* B if(buf.packet_cout != count_copy)
& I6 d( ?# W! D3 D' }- T {2 ~! h! ^ P1 z, } ]2 o7 C" a
printf("a is %d\n", buf.a);9 i: y6 j D7 `4 `- Y+ v& {# d
printf("b is %d\n", buf.b);/ [2 ]0 ^, a& i6 i$ F2 x+ k) n
printf("count is %d\n", buf.packet_cout);
2 a9 e5 }9 t I0 Y6 O) W: {0 k count_copy = buf.packet_cout;
* C6 l+ x5 l* M! N% H5 X6 W }
7 R0 c+ D) y& c5 \ else
- ?6 s6 m' ?2 n/ a( P9 f0 ~ {$ b8 E8 z; _4 e
printf("No effective message!");
& G4 m2 g3 Y" x3 W3 k, [ }
" I2 d$ y( Q" P, \- a}/ ?4 B( h5 |" P6 o7 F
7 F: \( a7 [' r. y
% C- p+ T, t, C0 p; Q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 d2 Z7 Z9 g( `7 N' n g使用下面代码,对内存使用了mmap函数后:
6 K! j5 `8 }7 m( U) H#include <stdio.h>7 R; |# U% ]% s E* q* Q0 n6 X
#include <unistd.h>
. N3 U- E+ B: U4 q l$ O3 S+ _* n! @#include <sys/mman.h>
7 Z% P- _; [# |1 @: I P#include <sys/types.h>' b: S7 T7 V, }( v: k7 b9 m
#include <fcntl.h>
- w3 ]8 Q W7 s9 W7 w( b5 Q9 c; }% y" c
#define SHAER_RAM_BASE_ADDR (0x80000000)7 V& K' E: e7 s! {) I$ M" H
#define SHAER_RAM_SIZE (0x20000)
2 ?: |9 x# G5 z7 K% l
8 ^, o8 l8 `5 t z: R5 ~5 `+ m& itypedef struct
9 Y5 m: v& c; D9 m5 O/ R{. _9 i8 E L: s+ y( w6 q# B: p, D
unsigned int a;, Q4 q7 j+ \; `0 ]( c. P- q
unsigned int b;6 H+ _- T. [5 M! ]
unsigned int packet_cout;0 @4 t2 T* G$ Y/ ] A7 B1 w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ x! n, r% j& \ A0 b2 \
0 c0 Q# R T R/ ~, F ]2 M; m% fvoid read_MSG_buffer(int *baseaddr);
; N" n/ _& C3 E7 W8 T5 w! Cunsigned int count_copy = 0;
+ g! D6 t/ x$ n
0 q+ P) c9 s+ @) }" Uint main()
0 F/ n! G1 X8 k# k9 B# W{
3 |2 n6 o T. S4 i# D, k9 Z9 q int fd;
" |3 m2 w) h/ M; w/ M0 M int *mem = NULL;
) a5 b4 |8 ?- A: E; [- m% O! s3 S, l) Z2 ?) I/ q0 y* L
if((fd = open("/dev/mem", O_RDWR)) <0)
) ^. v2 [+ V0 S$ J9 I/ G' U {
7 g% F" e3 ?9 P perror("open error");
! \: e& y7 P q6 N3 i* V return -1;, n( o# S6 q) ]3 q: ?/ w! Y% G) c
}
* i1 f! W2 w: @3 m4 w- t7 \ % H* A6 J+ x" e8 G
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, S* P/ v/ u) f0 P2 z5 d7 R3 O3 u( `
' U. ?5 T4 C( o0 W1 S# \ while(1)
# U* I( r, Y' E5 ?3 E {
% s8 Z# k! c; @0 k6 }' { read_MSG_buffer(mem);
" n7 ~; S/ {6 I! d }
+ X8 l+ C K3 X2 a! L}, o( R6 ?. v% f7 X8 R) D
( @4 a) V- ~& {9 M5 d' Qvoid read_MSG_buffer(int *baseaddr)
+ v( g% v t; A5 A1 q, F8 _{
/ {1 d* t, u! N pRX_MSG_PROTOCOL pshreRAM = NULL;
- G: A& w' F. @7 j* V. _5 E/ g* u5 p$ t/ d, o, `( l; l
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# L p( q8 @+ w, b% V7 L3 o8 _8 n- _# {+ Y6 U/ g
if(pshreRAM->packet_cout != count_copy)
! c( F; T+ q* r, a {2 S) `5 K8 U2 j+ E- ~4 w, h, u
printf("a is %d\n", pshreRAM->a);. T" u1 s1 C2 k# y1 F. O9 L
printf("b is %d\n", pshreRAM->b);4 [4 ~+ p. P t* D" ?" a
printf("count is %d\n", pshreRAM->packet_cout);8 g0 E2 `. D- K+ ?2 r. w1 Y3 e
count_copy = pshreRAM->packet_cout;9 [. F1 I. u* w- E. p8 n2 X1 b% L
}
8 D9 w8 G; s6 Z! e) W" v0 P1 s else3 P8 l0 D9 ]8 X& D
{
2 b4 x6 E& I0 u y printf("No effective message!\n");& P9 C- Q" H5 J# j
}
% Q% M5 |+ w! a) }) p}
$ f# P+ Z4 W3 [2 Y- A! Q' }' H: G/ Q' y# Z! u2 [
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 d, K: r( U9 x& D
) a" v% Y* ] q) Z. Y
' w$ ?4 S/ b. @& I" A) L, V4 i5 |5 Y1 x: h0 p: p- ^0 @. F
* H4 i2 p( }5 c* Z; A( z
|
|