|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # C. \0 x9 }8 |' K1 \
% P+ x0 N: J: V1 J
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% I7 S' m% C' d#include <unistd.h>( ~/ ]; Q c: b& a" e4 o
#include <sys/mman.h>7 @' W# i, y* g! `, T4 b( Z
#include <sys/types.h>- t7 p* d9 M" Q) G: z) F
#include <fcntl.h>
- l* ~* J/ M: O' d) ]" v0 m0 [' j/ s7 W
#define SHAER_RAM_BASE_ADDR (0x80000000) & X' j! X' v. @+ ]; m- e+ l' U" G
8 Y. z) J5 o, j3 g6 y# u- K {/ k& @& y; ]. m
typedef struct8 u* j( ~8 x y/ P/ ]7 U3 v3 R
{
' M: U5 z5 e G2 r: y- l unsigned int a;
; l6 t, s7 F f( l+ L/ d* |8 K unsigned int b;
% c5 M7 q9 F2 k V. H" j unsigned int packet_cout; G& ~: Y ~6 `+ [& V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 R3 r- @% Y: H% g L# p. [9 \
5 \1 v# n& d5 f/ I! [' d3 I, i) `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ l' \0 e3 m) p1 z! `5 ]unsigned int count_copy = 0;
+ s5 a9 A' ^( g9 z. l8 u! Y3 u$ s
4 r& k# _$ Y8 X* d
+ d; w1 u* i+ h1 ^; c5 f; K6 `int main()
+ f; r. S1 Z- p{8 t" p' O) G. ]% D: p) y" l5 F _3 ~3 r
pRX_MSG_PROTOCOL pshreRAM = NULL;
: K7 K' c/ C- v pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 Y- ?. b8 S0 Q1 T! i+ T
5 D6 a! L, B5 h3 i( D while(1)
$ n8 T1 D& L' A9 Z { q( E" g7 [* x) h( F7 K
read_MSG_buffer(pshreRAM);9 Q7 }! Y% W' M* W$ T4 F7 \ b
} " _; C6 ]" S! g4 C' N) h) [& I- {9 ~
}6 J, B. {3 m4 c4 R8 P3 a
0 X9 j; \5 g4 o3 m% ?& M" nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 N- w4 y; t1 [+ T
{, A9 g; Q+ Y1 B; [6 D3 t9 C A
RX_MSG_PROTOCOL buf;6 A& d: S: T& q9 u" }( _
% I5 X# U6 u: Z' J# [
buf.a = pshreRAM->a;
9 X. c' u( i6 e- w buf.b = pshreRAM->b;: ]4 c6 u$ L; Z! ~
buf.packet_cout = pshreRAM->packet_cout;
9 e9 U- ~* N( ^# C* @4 z6 o$ R % Y- N6 D+ I5 H B5 a
if(buf.packet_cout != count_copy)1 K" l# Q: E" X- j2 U
{& U6 W$ _9 C9 d+ H6 X
printf("a is %d\n", buf.a);* K2 S! Z! N& C$ _
printf("b is %d\n", buf.b);
8 a4 ]# L0 W# f! r printf("count is %d\n", buf.packet_cout);, U- e) d1 ?4 ^# R& {) S& C! R) O! {
count_copy = buf.packet_cout;
/ [( Z. g3 v: a- \1 {3 r: e }
. G5 k7 Q7 u% O! _1 ?8 Q else/ S% z3 G2 F/ p$ h q, w- f
{" |- a* g/ Y! X
printf("No effective message!");# ?4 h) W. x1 e4 J W1 C9 ?3 n: \
}
$ Z- y; n" p% }7 P2 @}1 d+ z* |% W; k% P x! ?
( p: M7 N5 _ U& |0 M7 ~( s4 u) s0 p1 f/ y$ r, ~* A C
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 I1 I* w- J+ r4 R1 `, ]' @2 T; n使用下面代码,对内存使用了mmap函数后:
8 a' V( i7 G: \/ i8 w0 T. D- l#include <stdio.h>! _+ |- w! O1 n: w7 g9 `& z/ q
#include <unistd.h>
. q) c3 f* k% S4 y5 Q& p#include <sys/mman.h>
6 q. {0 w \* T6 f( r#include <sys/types.h>) q& C; @+ x( i3 p$ F0 X% f
#include <fcntl.h># l( A5 K5 R+ N4 |$ z7 `$ u
- C3 B/ ]; l! h$ K#define SHAER_RAM_BASE_ADDR (0x80000000)
* z& m" o: e& G, ~#define SHAER_RAM_SIZE (0x20000)
I2 O' D) H1 t% f1 R) P h8 b: `, w( n7 A) w+ J) u$ [: a5 `
typedef struct
" ?! m9 h" g* ]& p4 |{
9 J. P& d4 Q4 n/ @' a3 Y- J2 D unsigned int a;
! ]. I- \$ @. V9 M7 L/ g unsigned int b;# w2 Z- _, i" u7 c' v; L4 M W' |
unsigned int packet_cout;
9 |% l1 C1 X" v& W2 P& u! j1 N+ ~! l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 ~5 e$ |: Q( M+ b9 J$ x& O# z5 \& C2 L. P" A. F, f+ ~* m
void read_MSG_buffer(int *baseaddr);$ F+ C4 v2 a) q9 D, r3 N& a
unsigned int count_copy = 0;2 a i* w% r4 ^9 f' y) y
1 `' m0 u- A1 U' r
int main()
$ Z* r' m- D3 `: [1 V* ~{
$ Q1 h. }) s8 d- O+ N int fd;; w) N |0 [, x6 l6 N
int *mem = NULL;7 r4 N. {7 W. J0 |& P7 q
9 [7 S" K( D9 L" E4 L) D3 m
if((fd = open("/dev/mem", O_RDWR)) <0)
: T$ W& |) f) o Q f: @0 U4 { {
& {. P/ V0 _# m/ R C perror("open error");( l, d `2 e* w- i q A
return -1;
8 {1 j" \; Z; R }0 ~; r: v( H4 E8 ^6 F8 o
) ^0 \) I a5 C! i( } mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# ^+ W: J& I1 n) h# O5 ]
# Y$ R M! X- t* }6 s6 C" T- w3 G while(1)
! K: y6 c" _, p$ _ {- y8 m% l4 |: _1 E5 b( O, r6 {
read_MSG_buffer(mem);
- w/ }: O5 e' Q/ W$ s- Z. f }
* f" B' F, ?/ e, o. H}
9 j( z" ^3 O2 U v7 c C& E1 }0 n/ Q5 p3 h3 ?
void read_MSG_buffer(int *baseaddr)
4 j% I) j9 M/ I7 r0 m, ^! V{. @" Y% r2 M% u
pRX_MSG_PROTOCOL pshreRAM = NULL;
; B; O9 A8 r; U$ E$ p v3 t
1 b' U* T; s5 r3 \ pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 R! H7 x& w6 C1 q" i8 f
3 L. V/ w4 B/ K( Y if(pshreRAM->packet_cout != count_copy)
3 \) G8 E+ K( ]) ? {. f6 W4 V) {% d
printf("a is %d\n", pshreRAM->a);
( s" y! ]) n5 d% O- l( n printf("b is %d\n", pshreRAM->b);' E6 F% H; D0 E$ R
printf("count is %d\n", pshreRAM->packet_cout);# H+ C+ w. c% Z
count_copy = pshreRAM->packet_cout;
2 e Y( {% @7 S: ^9 E& _1 q }, Q& G: D' _' l( t
else
: Z }9 s+ c! s! y4 P6 N; ~8 D# X' l {
, E. k0 d" U; G) U- U3 h printf("No effective message!\n");% |4 C- B C- \2 G' }& k# {; Y( }
}
8 r, d" [. y" Y# D' Y}
/ k' N' v$ ^+ n7 z7 Q9 n& k7 o
. Q# \( b; [" a2 |. w" i没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 e7 g' t7 c9 G8 b
" e* @, m" }9 ^' }
$ m/ }! d2 r5 M8 u* Z& @+ y
# V g( Q) g5 X8 ]! ^. U8 v4 j- Z! r* Q6 M; _' B0 h( j
|
|