|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- g. r8 Q) D" l5 [
" r( g) F" D$ t- o8 ^9 J5 aOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h> a4 @! ]9 R* b- V7 O: L
#include <unistd.h>
5 x2 F4 M$ I: [: Q1 Y: v6 s#include <sys/mman.h>
$ {7 A1 N8 U1 B" a% K* K7 d#include <sys/types.h>/ R+ F6 F% p7 E* e
#include <fcntl.h>+ g# d- W4 l$ S: X1 Q
: \$ N) i4 {+ {5 w" m" q' N/ A- u#define SHAER_RAM_BASE_ADDR (0x80000000) , o( A* ?4 Z" E9 b
1 D' [0 q1 i+ e7 y) C4 I
typedef struct
, c' O; K! n% Y* A B{
4 o; S: O6 Z6 l! a: |- c4 v unsigned int a;
5 F9 `- o9 N7 U* A; _8 z unsigned int b;
* h! b; G I, ]# m+ M; ? unsigned int packet_cout;! y3 y3 O" L e- s! h9 [3 Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 I! h3 @5 u% Y( y) A4 H7 D: d1 Q5 k) y" H/ [/ r* ^2 M+ a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 w/ J& {8 o9 n9 k& sunsigned int count_copy = 0;# v7 l ^$ k6 j! R% _
& X; E% }4 K9 @; t+ W8 G% \8 K7 j; i* y/ a. R) T* b4 ]
int main()& J: I" N7 m. O! A1 \7 V8 r
{% ~: _: a& S3 N$ N
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 F. I# s# E3 p4 Y" ~' d pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# b3 H# u% A' y4 U4 t4 l( f0 b' ]1 e4 k& _, `% C
while(1)2 e1 A6 T0 x7 q
{
: ~& E$ Y) f$ e! g read_MSG_buffer(pshreRAM);
0 M8 Y; z! g6 }! J& W }
2 l% Y: K [. O/ V% z" r}
2 P- e, ~: B+ e4 {/ P) l7 X6 e
( p* S) z+ Q; R( tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ H# b6 q8 b% o3 E1 p9 X$ a+ T
{) C- v2 h, B. {$ f! ~2 ~, x* A$ g! ]
RX_MSG_PROTOCOL buf;
4 {# ]1 G; P( e' R- p1 F
+ C5 O, \7 X5 a- X) m buf.a = pshreRAM->a;
+ p. O; O) h% u6 B# o. F buf.b = pshreRAM->b;
* ~( _# o5 }' t) f- L- H buf.packet_cout = pshreRAM->packet_cout;
: y7 u& o) o4 j8 ^. L* Y) C$ E/ Z ! o- O, B1 B: q( e1 p8 T% e4 [2 O) [( y
if(buf.packet_cout != count_copy)
6 r$ [: g/ I: b0 A# g1 d {) X+ M7 R1 Z# ~" F
printf("a is %d\n", buf.a);
+ U; M- k6 e8 X$ h& [, m/ v% l printf("b is %d\n", buf.b);1 a C) |7 [ w0 L3 e+ E& [
printf("count is %d\n", buf.packet_cout);; A- j) i' s S2 f- Z5 a6 g
count_copy = buf.packet_cout;
% D! f. U9 r3 f, [# s0 x6 J }6 \4 y1 W3 T0 y) B( l% V+ n+ q) I9 H9 M
else, h) I w8 Q4 X4 O
{
8 v9 J, }) u& e& W printf("No effective message!");
, N6 j" O" r0 ?8 h }
9 E0 g/ c( X4 b0 L! |- T D& ], w/ H}. M6 n& W5 O0 a+ k# o( R
" k7 w/ P" [9 u; |2 k. c- J4 [" ]4 Q! B# p. s; D8 h
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 |8 ~4 f' D. p s8 k4 T U- ^, V
使用下面代码,对内存使用了mmap函数后:
: q" O) o* E) G) S- O+ N#include <stdio.h>* o# Y3 P' p, U/ D
#include <unistd.h>
$ b/ O* @, M" ^, f, Y; v$ J#include <sys/mman.h>+ N) Y$ v: q) w* t
#include <sys/types.h>& L" p d: i$ @2 N6 ]9 v( L4 `5 ~& [# X
#include <fcntl.h>, N/ ?: \+ a# ?$ n4 v5 P
3 E& k, m- E/ {* W; M+ G# k7 Z. S
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 t$ f1 d5 a/ _8 c7 X0 x% |8 ~#define SHAER_RAM_SIZE (0x20000) 9 Y6 R6 |& R2 z* T6 e! U5 d9 [
6 k( W( U# [5 `, V# wtypedef struct
3 N* k# U- f7 x6 J& D' g5 ]* A4 s5 ]{7 K7 l a# z$ ~0 A
unsigned int a;
1 x y$ k7 K- u$ j, h$ f7 f unsigned int b;& k6 V r/ S/ |, ?1 S! f" Z# ~
unsigned int packet_cout;
* f' d6 O$ [6 J v0 Z/ R2 g}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ r$ s% F( X8 ^' J7 q- x. p3 l
: A/ k+ F. p0 a" P7 ~, Mvoid read_MSG_buffer(int *baseaddr);
: K4 C5 u3 Y* u* K! m: wunsigned int count_copy = 0;
. K1 O8 I' Q8 Z+ {, V: K! m+ u& I1 {! H- e( Q- T# l2 C' e, Z
int main()0 ^3 L) O( ^0 A
{
# `* m/ X {. [& D! ? int fd;
1 x, U, B6 H8 h$ }- e7 ?+ ^, J6 d int *mem = NULL;8 X2 k2 E7 q" K
/ x( j' \2 ~2 y: d$ Y3 W8 i1 f if((fd = open("/dev/mem", O_RDWR)) <0)
. s( b. U$ J9 S, e4 A {( f% h' p- E7 j$ J, k
perror("open error"); T; W# e. Q! O/ e5 ]% ^: u
return -1;
" B! X* ^- T) F }
2 e7 f# g! U7 h# {, l O- N
: l& W7 f# a- ^+ P1 t) N/ i* \ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 ?- p& ~4 w9 B" O' X% @
' P: p4 O* B, V- d
while(1)
" b) b E8 ~) X, Q {; t! w" J n+ v3 [
read_MSG_buffer(mem);
! @1 k7 w: x3 ]4 c% c: g }
- W+ u4 a* K* r% L- G}0 V3 z! w" g) V
- u2 l) R& U- E6 f4 q* Pvoid read_MSG_buffer(int *baseaddr)% }) r4 o ?5 h2 n
{
0 Z- c7 l0 R3 n; _7 S0 S7 C2 u pRX_MSG_PROTOCOL pshreRAM = NULL;4 M) o) p( Y: q0 m% t: F
5 O' G4 m5 ^" f: {
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 ?3 @/ B8 L. X4 x
; I& Q ~, W+ X- }! ^7 A
if(pshreRAM->packet_cout != count_copy)0 A8 m8 j; G* x& t7 O. p$ J
{! o" }, m) v+ R/ c2 B
printf("a is %d\n", pshreRAM->a);
; z4 T8 N$ U4 q: Q. G- O. ? printf("b is %d\n", pshreRAM->b);! f7 X3 y& W* n( W4 V' ^: Z Y
printf("count is %d\n", pshreRAM->packet_cout);7 Q, V. X0 \# w: @4 r& x
count_copy = pshreRAM->packet_cout; |6 ]3 J0 L' A* f
}% ^, H: t+ [# b
else
+ f. V9 l/ O: v {: V0 H) Y* @1 b9 k
printf("No effective message!\n");( J2 w! p5 \- C. o' |7 Y8 W
}
# o6 i* l6 b" F2 z! [- }/ i}
O( [; r5 h$ G& s/ n( C) _ h. H1 {1 x" o6 N$ }' L, `# O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???+ C& n, I# f/ {$ r9 U8 R+ w
6 l: ]% o5 \3 a8 g+ g. O
& K$ o+ F2 K8 T
! y$ B) Z9 e% ^4 @; j3 C, v2 J" P
|
|