|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 U" H2 H9 F: k. \# m) C
9 |% m; b( s" l. F' l7 wOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 A1 {0 t* ^$ D- Z4 I D, p
#include <unistd.h>+ _9 D' z7 W* d8 A! u2 y
#include <sys/mman.h>7 f* i# Y+ o: a
#include <sys/types.h>
' y/ ?& Y* q1 B% g3 |#include <fcntl.h>5 e* c6 Z/ J, l0 Y% a: Q+ W
" L! S7 |7 ^5 g5 j! G' }
#define SHAER_RAM_BASE_ADDR (0x80000000) 2 s! L. A0 C* b! f' X8 i) `
4 p+ d, p& X2 r2 |& Q$ x# L" S
typedef struct
/ x$ Z( V! I* J$ J; H. h{
% l# O- O7 D7 @, a unsigned int a;
0 k$ r& E1 b& ? p# W unsigned int b;7 N+ y. z. a. q# D* @3 \
unsigned int packet_cout;
2 ?! ?- C, S1 k5 O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. I4 [5 d, U7 C
* c# n/ C, a h, kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) \4 W; ?, p! W/ s4 tunsigned int count_copy = 0;( k0 ~6 L4 U9 c l; M5 S+ D) T# w. S
; O: T6 l( h. E: u* k' u& k& D6 }, }5 {. }1 M0 U M
int main()# X; ^3 b& H) h; h& u9 C7 a9 B3 N
{0 Y) ?* b+ p& v2 ?7 x. w1 l
pRX_MSG_PROTOCOL pshreRAM = NULL;
- [' v/ R, ^" A, d) k! T pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) G' h9 G( ?. `+ \; [& R9 v& J' o2 Z2 x3 e# D0 [2 w
while(1)
( K, f, e1 t) I {% K: J! X' t. c. O, E$ r- Z
read_MSG_buffer(pshreRAM);
8 l# j: m& N0 j' F9 U+ k$ J) Q }
0 R: ], ~7 ^ f7 R" d& h}8 G2 C+ D5 u" [; d
' N/ q( o; S4 J" i, d. {void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), x1 D8 ]2 p( q) R( K8 S7 m
{$ M' V+ s n& |7 p
RX_MSG_PROTOCOL buf;
0 B2 M$ v: H7 `
4 L9 S2 A3 M) E buf.a = pshreRAM->a;5 [% V; c' B8 ~ V8 I- S
buf.b = pshreRAM->b;
0 q3 `8 [5 L9 s buf.packet_cout = pshreRAM->packet_cout;- m: m. j6 R- M# s$ u4 \
" J; M' L, m: P/ C" M+ J- U( G
if(buf.packet_cout != count_copy)
7 v& r& O6 `7 V! G" D8 [ {
$ C' V2 ?" D# R printf("a is %d\n", buf.a);
* E1 _; ]( n9 H& A1 g# ]9 C: W printf("b is %d\n", buf.b);3 j( t) [4 {' o
printf("count is %d\n", buf.packet_cout);1 B/ Y/ X1 G, S1 z' L2 H, n
count_copy = buf.packet_cout;
1 j. U2 f0 A" n- p0 _2 O, k K }
' C& ~/ n$ i1 t$ h/ P- N" ^# G% J else
; m0 I) q& j7 o; \$ Y {+ R s7 H6 O* W0 Z: f2 b$ a7 `
printf("No effective message!");! z. q2 ~6 ]: c1 _3 h7 ?2 v
}4 ]- t4 G7 U4 U( z" k, j
}
* {* ^% K. I+ D- V& k. @, j. {, X
/ Y) E6 n2 b: P8 Y" L- ]. ^& K
9 f- S8 m- W# A' y; a但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 U# ~( J( |& R( n; C v0 l! @使用下面代码,对内存使用了mmap函数后:
+ Q7 s; Y9 ]' P) c#include <stdio.h>% G5 o6 G" _+ m# I, P9 \/ u: h
#include <unistd.h>4 }5 V2 b+ |8 B' z: t
#include <sys/mman.h>* o9 e( C# z" @1 I/ A6 i) i# Q1 H
#include <sys/types.h>5 C$ E' d9 o& t& U5 u' U4 b
#include <fcntl.h>
" _0 R9 V5 a1 x M5 P7 n# D' i8 v* j! P Q1 b+ L2 Z. P" D) i
#define SHAER_RAM_BASE_ADDR (0x80000000)7 A( ]. ~8 ?. ?
#define SHAER_RAM_SIZE (0x20000) 6 r, @$ @0 e/ @( `
) _7 Y9 d i* c0 ~1 O
typedef struct
, A; Q* |3 ^" O: p/ J# h4 {3 p0 j{
; M a, E- B+ ^2 ^. S% {+ c P+ W5 n' E unsigned int a;
/ ?- G/ g% z t: Q, s; {- V$ K" a unsigned int b;
; B! y$ b! }( g$ O0 T! Q$ s unsigned int packet_cout;" [. m4 P9 u. |0 s; `5 R5 B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& j. H& L" s" T4 c8 P5 H3 ?! \* U, L# n f9 @/ _
void read_MSG_buffer(int *baseaddr);
- W g. E0 _2 V1 O5 i8 ]% uunsigned int count_copy = 0;
$ s2 A- W' u# V$ r
( T7 o2 x4 J9 r1 Y$ uint main()
( ]: b4 Q; A# Q: F3 F{
' L4 B" I; w" p: F6 y, B6 v int fd;8 t/ s! ]7 B% `) J' e! c& L1 ?+ Z/ ?: \
int *mem = NULL;: K$ Y0 ?( ~. z! Z
9 O. Z; g& t- h U
if((fd = open("/dev/mem", O_RDWR)) <0); f5 x" {% ^2 f' I" c
{
1 k9 _) w' b5 j2 m" ~- M4 m perror("open error");
& f9 }. k3 n! f5 a \ return -1;
) q4 X$ n+ _: n& O# G" F }5 ] H q/ f; R! b g" o
) w( {# _9 u6 a6 ?# B
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- s* h0 w8 d: Y: F- M
* B- o* Y, }/ M4 a) p# Z while(1)
8 G# g0 I% c, o. g- z+ X {
" G/ k; m8 l; H2 F. C9 F read_MSG_buffer(mem);
# o/ O& O- `( R% p( V# l- r/ [5 s } & j2 u4 V9 E+ m8 U8 D* }' N- R; B
}
$ O1 O% ]( C5 ^* ~! r, R3 g/ G; f' V$ j6 R: c$ Y
void read_MSG_buffer(int *baseaddr)
% U6 o* |, |! i" Z. m) w5 F2 P{3 L7 O2 D; e0 C8 V, G4 S
pRX_MSG_PROTOCOL pshreRAM = NULL;
& f% S8 ^1 K; }3 Z3 W8 `/ T Y% E! F2 _2 \! r0 {; [' v) r1 }' F1 `& T2 Y6 C
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# z# l9 {) [2 r# X
* W: S& c+ C% k, {9 B8 \/ Z1 \
if(pshreRAM->packet_cout != count_copy)8 b* k+ O; ]$ k P" p2 n
{
0 l. u: ~" G4 U! A9 `0 l printf("a is %d\n", pshreRAM->a);' ]4 g2 A$ x6 t z( t
printf("b is %d\n", pshreRAM->b);
$ Z; I/ ]$ x1 K4 c" @) c1 v R5 O- T printf("count is %d\n", pshreRAM->packet_cout);
* Z1 P* ?6 C% v* C3 T& P count_copy = pshreRAM->packet_cout;! Z) ?. x2 A$ E6 C- R& X
}0 q3 C* P* _( g; I7 D- {6 _
else3 I! L1 A2 {" A! l6 M) i- ?5 c' s
{( {" H2 }: A, b- l( s2 u+ Z' ?
printf("No effective message!\n");% B& ^7 M: _! D* _. C
}) \/ T7 c1 ?& q% u9 ^ ]& l
}8 e9 d# |1 i4 C1 w
$ F! H" N: E: @ k" X9 m
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' S5 U% `/ J. \; B( v7 ~
& H% i% q; K$ M" G4 g
$ E- i% Q. Z! x2 @
3 S4 l, ]& d1 V
/ Q* |/ u+ j+ s/ z |
|