|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) W2 h* c# S2 G- B) c$ e. ~: _: z5 p' g4 v
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
# b4 b7 D* Q" u% a#include <unistd.h>) O8 f* m; K7 s3 r0 X8 U
#include <sys/mman.h>
9 u% ~0 v; e/ |3 S#include <sys/types.h>- f9 c4 E; p0 P. L8 B2 S# k
#include <fcntl.h>; D& q* o2 O8 i4 E% Y8 _+ E
0 S, e) c! K3 J- k! ~# C4 V#define SHAER_RAM_BASE_ADDR (0x80000000) ( ?' U6 I- E& L0 U
$ a% }3 W4 F) b* v$ V
typedef struct
& z$ ~! F# M1 M; M) O{
0 Y F& v$ x1 ?* |% J unsigned int a;" A- F W; y, c) u( F
unsigned int b;
+ V3 N T5 k" r( n, e5 N p unsigned int packet_cout;
- L1 q( \( k% t3 ^5 ^: o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 Y6 S$ y7 E/ N2 }) w. R7 _. m' Z; q' t1 l6 c3 [8 w+ w$ h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 G: y& n" w! M/ t0 B9 o# M8 V: junsigned int count_copy = 0;
" i) y8 h3 t- @" J1 ^5 u2 m# o# M' |" W' M* t9 e
5 q1 k9 q! R9 R# b( a7 _int main()
: o5 w, h" m% r# |6 t8 K8 G{! ?$ C7 |9 ^1 u2 H
pRX_MSG_PROTOCOL pshreRAM = NULL;8 s7 n0 R2 O4 d! |/ B; _+ H$ o8 E
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 \/ j0 M$ N$ e9 M) q6 L- e0 Q) }
I% h% Z. @ Z# U* E% m7 i while(1)
3 o8 i! v( B- G {
1 w0 b3 G) n2 b q o" | read_MSG_buffer(pshreRAM);
H7 H9 n/ s% ?* e } $ g% [" R9 M, D+ r' c/ R
}7 @# O) k8 {+ z7 s4 w ^! s
" S2 t. X5 x( C3 S0 D' Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)2 C. x* [! F' v. h; I& S6 ^$ p3 W
{
) M7 D0 K# u' ~ RX_MSG_PROTOCOL buf;
) O* E9 U+ l( Z3 i ! y& n6 B7 b/ }, n8 V1 v
buf.a = pshreRAM->a;
' q) E$ p( Z. z buf.b = pshreRAM->b;
' x) N3 z. `/ @" i/ h& J( ] buf.packet_cout = pshreRAM->packet_cout;" i7 _7 K9 c0 L4 \# o% M
3 B3 r3 ^8 V" W7 H9 p/ b if(buf.packet_cout != count_copy)$ v" @9 y& h4 R4 Y: v$ a U9 c
{
1 i( F- k' p! v" q7 s& v% `( A3 f printf("a is %d\n", buf.a);0 o; A9 A& B) O3 Z% b
printf("b is %d\n", buf.b);
/ P$ p# }# p. L8 ^) ^ printf("count is %d\n", buf.packet_cout); O7 G* }; ^/ {% p/ {2 Z
count_copy = buf.packet_cout;) H: h0 ]) O+ H, P
}
$ m: N( v1 K, t/ J else8 @- s9 D' P" ~: `. `
{
5 q+ m+ p. @( ?; g# | printf("No effective message!");& I1 i2 ?0 a* _- A1 z% e" ?5 Q+ q
}4 U) [0 x9 Z- ^- u" H
}0 }# }1 W; e4 F, X% v; F
$ v/ Z |4 `4 F) d( V& V5 G) N
3 T! N# c5 ?& \* D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 e: `" O+ H/ D使用下面代码,对内存使用了mmap函数后: A q+ z F! I
#include <stdio.h>: S- n3 B4 D, i5 K# ^
#include <unistd.h>) J2 p! g! T- I6 w! R
#include <sys/mman.h>6 a9 h: J0 i, W' X0 {/ f1 k
#include <sys/types.h># h1 V3 M7 M6 z. |
#include <fcntl.h>- G1 x A- P }7 W4 X2 b" n9 f5 Y* j
/ S+ _4 U2 R. `- Z. D! g
#define SHAER_RAM_BASE_ADDR (0x80000000)
# T- |* P6 \; l$ A( _; U#define SHAER_RAM_SIZE (0x20000)
- u6 N V x/ m+ y8 ~
* w" {7 W4 ]+ P$ m$ M. {typedef struct/ A* ~1 k5 f, X3 k( c! v! @
{5 @. ?; J- Z) L6 F5 C
unsigned int a;5 z/ ~$ R3 x. `7 _. \% \5 H& n
unsigned int b;
. b0 {3 q- {4 R unsigned int packet_cout;# ] F" r5 K9 |0 r2 e# n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 t* ?5 k8 L% ^% i0 I+ r: r9 X9 O
8 P) v0 h+ @: T! q5 _void read_MSG_buffer(int *baseaddr);
, t; A# R/ ?( ^, _* n- i+ zunsigned int count_copy = 0;6 g9 n' \- c. ^" M0 {
$ l1 s, Y9 H" @
int main()
( }% t8 x; W; q, D) |; }9 u/ u* t{: `" c( l. H4 W9 c; D. o3 {, Q
int fd;+ L4 F. @5 e$ j9 [
int *mem = NULL;
; c* r! \0 S* C! |6 t* R9 o' P* k; q0 E
if((fd = open("/dev/mem", O_RDWR)) <0)
! {4 Q- r/ M- O) J2 { t- t0 E8 s {
. T7 P" T1 ?- S$ T perror("open error");
6 q0 ], _) c S0 ? return -1;! ~% d! w1 S4 |8 b8 |
}3 N- x4 U' S$ X- w5 ^5 o t
) K2 U8 n3 Q' e- x( E mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 y6 k1 W, i0 Q# D$ l. O: t- R, I' F
. o. G% Q* M3 w- w. J while(1)
1 E+ p6 L! v7 A6 B {9 j1 o. j0 C( h& n
read_MSG_buffer(mem);
5 P4 q' G5 q4 X0 Q } * G9 r: Y, H7 C3 Y/ S9 D
}
' E* @! N" s& }( l2 S7 U. }9 |1 L% O8 h( f* z
void read_MSG_buffer(int *baseaddr)
, r: l# `8 u7 k' U{' G# G: d, Y$ |5 [, m) y
pRX_MSG_PROTOCOL pshreRAM = NULL;
% k% N! F# A6 X& Q o- E% |( J/ U1 z, W1 h4 B S Y5 w
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- i2 V1 u% \3 f+ R) f0 N
' s% }' y9 y3 I' |! b
if(pshreRAM->packet_cout != count_copy)
; B3 v! {4 j; U {
/ _- O N& S" M }" @1 b- j printf("a is %d\n", pshreRAM->a);1 J/ @' U6 c. k) I" k4 X5 n' N, X
printf("b is %d\n", pshreRAM->b);: F" j2 m8 q# v( W; T! i* i
printf("count is %d\n", pshreRAM->packet_cout);
{; G; O( g8 q9 P count_copy = pshreRAM->packet_cout;
! U; v. A3 v1 S; p. \ }& P b8 ^/ d$ S0 q0 D" l
else+ [9 T2 F% X3 j& `) B4 U* A4 r
{" u' g% u# d" E
printf("No effective message!\n");
+ F) ? A& |4 K1 ?" \) t, s }
$ _. a& G: j# ?}
& n' d" f2 u& @6 c5 u* R: O5 [3 h
+ p* h d: U; Y9 T没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
J* I& t3 [/ {! r, V' c5 X7 b, Q+ y; m( H4 M
3 j! n$ D" F. I4 c( i' R" p8 W2 b
9 W) |- o6 n9 S9 A t8 @. p. }/ R' P0 V" s6 y9 t w1 X, ]! N- D
|
|