|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ ~( [* }& n. m/ L: A+ L! e) V2 _4 C
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 ~4 J8 a, ?/ C4 u6 I, S* c2 S! x
#include <unistd.h>
0 b1 |; t5 Y8 ^0 b. z3 y" R#include <sys/mman.h>
6 m z- b# k* T2 G0 |1 W; I9 N#include <sys/types.h>
0 Z8 f5 M4 b0 ?1 n% J; U5 }0 O M) A#include <fcntl.h>
7 k7 }( n5 l- \" g/ J/ [2 `( q
& e, }/ e2 ]7 p" J1 f#define SHAER_RAM_BASE_ADDR (0x80000000)
1 V8 r& @* w |0 e" E! ]6 g0 [+ F/ w4 S: J6 D& B9 Y
typedef struct- w: M$ {4 X9 J+ P- _( t
{
- r1 b1 }7 l5 F& @! M$ @. R$ i unsigned int a;
, r: D; P, P$ p. T- T, k unsigned int b;& h8 g0 i+ T$ M* y0 o" ^
unsigned int packet_cout;. k: o0 W# p/ A& I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% `& i0 O; t$ G: P, T( `7 R
6 f7 n% n2 N5 K* z' I- L6 hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 Y1 E: q I$ j9 qunsigned int count_copy = 0;
& X8 J0 A( S* G6 u, e9 X: s
* I/ i1 n; Z" ^% |
- K7 u' w, h+ ^+ B. u, B/ Mint main()
+ L+ I1 Y1 \$ c4 N- J, s% ~{) S' I; L5 Z+ c1 Z7 z+ t: z ~
pRX_MSG_PROTOCOL pshreRAM = NULL;+ M" Q# }& u. |/ h; x# R- k" ?" G; O
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' }; }. k; G& A' X
# R! d7 p7 }8 {9 i% K8 Q3 s) Y
while(1): `" w; K( \+ Z$ y
{$ K4 c J, ` j4 o8 q
read_MSG_buffer(pshreRAM);
) r, V0 v. K1 }$ T! @1 V2 U }
5 O( |" @5 ?+ P7 s. f}
! l9 N5 W% H- ^! ^9 n. o+ W1 C2 \3 W4 Z, N1 X$ ~3 z0 a( Z& U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* @" H4 J3 h! e+ y
{
0 l3 ]% f4 w! o. I" Q! R' F% z+ I RX_MSG_PROTOCOL buf;
9 w4 h! F9 O" \6 k; ~) O5 Z2 C
* j7 `7 \7 B+ o8 o$ ? buf.a = pshreRAM->a;: G& p# w1 L- H9 n$ p
buf.b = pshreRAM->b;; Q/ J% |$ S, N% }. W
buf.packet_cout = pshreRAM->packet_cout;
3 l( ^( u5 |0 W
1 ` N% W: @" _7 F7 ? if(buf.packet_cout != count_copy): M% S' x& u% m/ ]
{
' O) ?; b" W( C8 K- ? printf("a is %d\n", buf.a);
8 P! u; E9 b5 E) b' r7 W printf("b is %d\n", buf.b);
) u0 R5 ^8 f+ _1 r printf("count is %d\n", buf.packet_cout);: m: _) h/ h$ q2 j% x- _/ Z( j
count_copy = buf.packet_cout;
- Q$ p& N4 ]2 y. A$ s& N }
7 b' `" k+ E' t W$ h else2 O4 F+ V+ r+ C8 z, |% O# {2 D
{% e% x# f$ H3 g: v1 B
printf("No effective message!");0 i# w( B S+ y# V" G# k/ P
}
) s- s/ K% [/ g; G& g}
9 V$ Y( @3 J) V9 @4 A& h$ h; E% ~& \; Y0 N* ?
: |$ V8 M1 d& p6 x6 f% a1 }但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。* L1 X9 q# T6 O
使用下面代码,对内存使用了mmap函数后:/ X* Y0 q" ]2 j
#include <stdio.h>
( j9 Y) _5 ?( ^& S1 H#include <unistd.h>
$ x/ O# A8 h$ D#include <sys/mman.h>7 _! C6 Z( o: H) d4 _: N6 }$ v3 p
#include <sys/types.h>7 t, h% y! l9 x# _
#include <fcntl.h>
* W1 Q/ N3 L3 n1 w% ]4 i0 }7 N4 N: A
#define SHAER_RAM_BASE_ADDR (0x80000000)1 t7 r/ [. q$ [
#define SHAER_RAM_SIZE (0x20000) , v$ Q' v; h/ c8 j4 {7 ]
; Q3 H. |* X, [ I% S, o6 }
typedef struct3 F- m% |' i" H( l4 k: o7 M
{# u: ]. w9 P W( P
unsigned int a;4 U: S: r/ ]2 B6 ?% k
unsigned int b;
7 O& A2 P. `0 j- |, F( D unsigned int packet_cout;3 ?# f8 R- K$ k; E6 Z, Y5 L) A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ M2 u" ?9 ~1 G8 U
% ~2 b" I f* q" E2 qvoid read_MSG_buffer(int *baseaddr);! ?4 d* G: i# r2 z
unsigned int count_copy = 0;3 @/ R2 m; ?8 X6 k% z, X
$ p7 K4 r4 Z- N1 d3 u, _: C
int main()
" _! o9 [7 [! R4 p8 @{2 q! m2 h6 S( z8 i3 @! M
int fd;
7 n8 g: p/ f# X9 J3 t8 H9 n int *mem = NULL;2 w& E" {8 ^ u6 m* t5 @+ K
, t4 C- y n1 k2 v3 Y if((fd = open("/dev/mem", O_RDWR)) <0)
9 D% i5 ~8 H+ d. p8 k. ^ }. l3 Y8 c {# x9 b" k1 p' S2 L. @. V
perror("open error");% e- Y; ]1 G4 e
return -1;4 X1 _ n9 X/ r, i9 v
}
$ d# q) v- {. ^/ b
$ k+ k& O! H% B; ]# D/ b3 w8 C mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& w0 y) q- f3 N6 D7 I3 u+ w
3 B5 k a8 @1 w9 H" O* q while(1)
- m7 C# H2 R0 \' A& I {
% F2 b. Y) d* v* c& {/ f" u- H read_MSG_buffer(mem);& k7 o$ N2 a4 L
}
2 |5 z, J5 }2 G+ j}
. V, Q5 s6 P8 |5 `) S- n% s. H$ ~/ e! g$ b; m
void read_MSG_buffer(int *baseaddr)
' q. u* @! F+ P0 G3 J& a! R{$ r" T( o3 }( g- P6 G
pRX_MSG_PROTOCOL pshreRAM = NULL;
% K, M" l) Q4 U1 M9 P' |, D7 L( s9 G! L! I z: [$ j7 U' ^3 p
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ X, s i. c/ ?" H; u" _
: o. M1 c: }" Q; g$ v if(pshreRAM->packet_cout != count_copy)
: ]1 {( X+ i+ E+ a {
^' G* a; h8 ~3 ^& [) j; I printf("a is %d\n", pshreRAM->a);
" ]# H: p# @4 Z" @/ d- {7 ? printf("b is %d\n", pshreRAM->b);) `, f5 F7 ~$ q$ T6 l, O
printf("count is %d\n", pshreRAM->packet_cout);7 \3 t, Q& n% A* @; X
count_copy = pshreRAM->packet_cout;% g: h; B, ]' v: O, o/ b
}
5 s D$ }6 D3 R2 e' V6 y: ^: x else
9 a0 E+ l6 O6 Z9 E. D/ H {
& G; x: c% T$ a% d printf("No effective message!\n");
+ g# b2 \8 Z4 j4 F }) d/ c7 }! d' A$ D/ E1 z1 [% t0 \
}: K: `* q: x0 L L6 |+ T. F0 h" I
; A* r R- T! z) o
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ E2 k1 ~# S9 Z# m$ f+ U& J u$ k
) _& y9 T1 j/ R$ w6 N# u9 s
' g$ A! ?# e9 x
: O ?3 I( [ }& t" ~+ P# K
2 h/ y' v: o6 P! ] q: L! Q |
|