|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 K) W6 c: G3 K4 t
. Q4 p9 J7 _# E: z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 B; {- E2 z ` r- r#include <unistd.h>
9 _3 ?! N& x5 s# Y- l#include <sys/mman.h>
: u7 X5 F- j0 S5 m2 m#include <sys/types.h>
& K; v+ k' ? P. A$ U#include <fcntl.h>
# ]/ h# t4 k) u; l7 A% p0 w9 V" J+ J8 {7 l% j. z6 R8 x% J
#define SHAER_RAM_BASE_ADDR (0x80000000)
. I( v7 j0 b; o" O) N' D' l
- u, |" r9 F- h# j3 a7 Otypedef struct
& [4 R" ~5 q& R' x{
" a4 x% m' ?, I4 l/ e+ Z unsigned int a;
! Z. F5 @" i- o" j( w; E7 y3 U unsigned int b;
0 @( f, W* e" }# Z; m unsigned int packet_cout;: v+ v4 H3 A( j8 o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
Y" Q) B8 k8 ^3 D! J9 Y
( y+ f% I, [% D! c( ]& Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 T4 M3 I; {! w0 `unsigned int count_copy = 0;
7 g* V( L. x& S3 I& O( }. g5 `+ n* V( q
' D& B8 c: o/ S" N5 L) `4 Rint main()* Y5 D; L, \5 x% [: m r0 e
{/ b/ G1 v* n+ A/ A0 ], v
pRX_MSG_PROTOCOL pshreRAM = NULL;
* T: x q# M+ k! k# t pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ P: E9 d4 j3 K2 ~* c; l
' Q* N- m$ Y3 @6 n) B while(1)
) {1 w* y4 l+ f: k. _ {' F- }- g' b- ?- w
read_MSG_buffer(pshreRAM);( E$ [* \* ?5 Q
}
* K4 g2 C3 l2 p. f) n}
3 v( B# n4 T' b: S7 C& s. h; b
3 x. P" @6 I. S0 _+ C: y) s2 nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 O. O% M L7 q) k
{
- t, e! s1 W" C8 O% ^2 J' D RX_MSG_PROTOCOL buf;
! \% P+ c/ r6 R ' V) `* Q% n' N7 _; x
buf.a = pshreRAM->a;
9 ^5 D7 C3 @: u* k2 B. } buf.b = pshreRAM->b;& m4 @% \' F$ A8 P! }
buf.packet_cout = pshreRAM->packet_cout;
; o! |! a1 O- \7 m- x
h8 e- c$ Q; Z' E if(buf.packet_cout != count_copy)
! b' }1 O2 c3 v0 W. Y {+ D, l; Z3 Y4 B$ L% u
printf("a is %d\n", buf.a);" F7 e$ B6 [2 I% Q7 }; F2 K
printf("b is %d\n", buf.b);
" i0 B: U9 T: b* _& \1 E printf("count is %d\n", buf.packet_cout);
' q4 o8 }$ d u7 M% Y count_copy = buf.packet_cout;
. B/ @3 b0 e5 S% b) x0 s }
9 I1 A. r! V4 x* C7 `0 ` else
5 q4 Y& E/ g8 k7 d! G {" j/ t4 {7 |& U% M9 b1 ^& `
printf("No effective message!");0 o% d7 ^7 D6 M; d
}$ W- W* m- A5 W1 e" m3 u
}5 G6 u' a9 Q% z k
$ {7 k+ [7 |, \5 k0 y o- R) W! R, l6 s5 z4 c9 S. U( m
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。* h8 {/ J0 k' e
使用下面代码,对内存使用了mmap函数后:; E2 e, A* A3 H+ d6 H0 j
#include <stdio.h>
[7 q$ B% Y0 a2 `6 k#include <unistd.h>& M0 m, {9 h* d; V- F
#include <sys/mman.h>$ y) F. x3 L+ n
#include <sys/types.h>7 O a* f8 O4 q2 Q+ J
#include <fcntl.h>
, k4 f; L" u6 R- w7 o' R6 A1 \- J c H/ G; }, d( K" u
#define SHAER_RAM_BASE_ADDR (0x80000000)1 \, y# i4 L) i
#define SHAER_RAM_SIZE (0x20000)
( v g; t! }) U; t- H/ ~% W3 r4 b& r) Z0 _. j
typedef struct
, T, ~9 X, X# G3 q, \{
5 v- H s/ L6 L5 q unsigned int a;
9 P9 x4 [2 p0 H( Q* v+ O F" @ unsigned int b;
: j! g) z& M; I7 o4 l unsigned int packet_cout;
: q1 u: ?0 D' F% r7 q" s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% w5 K0 B& ?" Z6 R0 g$ w
8 _. S* [* f$ o' [$ Q" u4 kvoid read_MSG_buffer(int *baseaddr);
5 Y/ a7 E. j+ |% b5 ^; M2 Ounsigned int count_copy = 0;8 P0 P3 R; n$ y9 J
; A7 R, s7 W. \+ [, w+ a Gint main(); `5 v8 r# [0 g5 v# T
{7 j- f+ f5 j% m/ X5 e% @
int fd;
2 `( j4 H% u1 {( T int *mem = NULL;; u4 Q; A, ~0 @9 A B0 j d
. d# B' v* U, ?2 }
if((fd = open("/dev/mem", O_RDWR)) <0)& x8 c; d/ [' i4 Q: g
{. @. v) y+ I Q8 J9 z7 L
perror("open error");! g% k3 f \0 o/ o7 A1 O4 ~
return -1;
% g; G; }0 \8 R6 K; c0 N }) Y6 \+ P# ~5 R7 R+ @% N
# ]" z( \& z& r2 i* v6 x mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- X, X2 L. h% O
9 U& s; i5 ^8 ~+ V/ B- ~# E5 ` s) E5 | while(1)
- D% ? b4 c& I" F0 R' ~ {+ ^0 z" u( @; j
read_MSG_buffer(mem);
9 K! L) M- a$ K6 x/ r9 M# u& N }
6 u6 N- \3 H2 ^1 x}. t0 X* J6 h# O# B
* C r8 P! _5 n1 Ovoid read_MSG_buffer(int *baseaddr)4 |, S, Q$ g: @! U
{
3 M. h; v. S: D* p B8 ^ i/ N' E pRX_MSG_PROTOCOL pshreRAM = NULL;2 G U9 j! Y0 M2 q
+ N, c6 D9 p9 u5 e5 F. K
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! D' ]. H7 y+ ]2 ]: o8 @
; m, ` ]0 t% Q4 A if(pshreRAM->packet_cout != count_copy)
, _- i+ Y+ A6 P3 D1 p {$ Y& @( e+ c* M) d
printf("a is %d\n", pshreRAM->a);) ^0 k+ ]3 _9 z5 R4 {! ~2 t$ Z
printf("b is %d\n", pshreRAM->b);
6 N& ]* d+ X4 s printf("count is %d\n", pshreRAM->packet_cout);* A7 N; d! d! y( f1 T
count_copy = pshreRAM->packet_cout;
# b o) n# O, S3 S2 y }
! R( a2 ^" T; ~$ Y: \) {* `4 y. Z else
0 ~7 g2 [7 w5 Q" a5 h9 o2 B" R {
6 h* g) J# m; ^# M printf("No effective message!\n");; M5 v0 G6 l1 f4 R. z) h4 B$ p; ~
}3 N( H9 o& J9 @+ j$ ?
}
; f& {4 _- @+ m" s3 O2 N" A# z: T1 \4 p$ K
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% \: t% |' P" z( C/ t% c: X0 b& z0 f
) I1 g. p( Z7 K% f: c' V) B' \! W# u0 s3 B4 q
5 B. W1 L- {% f/ X6 u T
& N0 n/ H) h. T4 c' x8 O4 u |
|