|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 F6 T* k1 Z" C6 K# \$ o
. Q; e, b8 U* _
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, O6 B% o$ }. N/ r
#include <unistd.h>, F% i4 _0 U& N* b6 i8 `
#include <sys/mman.h>- ~+ F3 ~& N, J
#include <sys/types.h>
; k6 J5 a' H! [( S: Y5 C7 A#include <fcntl.h>4 k, U6 w6 h/ m& J, F" y4 H
' _3 B* o0 I# j& C#define SHAER_RAM_BASE_ADDR (0x80000000) # C' D4 F4 O. D% R+ q) `
. O( `+ j: h3 R- O7 q
typedef struct$ N1 ~3 H4 T- ^+ O/ T
{+ E) C& n% T% D7 c
unsigned int a;' W( B/ R5 O/ d D# u3 c
unsigned int b;
* J( q6 F' M v% ?1 ?( S unsigned int packet_cout;
2 t+ C3 `+ ]1 F0 {* G1 o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* O: O! O/ D a" }. C
H! L1 J5 n% M$ Z; d! S% D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);$ C$ b) J3 [4 N& c5 h0 o- F
unsigned int count_copy = 0;! m; ], u s1 |/ F6 X; j5 _
- m& l$ U8 ^( R
2 I6 W' I+ j; c5 l3 kint main()
# R. ~+ j; |# E$ i. X{
% R6 C, E8 _9 U pRX_MSG_PROTOCOL pshreRAM = NULL;8 T( [6 o- [' P" M! e; ^
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- u: I f z1 r, m8 M
+ r- D- U1 J9 Q' s" I while(1)1 i5 ^6 g* r T6 ^- _* Z. e' h9 F
{
5 V! [$ }( M. Z( G1 p read_MSG_buffer(pshreRAM);
$ o1 s8 j- t2 p* ^' A } ' r% m( E! w& R: k
}
( ]/ x: Q/ C- B- v6 u. H% r2 E
0 {" r. \4 H+ t! p* Mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 [; E9 L5 F, f& {6 T7 y: _{8 Z- F8 M8 d9 n1 [
RX_MSG_PROTOCOL buf;3 A8 T e# X7 g4 l
. v- P/ l) D9 j! X/ B4 B
buf.a = pshreRAM->a;
1 z3 S6 ] G0 M" N3 K; d# M) }6 w buf.b = pshreRAM->b;) }3 T, c4 k/ u
buf.packet_cout = pshreRAM->packet_cout;, ]/ i. a- a, f
' V7 l$ Y8 ]6 y5 \" y9 P if(buf.packet_cout != count_copy)1 c4 |) e r5 m! w
{
% S; r/ v+ g+ Q7 `( g printf("a is %d\n", buf.a);
" O9 t' t: | o( i0 B printf("b is %d\n", buf.b);
$ N5 S8 H" [3 Q2 S3 K$ @ printf("count is %d\n", buf.packet_cout);
+ G5 N- N& @3 ~" t1 z& G" u. \( {; C count_copy = buf.packet_cout;& N% Z. l: J6 o# ]) i
}! E6 g, y. e; z. F1 f- h9 A9 s
else' T2 E/ q4 ? I1 I% i6 o
{
+ G" T H, ~5 }+ _4 y- t/ | printf("No effective message!");
+ m, W0 Z/ i7 _- Y- }- }7 ~; C }
1 n, |* }9 \# Y/ r) s1 Q}8 S' W' I/ P2 |8 Y
+ ? K! o+ W% b( T% h
6 ]# |! V# t; d# L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 r% n+ a* k5 p9 ?4 K
使用下面代码,对内存使用了mmap函数后:) z1 f s, V: H% b' U
#include <stdio.h>
+ R$ `# N F6 ]/ I3 {3 k6 N#include <unistd.h>
: Z/ K# T! g( K& C8 y+ `! v#include <sys/mman.h>
6 g7 D" k7 X! a! U#include <sys/types.h>& i9 B+ ?2 j- D
#include <fcntl.h>, b7 S- l5 G j$ y+ o
9 H8 p* W$ m2 b4 r/ M' a' w# {
#define SHAER_RAM_BASE_ADDR (0x80000000)
, `& `& U0 b, T& Q# _#define SHAER_RAM_SIZE (0x20000) 3 F" j4 [/ A+ g' k
) a) M8 k( s a; c2 @4 ftypedef struct
8 @; {6 R# _8 g- H8 S7 v{
: o% l) j$ }2 j( j unsigned int a;. k& e) W9 J1 r0 O4 W* ?
unsigned int b; V) A9 w( J. z8 P% K6 i
unsigned int packet_cout;9 q W+ T. w" h0 c/ l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 k c" }3 c& g5 r9 C- s F
. J! d0 l- x1 G2 \3 Q* uvoid read_MSG_buffer(int *baseaddr);
: O+ Q, Y; R x/ ]unsigned int count_copy = 0;) P- \4 M' w: h
q2 n2 W5 c7 W! z% f& qint main()8 L5 q+ R6 f+ j* Z" b" Q# G
{
' O1 p' O* ]" y$ y int fd;, x9 j. _! p$ f3 ~
int *mem = NULL;
5 c0 R8 R/ p9 d! L! p6 F/ J( V) p' |3 D1 ~& D0 N- ^0 |6 v) ?
if((fd = open("/dev/mem", O_RDWR)) <0)
; ~3 G; P' K1 c! J& l {
+ e( @( \6 x- {0 u& P; M perror("open error");. }) g( G E0 }# p0 M
return -1;/ ~; h! e7 C8 T$ h& S
}
5 z3 ?) R! \' g+ Y5 n$ X) R- ~ # S1 q) A6 V; L+ Z, M
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ j N# H* ]+ G+ Y' l
: ^3 e/ k1 P% \+ x while(1)
. Y/ a2 W* @ Z' Q( E {6 A2 G, M2 E9 Y8 F' b. M2 m+ J
read_MSG_buffer(mem);3 Z( U1 g u2 I5 I7 U8 y2 K
} . g* D" u$ S, g4 K; @
}! w- [+ M' {0 ?8 J* k
& ~" u2 V1 W0 _5 V* c f. ovoid read_MSG_buffer(int *baseaddr)0 x7 Y* V/ U. l) j# S& n7 l
{
* \; P" S! x* ]5 S5 _! ?$ R) y pRX_MSG_PROTOCOL pshreRAM = NULL;
( J" p* L9 v- W1 F' a* A$ k" A( H
: u) e) u3 T5 B& ? pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! }! ]% a {3 ^3 k6 |
% I* _. ]" r! @5 E
if(pshreRAM->packet_cout != count_copy)
3 N4 j/ r% }; Y4 E7 C% o {
" n: z; O4 A, ~' l! G$ G& H printf("a is %d\n", pshreRAM->a);
9 }4 U( p: j( T+ E" D2 E printf("b is %d\n", pshreRAM->b);
/ C- g: {( q$ E/ A6 } printf("count is %d\n", pshreRAM->packet_cout);7 c4 `% _: _6 Z0 X# ?! r7 e9 u
count_copy = pshreRAM->packet_cout;
9 ?. D6 y; |% r4 L2 m" I }
: F% l( h/ d" X3 a+ E- L0 } else3 [8 k7 e, Y6 M' f/ Q
{
d/ r2 F3 Z2 w" K printf("No effective message!\n");
; a2 f4 ^( K6 n8 C2 Q5 m }
& @ E; K; D/ ~! p$ G}$ h3 U" a; u% y: D
+ z6 N% O' p7 l6 O( V
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???# b( F+ v1 f% r" ]) h4 i
1 U9 C7 }) d) {! U' j% J+ y
% g: E) E) ?, z$ a5 G0 D6 X" {. B% h$ @9 N3 R0 Q
3 S/ f L( t. G |
|