|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ Z( j/ L* \ l6 V2 y: t- k2 H5 r7 c6 }
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. E$ E; N$ H+ N# O+ \; v2 G
#include <unistd.h>5 _* d' a! N& K$ f. }6 A( j
#include <sys/mman.h>
$ R' \/ U$ p. P1 O# N8 [#include <sys/types.h>
6 P5 A9 h0 }# a) t( ]9 x) F9 t#include <fcntl.h>
A! y5 g+ d3 w& R9 `; V
& F$ |0 N) ^& W. d) c; }#define SHAER_RAM_BASE_ADDR (0x80000000) $ S: L2 B* d% {) o" A
0 H1 e# @5 ^ jtypedef struct+ F! ]% ^3 i! R, w2 D! r
{
) u7 {3 q5 E2 x5 _0 x' G unsigned int a;
- G- x# L2 J% p+ B3 A3 V unsigned int b;7 r! z% E' n( a
unsigned int packet_cout;( O1 v1 r% z/ e5 i- k# p; b# m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) I5 `& }5 j3 T" i" v' J p
5 p& c! g# ^; o/ zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 s0 m$ H# F& S/ ~2 _unsigned int count_copy = 0;
, g" O. \1 L; m) y
6 {: N* @0 G# f' ?5 Q
3 \! d1 s* o6 _int main()
' W: T4 Y: ?8 L{8 S3 p1 M# Z1 r/ a4 ]( C( j
pRX_MSG_PROTOCOL pshreRAM = NULL;6 N! m% |8 a, w4 n5 Q2 J( i/ B
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( H* Z, b) N ?
: H Z7 }/ H% i2 T, C6 g- x g: F7 t while(1)
* z3 R+ N8 P, _* j1 g( ^0 ~' e {- N7 J- U' ^. x
read_MSG_buffer(pshreRAM);; h" _* O% D5 O
} 7 Z, P3 N$ ] F% ]3 H) c R4 G
}
4 N9 t: h& c( u) K% D3 J m
/ v( X7 E' k! L+ o+ ]+ M2 u) K& qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' k4 i- C. l' P- Y{
+ e+ R: l3 X8 I" A/ _ RX_MSG_PROTOCOL buf;$ R6 S1 P W! u' r
, W, c+ P0 }/ c* t6 S5 M# I buf.a = pshreRAM->a;8 u8 H2 u0 n4 x$ z
buf.b = pshreRAM->b;% U h% v' [. F3 Q
buf.packet_cout = pshreRAM->packet_cout;
$ E7 q7 v2 W' ` , y+ D; p4 S9 F7 \/ F p% C
if(buf.packet_cout != count_copy)$ i3 u: \ ^' d8 d0 _% L
{' @4 Y; A/ E4 c; x! s/ c
printf("a is %d\n", buf.a);
( q( l+ i' L7 X printf("b is %d\n", buf.b);1 Z8 m5 H& }& a; N, O% r. J: P% z" N
printf("count is %d\n", buf.packet_cout);
" h2 y9 Z- e! E) f count_copy = buf.packet_cout;. |9 i/ ]" K$ P2 |9 Y
}8 R: ?& x( Q# L; F
else
1 o7 g3 p) T5 r- ?3 o# F1 e8 p7 A! {& i {
# ]+ F& u4 [# l( I7 o printf("No effective message!");7 A! C3 m k8 a1 N a3 b
}
, ?& g% N" b0 p. W4 d3 u0 r b5 Z; c}) Y0 J2 h8 `% U& P; y4 v
( r% z L& U/ k) L
5 g. u! a8 E) w# M9 }3 v7 L5 d
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# u$ `6 _9 P7 K8 l, L2 A
使用下面代码,对内存使用了mmap函数后:
H& h8 @/ u- K#include <stdio.h>) D, D$ h0 [: x7 R- @. x: r
#include <unistd.h>
6 O/ w7 Q) u+ @" c5 q" K2 }0 \#include <sys/mman.h>1 s0 ~* {, Q& i9 S* C8 n) e1 ?6 I
#include <sys/types.h>, a2 _: p+ s8 L
#include <fcntl.h>4 s/ B3 N5 w5 N8 G7 q+ ?* J
' j0 J/ Y/ X/ p8 J& g' g#define SHAER_RAM_BASE_ADDR (0x80000000)
* q5 c" h) V7 R#define SHAER_RAM_SIZE (0x20000)
$ {& D2 X d" T# L, T0 T- u& g+ \# B3 t5 f& t
typedef struct" K" } A& H K+ I
{" l" v8 t7 E$ c: M4 b$ W% c
unsigned int a;& j7 k) d! b2 i. g0 _; d& L3 b" a* G
unsigned int b;0 I+ r# ^1 Y2 ^- f- k
unsigned int packet_cout;! ^& m6 \; }9 x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& ` n5 R! e1 X2 [- W- t
4 d3 F2 W& T; m2 ~/ ~void read_MSG_buffer(int *baseaddr);
( v, n( P" l- I5 n4 Lunsigned int count_copy = 0;
, g% i: {& Z+ m0 c4 K( s0 @0 b1 ?: E
6 I# X' r! J$ X8 U6 i9 ~3 ?6 J6 ^6 W! eint main()- F% m% P9 U3 _: D3 W! l# P
{
. A( ^" F. O/ W6 c- O4 ?. c0 a/ v int fd;
! e$ v$ g: h! Q0 R& O int *mem = NULL; o- P+ f3 g$ x" c3 Y% c
5 }+ |/ q3 o3 u# p. d0 Q
if((fd = open("/dev/mem", O_RDWR)) <0)
% M4 H, W: S5 t- c v" t p {
$ g* j3 K7 R5 Q" i3 M; ?% |$ | perror("open error");
* ~+ |" [' B" e4 Q8 B return -1; z5 F% n5 N$ N- T. E
}, e3 g" v# ^; m/ j) f& g L
5 q" X7 U; ]) D2 { mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 g1 E5 r. b* _
+ I! ?5 ?& z9 U: R& C7 }
while(1)
! e# _1 `$ f2 v% x {% h# b' Y9 n- ^/ m ?, d& {
read_MSG_buffer(mem);
" T8 C X7 U0 A& F' j3 Q2 D }
1 e8 E: h0 t; @" W+ e- L}
" b6 a& e+ C+ M. P! F& G: w$ ]. ]7 V- _) v$ ^2 }. q4 T1 \7 V* v
void read_MSG_buffer(int *baseaddr)# J; n9 T9 m3 Q# O& k A
{8 x& s2 }" n6 _/ U" \" t3 c
pRX_MSG_PROTOCOL pshreRAM = NULL;
& |5 c8 r" Z8 [. r. l
+ _- h3 Z' I w5 \1 } pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 v" J8 R/ R7 F& y- I5 g6 N! ?% c
6 k; x" c. m4 v0 r$ \0 T if(pshreRAM->packet_cout != count_copy)
. R) `2 E1 w' R2 l- V w {
4 O6 I1 j$ m- Y7 w( x4 c+ j+ r. c printf("a is %d\n", pshreRAM->a);
q4 k; P1 h2 e printf("b is %d\n", pshreRAM->b);7 z+ G& f! u5 Y1 \; r
printf("count is %d\n", pshreRAM->packet_cout);
. Y9 G3 z9 S% Q) P0 J+ x/ V# M! ~0 Z& } count_copy = pshreRAM->packet_cout;. _2 C2 y$ c# J: I1 M, K0 t
}( J3 x/ ^; ]% e" x5 \" I3 e" P& t, v+ c
else2 q n! E; t) i: X6 M: l
{5 D9 d& w, z& A5 a$ a' J7 b% k
printf("No effective message!\n");; G# }8 [/ |6 y: _: y/ C0 f
}. `6 L7 x/ t. s" _
}7 d: G, A, J( V
. n* S9 _" P; `2 P$ O7 `( d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" m* @5 n! Y' `9 f3 q; J
$ L2 I' v ~; N! N4 F1 i( ?2 L5 ?9 ^" V
( K- I% e$ j. r- H5 t/ [
, a. m2 Q/ F4 X' a8 O Y
|
|