|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / y8 h( ]" I3 N o" s
( l0 g4 N: ]& u. T0 Y; K4 M% u3 d
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 C2 [2 G. B; f7 b" n1 i#include <unistd.h>
0 N- |" I5 u- I! H& n) l& x#include <sys/mman.h>6 K1 s7 X& [* H; m) G* o
#include <sys/types.h>
" R n6 g `. o6 N#include <fcntl.h>2 j/ t' a$ o1 H7 o" q7 U
8 H; _3 w) t3 g& F, }( }#define SHAER_RAM_BASE_ADDR (0x80000000)
/ q: g L3 T. B& W$ {1 d6 N
" @: d4 u5 _2 L( Atypedef struct
; d% @, X: @5 S0 s{
" I* x& ^2 J1 s- T( [0 E7 M& [1 G0 e unsigned int a;
$ @5 I! }8 \9 \ x unsigned int b;
: n" }1 D; b, g6 m# N; p unsigned int packet_cout;
) w! Q/ J% k! B: z1 b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& C/ L9 f2 r% V. W! k, O: O
) i P& d# k4 y3 C3 _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 Q5 t, D/ S" y! D! @2 s' uunsigned int count_copy = 0;6 e" I/ z) f; e2 w
2 U( o" s* T5 w3 Q5 P! I& ^
1 C0 r7 c( |3 |# H2 zint main()) U) L' A' Z' f+ B$ \& d. G
{
. J- u# L {# E9 w0 W* o( } pRX_MSG_PROTOCOL pshreRAM = NULL;* L7 ?5 z6 `4 e! Z5 l3 Q5 P6 \2 ^
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;6 X2 q; D9 A4 s& e; w! s1 o9 {
* A3 v) U; K* H6 C! G while(1); c! s2 D4 y$ ]- c# @$ e" A
{; }. d2 ^: f( T% s2 P* v0 T$ z/ Y4 H
read_MSG_buffer(pshreRAM);* c) }+ N- \+ R3 u+ D
}
U* f! S; Z; y7 |+ z6 g}% M* W; N# a! e5 ~
1 f* C ~ q. F, T) hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 V* A6 ~# ?* N; ?: b6 I
{5 p2 V9 S8 K% ?# [% p
RX_MSG_PROTOCOL buf;
3 w9 N. P2 F5 V% h8 z Q9 d
) Y+ t0 e/ a, Q buf.a = pshreRAM->a;0 Q- l; }, n/ D2 k- F$ h
buf.b = pshreRAM->b;
, J7 g# Q! q% n( K9 T3 z) B buf.packet_cout = pshreRAM->packet_cout;# a9 `0 w2 G5 N5 H) F' H8 l
0 i- y. M% L: L" Q" R' k+ f if(buf.packet_cout != count_copy)
8 C2 Z8 b' }3 f: Y. f {* d8 w& ]7 z; z6 V( T5 d! c6 Z
printf("a is %d\n", buf.a);' z/ w, b8 ~& c) K. X2 Z
printf("b is %d\n", buf.b);1 ~9 ^. |! {) b, Q# F. \
printf("count is %d\n", buf.packet_cout);
/ T' }0 n7 A( g: k6 E6 y( e H count_copy = buf.packet_cout;
+ H9 L% J$ G' ~9 p1 U: M: L }$ K% v& u/ W7 q( c2 E
else
" B5 \- r) y9 ~/ x3 R {
- K2 J+ o1 J. } printf("No effective message!");
# G+ } P- |) F4 |7 {% K8 R. \: v) w }/ a4 {0 [9 J" D9 N2 U& G
}
* f- [2 o! \. }2 ^( b
0 M+ y. P& g4 v+ n- N7 j# z5 Z6 b. f# K+ t5 Y# E
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" G* m6 Z9 H$ o, ~( W
使用下面代码,对内存使用了mmap函数后:
2 M+ f: C( q' O! A* V#include <stdio.h>
+ Y5 u% J. p) f5 H#include <unistd.h>
: m( Z# n3 Y; `' v6 h#include <sys/mman.h>* D9 M! K) Z5 ~. H, w
#include <sys/types.h>5 L1 G: k" M, \ m6 {
#include <fcntl.h>
% R0 q) Z6 ~8 _
7 j, f4 L3 y+ i1 V6 G#define SHAER_RAM_BASE_ADDR (0x80000000): H5 @7 O* E7 V5 p6 y! r' m
#define SHAER_RAM_SIZE (0x20000) & J8 o F" U$ e7 ]
r. l) s) x Z% V" d* d8 Q) y! j- p
typedef struct7 j% B, r0 s3 Z8 @1 @: q
{
3 M- ~. @+ ^& F' l1 w2 N$ a unsigned int a;) l+ D, |3 z9 ]5 s
unsigned int b;" Z3 W4 o% Q0 H8 C: C; k
unsigned int packet_cout;
* d+ _% n. H# ], i- P1 s* x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! d* ]: ]5 t, I" R y/ B2 L
' g- Z1 t3 t" r" Fvoid read_MSG_buffer(int *baseaddr);2 o/ Z( T" s; @! `
unsigned int count_copy = 0;
! r+ ?5 G8 A3 R' {* E' L2 F: T* k- X2 _4 a, P
int main()
$ r7 v( _3 w7 c7 h{
% a8 Z3 Q( _! J) c ~0 s& S7 c int fd;
# k8 s. \8 C; W' s x int *mem = NULL;
4 a; R; L0 J. X: M( X& u) h, s! _2 G. B
if((fd = open("/dev/mem", O_RDWR)) <0)
) ]2 X+ U: x9 ?( w6 j {( X" n* Y- F4 x) `
perror("open error");
' Q! U' y- F+ z7 }3 t return -1; ~9 |1 i7 @# g
}
6 ^$ K4 U2 |7 p# D 5 ]8 T) [3 R7 F3 f; c
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 u$ ?' B& Q% ~& S
8 n6 _. `/ L- S while(1)" `9 J; J0 a* G9 S @
{
5 h" q# [( N$ l/ E! e$ P4 D read_MSG_buffer(mem);9 C; r7 X# a P# K' g }
} 9 s9 g `7 e% _0 q/ S
}; k) E+ u- I* F4 V$ k0 D8 H' ?; V
/ n" K- V' k' G) _4 V; z
void read_MSG_buffer(int *baseaddr)
5 a5 d: v6 T/ K{
+ c' k( A/ i0 O! z( {% q pRX_MSG_PROTOCOL pshreRAM = NULL;$ H! ]8 c4 B) Y& ^. p" T, u( ~
8 {6 B3 O" R- X$ g" g$ {6 Q pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 K" N8 ~4 s: U% o: S4 k; ]2 d7 K: l3 f
if(pshreRAM->packet_cout != count_copy)
2 M& C5 H0 i6 L2 A2 _* a+ B {
- \4 d7 H! ^3 l: _1 [& R printf("a is %d\n", pshreRAM->a);( V: r8 q5 J% s
printf("b is %d\n", pshreRAM->b);
( E6 |: c& N1 w# K3 n printf("count is %d\n", pshreRAM->packet_cout);
# @+ x; \: M3 B8 ]* r- k% M. P% r; ^ count_copy = pshreRAM->packet_cout;
7 Y& M! N& n# W2 G }
' d4 T/ d8 y% s6 b( i else
, l* y) m. Q( w: F8 M( @4 ` {% [' H8 K4 y2 X/ k- B) S. T7 l
printf("No effective message!\n");
; e# ~& T+ P" f4 B }% v* T4 l2 Q5 U8 ]7 }3 {+ E
}4 ~) J/ y! f: f
! X, t# \# a( _" l没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: K h" {. d0 x N( H
7 y# a1 Y7 |9 P: ^2 N. }) i* C3 x! s$ l
' d3 s6 l G, f& L
6 ~: ]' m: v) r+ ~5 J
, I2 U9 x4 P6 g* f |
|