|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) C! G& f+ n4 z9 g3 N9 y# f& j
6 h1 o8 d: t! N; Z" L/ F( b: k
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 M" z2 {4 [5 G& B# O o$ m
#include <unistd.h>) ^( [. p1 G( w. i
#include <sys/mman.h>
. t9 T* o1 t+ `#include <sys/types.h>: {* z7 o6 Q, S
#include <fcntl.h>" |0 \9 }4 }( j$ y: T8 G+ M: I
- C$ ^$ \9 S, i. ?. O. [- l% N
#define SHAER_RAM_BASE_ADDR (0x80000000) . w: k7 H Z1 W, i+ C$ F
. S2 U$ R1 G* H
typedef struct) } P% ?& t/ y- j4 ^# {
{7 Z* E2 U9 G( F! D* v. M4 R' Y% n
unsigned int a;
* }/ j% v% O1 L0 b: ^4 ], b unsigned int b;1 Q. m% X4 E- V V2 h D! H. h
unsigned int packet_cout;- G5 _: U+ J. C% b9 H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) f' H( v* R+ M7 B4 ^
; `1 A4 D; @" F( }* @7 ]void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); o0 P) ^* n7 r0 E; q
unsigned int count_copy = 0;
+ ]. D1 y$ o1 n7 p+ p9 @% S3 U G# X- ~+ F# ]
$ }8 S* w% w0 L( i: N, J# |int main()
4 o- @ T5 v8 |5 V{
( t; F' @0 u1 S6 j1 i2 x4 M pRX_MSG_PROTOCOL pshreRAM = NULL;* s1 a0 w* a% r8 m8 i2 E
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, z( D5 T/ I7 m. |8 D. o0 |4 ]' c" D1 x9 E& @( ^8 f
while(1)
$ n( `4 h5 k K5 K6 W" u {
9 \1 X1 K- }1 z1 `* {+ v read_MSG_buffer(pshreRAM);
( b: I0 y# ?: [. L% J/ H8 E } " O& ?" ]6 n+ o7 j9 v' _
}
. |" p2 a( c7 ] B+ v% ?
8 M' g) n1 W/ @void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 q3 O# i+ K$ v
{
- s+ |) j. A( f2 ~, M% I N RX_MSG_PROTOCOL buf;" o. o0 j4 S# l! i0 B+ N
; t3 C2 H8 i) w& X* j
buf.a = pshreRAM->a;
0 l; E/ v- v( a3 G buf.b = pshreRAM->b;5 b) s8 V* `; o9 w r- [2 {" `- U$ z
buf.packet_cout = pshreRAM->packet_cout;
' O$ S' Q3 m3 y ; C2 P! i f: A# {; ^- l( r
if(buf.packet_cout != count_copy)
1 @/ }# j( G8 ~) [8 C {
. I4 q3 s1 i( V9 d9 k$ R4 p printf("a is %d\n", buf.a);
. K; N4 i) ?. s3 N" [+ A1 Y printf("b is %d\n", buf.b);
6 a0 p, D/ h+ A9 K6 C' D* s9 ^ printf("count is %d\n", buf.packet_cout); f% C& B6 N: w/ _( k
count_copy = buf.packet_cout;, n4 a6 V+ v( G+ F4 w
}
2 n8 T6 J d* O; Y& Z$ S; i7 o else
; x8 f3 D- A+ x) f, s {
, q, V# c% N4 G! t- P printf("No effective message!");
' a' ^% M8 ~8 V7 C+ W# w }
8 O1 c5 Y, \- |) w. h}, Z+ r1 P- E# b
7 Z1 ^. y/ n2 S, n- h" u) {. b3 @
4 J5 Z) @, L' w1 L7 p
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( t) d/ V5 J# G8 N
使用下面代码,对内存使用了mmap函数后:
. m2 j$ _. W2 f9 Y2 w- y6 n. J' U#include <stdio.h>
2 t9 L1 F0 `2 T, O#include <unistd.h>
q, w q( H0 |8 z U7 Q#include <sys/mman.h>
; ~2 w1 s8 F) \1 t1 E) G#include <sys/types.h>& q; U- h* G4 F2 d3 h; J2 U+ r, w
#include <fcntl.h>
* R2 ~2 K, s" M2 [8 m
$ q2 h# |% k5 ]5 O6 T+ u#define SHAER_RAM_BASE_ADDR (0x80000000)" G$ R; c) I+ j# @7 N, ?$ V( g7 z+ Q
#define SHAER_RAM_SIZE (0x20000) 1 f( U! `8 n4 S5 I2 u3 F
* ~& V8 W5 v( u! Q2 ?. j* Z5 T7 ~& ftypedef struct
( @+ u4 F' j+ v2 R6 v{
. Q! l \5 g; c p F) e: N unsigned int a;
3 b( r+ F0 q- s3 _- S0 F& y unsigned int b;. i/ z- v/ m' e5 L+ K
unsigned int packet_cout;
! P: L. q4 E' m! F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 x. X" H" @! T9 N- X
$ w! H# U; R4 E1 J$ r: ?/ q6 tvoid read_MSG_buffer(int *baseaddr);
; W: D0 W, v8 Iunsigned int count_copy = 0;2 `; x9 c: _5 s) X) n. l
^2 P( Q/ I4 V
int main()6 |$ `; ^2 J3 L j% W$ ?( i4 H
{) Q; Y' q0 N( H4 N6 k
int fd;
0 {6 J; F( w8 U4 o int *mem = NULL;: T4 O0 b6 L: }5 i3 b, n
, G# ?$ H% U( l% I) t1 h
if((fd = open("/dev/mem", O_RDWR)) <0)
7 N" ^8 r7 T) }# K7 _6 Y z% A& i {
! t8 x" R% J3 r. R$ C perror("open error");! X5 B( \! F! f4 b @4 G8 P( R
return -1;# B w2 E j" O" P9 R
}$ j+ L* _" z1 r$ ^+ M
# t2 C3 X j* _& B8 ~
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 E X+ y" X5 c K* e2 \, ` l% ?4 n! H$ U* i7 p
while(1), U) U, U" U# T! n, R" ]
{
: v+ ~8 F% X# c0 k J1 v) V* @ read_MSG_buffer(mem);5 p: [6 o, m1 |( f0 a4 ^: C# {' r
} ) P i' g' L. M7 H p* S
}1 J0 [6 I1 L% s4 B! a
5 r7 G, X( I+ s3 _ j! y
void read_MSG_buffer(int *baseaddr)
: D- G% y. @2 U0 j{
! r5 a2 I* q O pRX_MSG_PROTOCOL pshreRAM = NULL;7 P, g1 t2 x5 E0 v% x7 R5 O
" ^1 r6 F' ?0 K5 F! E! Q pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& P: F2 Z5 W8 N$ a* x2 |: N2 h# t) x1 r
if(pshreRAM->packet_cout != count_copy)
( f8 h& V6 I- q3 y P9 { {2 H) R }* \" m- T2 T! M) o
printf("a is %d\n", pshreRAM->a);( u, d8 D0 a4 o
printf("b is %d\n", pshreRAM->b);( d: z( ]3 Q( U' H! |; K. K: \9 N
printf("count is %d\n", pshreRAM->packet_cout);. l; X# G4 Z [: E/ K
count_copy = pshreRAM->packet_cout;
; Y: J$ c. Q' c' d# }" x7 b }
6 \: b/ j: a d# ` else3 t# V9 K& p' M3 K9 I) F
{
7 B& s. J: ?! {) N8 h# P printf("No effective message!\n");2 @& q1 O2 P# G0 S3 h- n
}
/ K- l+ c$ u9 u- g, b- T}( y# T: d$ ^6 d2 y" T5 d" e
, B. H1 K9 `1 A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- [7 A/ Y) b. A5 u) a% Y7 k: E+ O+ w" ]% h
S- @& \0 W8 s& w( q! V* x! \ [ w: I; K$ w' B
8 B! D& C% L1 J* M) a* a# f |
|