|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 m9 X2 P4 @# s
6 y1 x/ c) `" h- b* ~OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 g" I: u3 n" S
#include <unistd.h>
) C, h/ i9 N% e' ~" [3 }- M#include <sys/mman.h>6 e1 Q- ~) _+ q# F* o+ u9 S
#include <sys/types.h>
' E$ z' e8 k2 x+ e+ j% B5 p#include <fcntl.h>
. u( f% Y) _. b0 C' ?4 }) r' W( Q2 v* R' A( [9 V1 |7 h2 {
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 x+ u' b; v0 `: }
1 \9 E4 g5 U; O1 i7 ^! M( K% Ctypedef struct! p. C- F7 d" x9 s6 }% x/ g3 l9 o
{& }1 ~9 R7 I; f9 w/ H: G8 N* N
unsigned int a;
: s7 _" G! q" m9 A unsigned int b;: s* A' N- ~8 g3 p3 H$ [9 r( ~
unsigned int packet_cout;1 S( i. S4 ?8 i- C- X6 ^3 ~& N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 \3 M8 F1 P- S! I8 U1 o
- n; ~1 F9 W2 d& T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ }1 J$ |4 H* t0 ?- Yunsigned int count_copy = 0;
! i5 N# E5 E w* K3 K
* ~2 x+ N' e: ] p, r i. j1 K+ _3 Q9 R; f1 h7 `5 {% n
int main(). x1 y# i; w6 T
{
* L0 i/ T" Z! D% T' q- m+ X pRX_MSG_PROTOCOL pshreRAM = NULL;4 h* {! j4 _, B9 X* h# T$ }
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( r& a8 L5 K: @1 A
# d) k4 o! e: L0 x while(1)3 y! X8 ?! {5 r9 n- n8 X, U
{) l* {; D7 Q/ H3 q! f( h2 c5 T
read_MSG_buffer(pshreRAM);
3 d5 E5 _# y! v& ]3 v' m } ' _( `! Z% d6 p: ^6 z* O" _
}
M/ t9 M# y& H! C# q9 b. Q* I* t( t) V: t( t' G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 {4 V. L. K$ _4 ^; }{3 e- y ^- y8 w/ o7 `+ x s
RX_MSG_PROTOCOL buf;) g' m# K9 p, Q+ t9 t6 Z/ o/ ?1 d1 R
- O) \; O6 A; ] buf.a = pshreRAM->a;
, w5 ]0 n: D( D: ]$ g buf.b = pshreRAM->b;
; t8 ^3 h' u5 ? |9 A! U3 g buf.packet_cout = pshreRAM->packet_cout;
$ ^- ~( H3 a w, c ) C3 T0 m) I8 K# W# N% Y3 A
if(buf.packet_cout != count_copy)
/ u3 S! ?8 E% }4 B% t( n {' \: j" u( K2 C7 ~8 I+ Z
printf("a is %d\n", buf.a);7 G6 n! j' ]& U8 c. p1 v( B$ N7 x
printf("b is %d\n", buf.b);
_) l( e# ]' `% I6 P printf("count is %d\n", buf.packet_cout);5 x) T4 W3 {$ z/ G4 C2 N
count_copy = buf.packet_cout;
# _; T+ m& H K: d% ]7 v9 _ }3 s* m! f B6 j1 u: N5 h7 i) ]& o
else' D5 F, C' j2 `3 y+ T9 {& q2 X
{
4 ~7 O) d3 ~4 T7 F3 q printf("No effective message!");# Z7 Z6 G! G, b6 o2 z
}$ ^0 |$ r' u' v# q$ a7 h0 j
}
6 z4 C1 j5 T2 i* A/ m% @8 t
7 t4 l3 ]/ M# m) n4 {% M$ Q
% }+ }- N5 l5 {' t( ~: r3 [- I但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( t) V0 l; M- h1 y
使用下面代码,对内存使用了mmap函数后:
. l. I7 F' B& ^! s2 [#include <stdio.h>
1 U: o2 w: g: U4 |#include <unistd.h>) }1 J; _+ C: H* R
#include <sys/mman.h>" e; Y5 i- r! C* R
#include <sys/types.h>
% q; x4 @% b$ ~2 z) {$ F6 h' O#include <fcntl.h>
% r9 K# x, w; X6 r
! F& e! D; }. I6 S3 \/ U#define SHAER_RAM_BASE_ADDR (0x80000000)
7 b. f/ O9 Q& v5 T6 q2 f, m#define SHAER_RAM_SIZE (0x20000)
! S4 | Y, k. _. `- ?) T2 H M% b9 H% N! V. ^6 X7 c
typedef struct; V2 @4 Z" H7 v. U% J- e% y
{
; `- n" C7 f A* K, Z0 T: ] unsigned int a;
" }) I8 F5 D, K; A1 ~$ j unsigned int b;. N$ A% y* }7 I3 t- x l: m1 ?
unsigned int packet_cout;. R3 W( ?) h+ r$ y, c' \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, |% S4 a( ]6 K
9 u& { c; |& I9 W2 Jvoid read_MSG_buffer(int *baseaddr);
% s, `$ O1 c8 s( M% I8 kunsigned int count_copy = 0;4 w# o" M, f: Y& I
; d, A8 b+ N/ I7 i0 ]4 e
int main()
( O' S1 m: D; ?3 R3 u; P2 j# _{$ h" R! {# F5 | E
int fd;' y( D4 n: c) l4 ^) [' X9 m0 h/ s
int *mem = NULL;+ }4 `. J* ]6 @' g# b% R
" ~- F! ], w# [5 Y if((fd = open("/dev/mem", O_RDWR)) <0)) A3 K) |8 o. B% g$ ^
{3 A) M3 p: {7 E; W- L
perror("open error");
- {( V; I5 l$ b* n8 C" F return -1;
1 P8 g$ u" h& F& k, y5 T/ D$ g9 o }
' b; s# l: M- Q' Q% b
4 t4 j. j& g1 f s mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ A* r+ X$ b$ u6 x1 A; ?: B" a& _ I5 l2 D, `/ p% |
while(1)) c. b" F$ c8 p# \" D. ^0 f, `
{
& B ~; s W( f$ s H read_MSG_buffer(mem);2 }$ `% k! e( K6 q- f
}
/ J7 S; X& D1 `8 V- L: S$ B}
0 @- D8 L. V; n) t, V
$ t: E4 u# Y6 c& T" I2 g. yvoid read_MSG_buffer(int *baseaddr)
* _4 y2 W5 r$ z `( g) u{
e. m: L& S3 t2 g9 J" [ pRX_MSG_PROTOCOL pshreRAM = NULL;5 a0 K1 C; m. l0 j9 t7 u
/ A9 A* {& L) e p" o+ v6 G pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* ]5 q8 h, c+ T: n- T6 c" h
) D0 @4 [( L* x1 P if(pshreRAM->packet_cout != count_copy)
; d% T, [) d- e$ J T( Y {8 I/ q& [) L( y" z% o
printf("a is %d\n", pshreRAM->a);( a- t' Q* A5 T. T
printf("b is %d\n", pshreRAM->b);. M( q! q) H* ?1 u1 `2 j
printf("count is %d\n", pshreRAM->packet_cout);% R! r' e5 t# |+ ^2 @
count_copy = pshreRAM->packet_cout;& J) r$ l$ N9 {! ? W
}6 g/ _' \5 C8 I/ ~3 c6 d
else7 x R6 \, a3 }2 s$ s3 A. a _4 u
{
/ h. N6 p5 `! t0 A7 i0 h printf("No effective message!\n");1 j9 |9 I, Z! T
}
) k! y, H% a% U( B}
$ F/ }" @% Z) v: S8 d* c& l! o; ~$ U6 h/ Z9 G; ~
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???0 \" ^. \ Q0 C) D9 E
) Y( I8 u6 n: L4 z
6 W6 ~5 B1 b) y) c$ O( A* T" B
: U- c: B) Y; v) b& p% I2 G
$ ?' y3 r/ p A) ?
|
|