|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! I- [1 t' j5 N6 \- A, k% A9 j
6 a x% K& }7 X8 N
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: R! z/ E0 Q4 O# g5 |# m
#include <unistd.h>. A: c1 L& `, p7 ?! S2 }9 M
#include <sys/mman.h>2 n; j* _+ v1 q% d/ x/ j
#include <sys/types.h>
% b0 P6 T+ g; T; m, G#include <fcntl.h>
* E; N0 |+ K c, A! m- p) N, j+ h s+ G7 d" H: B1 T
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 j; G8 V. {6 d' X0 i# |8 @5 Z% ]" c( j( q9 H
typedef struct& a' d$ r" a7 V8 ^1 H
{/ W: }6 L) q. n( _- t
unsigned int a;
9 Y5 o( l$ u" M6 Z$ Y unsigned int b;, K- y) o) ~6 ?7 x
unsigned int packet_cout;
7 e: \. a* F" [8 @' N# T! Y7 e# z3 _& w}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 p t. o' X7 x4 K+ k: c
: G6 i6 I, {7 i3 v. b) A% A5 m1 R3 lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 d# e& `7 R$ T: v6 V1 V
unsigned int count_copy = 0;
: @3 |; W9 d( R7 w1 U6 |6 F4 v; n [$ `( m; B; }: E2 J
- h4 \, }$ @! D- ]* `5 X
int main()7 h" t$ m- Q7 c" {: K
{
3 a1 V; @8 }1 M6 ] pRX_MSG_PROTOCOL pshreRAM = NULL;# _/ ^# ^1 N" t* M/ ]/ |
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 k5 _$ y2 R- B% |! `* {
7 \) q/ L5 ?1 e7 k while(1)
# ?/ A- J7 t p {
9 z+ H5 U4 ~ F4 j" w read_MSG_buffer(pshreRAM);
2 |- |5 @2 f* f) b. u4 W2 M5 M+ e }
/ d4 o) O p `: b; P}
" N% o% d) g9 d, m- T! h" R9 w6 K/ t# I& F$ j8 |6 l# Q. V
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), G, z; C- f0 H, J2 ?2 F2 D
{6 R# G5 O, s6 g: v
RX_MSG_PROTOCOL buf;) Z+ j1 k: P5 d% N8 O
, u0 C# y( { L* W7 D( n0 T
buf.a = pshreRAM->a;
5 }2 U+ i. h& _ buf.b = pshreRAM->b;. W; W. E; ^5 Q/ m7 f* P6 ]
buf.packet_cout = pshreRAM->packet_cout;, p- H- \$ Z! c5 ^7 e& `$ M
" h' W5 s( ?$ |1 }0 A if(buf.packet_cout != count_copy); `4 W: ^9 ~/ L. r
{
8 o) P2 O- l( \8 Q printf("a is %d\n", buf.a);
' n( V/ g+ r3 i: W9 w printf("b is %d\n", buf.b);
$ C: m: `$ H# B1 B1 l, r printf("count is %d\n", buf.packet_cout);# X; r' Y6 ^4 a+ u3 t
count_copy = buf.packet_cout;) y9 q; f0 J# ?# g6 F% d
}5 J; [. e) I4 W: I9 \5 p! g5 A
else6 ]8 q& B F' Z9 Q2 r& O
{) f0 o& n6 x9 Q0 w
printf("No effective message!");8 Y. ^% `1 V7 N2 e
}
( C6 n3 k% H$ b6 g6 |}8 s1 U* k" R$ C/ {& |5 m
- `) Y$ A, z6 `4 U+ s
7 M4 y- j6 @% S1 G) J
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 o5 C' X/ ^, T0 u) P7 N% ~. z使用下面代码,对内存使用了mmap函数后:3 j: c- s* _& V
#include <stdio.h>
, B* E7 [0 `( E# e+ U4 [#include <unistd.h>
& m8 Q+ K0 L! \& h6 V( H6 l#include <sys/mman.h>- [/ d% b2 w9 }# H, B/ s3 d! e
#include <sys/types.h>( L# ^4 z6 ?: Y5 a, U+ E- `
#include <fcntl.h>7 `7 D1 s% H" L9 B
) D$ P; d2 A8 R* W5 T# l
#define SHAER_RAM_BASE_ADDR (0x80000000)- K, y0 q, x" m; K' }" a) V
#define SHAER_RAM_SIZE (0x20000)
# W6 L2 r7 y% ]9 p. }
- c) l3 n0 Y. }* z9 c/ f. ] }typedef struct* u- ~2 d7 j9 j4 z3 D9 o
{
. C7 e# ]7 b6 v; F unsigned int a;9 b( v4 i' Y* p& p# q
unsigned int b;
J0 t" D( P& ^& B unsigned int packet_cout;
) N X" g+ p6 i, q" r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 @5 O* Q6 F. [( w2 f3 w. L
! \ P3 e T, B5 X9 c+ n) _+ Wvoid read_MSG_buffer(int *baseaddr);0 A+ s# e8 w1 V& f0 T
unsigned int count_copy = 0;9 \* Y1 J) V3 R! S! f% x! f: r+ N$ O
2 ]! Z7 h/ Z o" O# ]0 Rint main()& f& v0 K% U+ j9 j. R: n. ^
{( E0 W; ^, i8 X, z9 n2 O& {
int fd;
4 J4 f+ Y/ j2 i, W0 ? int *mem = NULL;# j3 Z* {4 i6 B0 F- F/ H
- g5 o( m8 N( E) L- ]' t/ i if((fd = open("/dev/mem", O_RDWR)) <0)) S! V4 L+ V! \* k: z9 r$ n
{3 `: b c9 s. z$ V- c
perror("open error");( y3 h8 e' c( l! p3 y; o- w
return -1;, q1 h# d/ J7 m7 G# A) J" Z
}5 O ]) T* I0 M9 j2 e6 {
# }) D1 K7 m, q4 L* D3 i mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 e6 M1 K4 R M9 K0 T
, l& Q+ Q/ v1 F while(1)" K% _: v5 E# E6 }1 w- f" W, q7 x
{. ]( K |* K5 x. q
read_MSG_buffer(mem);$ ^* w' z9 K. _2 g2 ]' G+ s/ c
}
# [3 y$ g$ V4 W/ d}5 N3 [7 S/ D' a7 W8 ]
4 a- y5 f8 h6 ~) Y9 D
void read_MSG_buffer(int *baseaddr)
) \: ^& f: z2 J{
1 e: C% I/ \6 i pRX_MSG_PROTOCOL pshreRAM = NULL;
) X) [6 s; s! Q% I7 y# f/ r f. x4 `/ I- S
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 h# h. Q2 o' n, c' G; S* H2 T; W9 W4 B: ?
if(pshreRAM->packet_cout != count_copy)2 m2 i, [; v4 W3 ~
{
S( y9 w l! j: P* [ printf("a is %d\n", pshreRAM->a);
3 U- G, P9 Q5 X printf("b is %d\n", pshreRAM->b);: E% `8 p" [9 R( v
printf("count is %d\n", pshreRAM->packet_cout);- [% l& k* M% d; A" J) G% U9 ]1 B6 T
count_copy = pshreRAM->packet_cout; p8 d) m9 f8 e
}1 x, u5 f/ }& G/ z9 T o2 j& L' W# K
else9 t! x6 b' X! B# y4 m9 _6 Q
{ G" W' C. ?4 w, g
printf("No effective message!\n");
) m/ W3 s5 U" q7 O$ H4 ^. q! G }
1 N! c2 V/ |' H9 p+ z}) ?6 s% Y2 F# Z) c6 ?
* ?: W8 {+ Y1 k3 u没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 ?8 q. B1 G. N' e' Y2 R/ l5 x7 z f! Q
5 ?+ P5 }# V2 t& r7 t9 S( Z
+ U' ]( H b' M/ w# N
3 d3 z0 J# E4 s9 ^/ a |
|