|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 F' O" [. v: f" y% b6 I# A# Y% Y
* E& T1 B }4 S' t
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 t5 r/ d! I! ^, M0 E#include <unistd.h>, U# ? U: H w- b
#include <sys/mman.h>
/ D, u$ b4 i; T#include <sys/types.h>
1 g3 @$ v2 s0 w a#include <fcntl.h>$ K: y) i; @! n, v
8 `3 c; Q0 }/ @: j" P#define SHAER_RAM_BASE_ADDR (0x80000000) 8 N4 N. F8 m9 k; H
! f( |3 P: l6 W1 I7 ~
typedef struct
1 F# ^' s8 T; L. W9 V: E{; o. y: X/ G+ o8 l. J! M
unsigned int a;
7 x. z2 V. j& \3 Y unsigned int b;
5 h6 Z% C- b, @+ o8 C2 M unsigned int packet_cout;
6 f* F, g8 D! H, I/ n; `) H. t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 D+ w8 |+ `& v8 l" G& C1 J6 m# n0 J: h4 r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" l' h' V C6 d2 ]" o
unsigned int count_copy = 0;9 T) _5 t- j0 c5 _0 U# N6 ^
8 C6 j# }7 r' n! L2 u' N" |
* D( x) e( K k' m Gint main()
- t, D4 P$ E" W; \* w) f{
0 d9 F! g$ K5 d+ t2 v, l9 y3 q" s& J pRX_MSG_PROTOCOL pshreRAM = NULL;" b6 h. H) X, [5 x# l5 M
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
' o" t; U1 P5 d& I$ s
. F7 N8 |; u2 e0 y+ r while(1). f% D9 r" _- W
{
$ g5 L1 ]* F" @' E" T/ K9 L read_MSG_buffer(pshreRAM);
& [. ?) {$ D2 v6 B6 y } , I# I6 n, G9 U9 p
}
+ Q" t- f1 c8 X8 i6 |/ |' A2 g6 a [ O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; k" f. s. S; F6 e% H, |{5 W3 z, Y \1 [& X4 n
RX_MSG_PROTOCOL buf;
0 U9 E" e9 S& l& d) D. y7 P
3 L5 |+ x* t1 O; v# g v- T1 H7 c buf.a = pshreRAM->a; G5 p: ^2 x9 I' a, T! e% Z
buf.b = pshreRAM->b;
7 }) C3 U ~" ]- Z3 O buf.packet_cout = pshreRAM->packet_cout;6 x1 J1 b5 t4 I' L5 N3 c( \! y2 r8 j: C
6 Z8 B1 z( H% i! X
if(buf.packet_cout != count_copy)
" E& ~9 @8 e$ k {
9 I9 U& f6 r5 t" h( d& S printf("a is %d\n", buf.a);; C+ t- g8 m0 K. R+ Y; W
printf("b is %d\n", buf.b);
( k4 D2 H+ w7 r. Z% Y" d4 C printf("count is %d\n", buf.packet_cout);
( Y+ a8 x# U- e( |2 k9 Y% ~5 S; \ count_copy = buf.packet_cout;0 Q5 z# [; \- I/ f
}
9 n# Y: w9 l8 P( [( e9 k5 @ else, c3 W+ O- g- ]% y% I9 I. Q
{3 T) G& @8 C9 b) t' w q
printf("No effective message!");3 B0 j/ p9 ]/ c; K( D
}$ G7 t. C& a& M6 K, A% ^
} I/ g9 I7 D* i* ` K" P
0 e! Q! H; A( ]. C& a& n( S
" D( E( c$ X# E但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% g/ t' q& ?; j+ Y0 @" w
使用下面代码,对内存使用了mmap函数后:$ X6 V9 a! ?+ ^9 X5 _
#include <stdio.h>
* R9 X' N5 l! j' a- m#include <unistd.h> C J/ E2 z& k
#include <sys/mman.h>$ ^2 e2 k" i0 Y) a0 ^; e
#include <sys/types.h>
, A! p! j) ?! p! [ s#include <fcntl.h>/ C( {0 L5 |. J+ `7 \$ Z$ V
8 W2 K f5 u5 Q: C) a#define SHAER_RAM_BASE_ADDR (0x80000000)) [7 P2 A6 J: e8 X9 l* g% l1 _
#define SHAER_RAM_SIZE (0x20000)
. y% R* w) ?& T; \1 B* g
- X: }* v0 E( B& `$ _( B! D) stypedef struct
& O' s; p, i% y; s{5 z$ Y) ^7 _' s0 p1 Y
unsigned int a;9 a& A v& w# x5 g
unsigned int b;
2 {: Z) i* b ^1 {( z( l2 ]: r) o" | unsigned int packet_cout;' l( Y1 ?+ q8 v5 ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! _" |! y- Q }% O. o4 [6 t, C0 T0 L2 o
void read_MSG_buffer(int *baseaddr);
; a, H' `( K* x8 Q6 q4 i @unsigned int count_copy = 0;: S$ O: \6 ~, x6 S5 T) l9 G
7 U; v3 ]8 f Y: \& A6 ]
int main()8 D) m% b! g: Q
{
$ l5 K K* a2 B I5 Q int fd;
( v* n& ~( M0 _; y/ n# q int *mem = NULL;+ b! V s5 T4 V2 X5 k: h: g
. t9 G. {" H' @$ ]6 h2 L
if((fd = open("/dev/mem", O_RDWR)) <0)
: Q1 N) Z9 b2 u1 g4 P {
: H7 ?! Z" T& m9 c perror("open error");
1 x; U+ t2 I% L1 l! G' h; m return -1;
3 h1 P, N$ w! c: Y2 A5 s. C6 y7 E, j: m }
$ z h& \5 |0 ?' V/ D" k+ u 3 _* R( z$ P/ @3 V
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& D6 y& _2 X, v, Q% m
6 J j2 h* L" p) j/ E while(1)
* |" @6 Y; u/ ]* o6 [ {$ y) K) z7 b8 x4 q% h q) J+ r
read_MSG_buffer(mem);: b9 `5 o0 B& T, ]: r) f
} 5 e, a9 `! X0 b, R* ?
}4 P, h8 `7 e( C9 i) m* L, V
* G* Y2 j4 e( @5 i! }! `; v
void read_MSG_buffer(int *baseaddr)7 c5 i- V8 T6 d' ~# M. T1 J
{
1 u) d8 V' }4 O" Q; l8 C4 F pRX_MSG_PROTOCOL pshreRAM = NULL;8 { S# b3 n& N: Q9 M, v3 U5 g
' \% {! _5 s; h+ R4 ]$ {4 D
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ ]+ d8 @( }- j: w- b# k
% i3 L5 r Z; \2 i8 a7 ?, O' K if(pshreRAM->packet_cout != count_copy)# A; D' P- y, a- U. K* C# K
{; j5 Z, S4 {0 W6 l( d
printf("a is %d\n", pshreRAM->a);
! w6 P/ y" I1 ^. B( r0 }% s3 R printf("b is %d\n", pshreRAM->b);
, [- F( i" u4 N6 a printf("count is %d\n", pshreRAM->packet_cout);
( I& r) P( R D/ Y) s. b2 x8 M% {5 B count_copy = pshreRAM->packet_cout;
! S: {. i8 K: L& k7 {( B }
0 A, R; U( F8 z# Z5 E1 e9 M else
, m9 N8 b s6 V' F! l {1 P/ K8 I* g9 Z/ W2 \
printf("No effective message!\n");
# R, x4 d o: `- a) Y$ E4 | }1 F3 C% G9 g6 }0 R, g! Y) x* s$ r+ [
}
6 V2 F0 b, Y0 f3 z
. |6 T4 l4 B+ H* x$ {1 j' ^ u没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ a0 C, C- V) \4 [! D4 d v% T
, l% k8 ~7 C. b7 |9 L( \9 C4 R! X; e# u7 I
8 v, @) Z. D1 b0 L7 r6 q% [/ H
% E% n% v7 F; D. b) l1 J3 [
|
|