|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' F: O0 D. V% e3 Q
! K0 B/ W8 P9 w+ v
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 ? _; d) S; n6 S& x, y% r#include <unistd.h>
8 ^, H# G* V. M; _( J- d#include <sys/mman.h>+ |2 W6 t- n# u$ s. m/ j" E
#include <sys/types.h>
2 y6 V( ]. m; f0 Y#include <fcntl.h>
8 h" K6 M1 L, b$ F) O( M5 a- P' r- w/ |( a" u4 R) c e; D0 |
#define SHAER_RAM_BASE_ADDR (0x80000000) 2 m& m! ^7 H }% o& j. ]7 |* |
3 J" q- g" x0 y# ~. u6 L( ]
typedef struct" D5 Z2 }; ~' O3 M6 u
{) L9 g8 F' W% n$ C7 Y- O
unsigned int a;0 R! P1 e8 m1 g' X9 v
unsigned int b;+ B- Q: _' X6 P8 C* _1 r9 {. t
unsigned int packet_cout;% o" u+ ?* j% H0 s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' M8 i) h* x v' ]% } a& I
6 K/ N; \$ B& Hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 ] z9 f M5 Q* i2 a7 Zunsigned int count_copy = 0;$ p7 z9 q8 w5 y9 V, U
- L) @# E3 j+ @( t9 o* |9 L' {: s
int main()- @" b/ V. l/ N' V
{/ [' p5 Q1 b5 F" R! m
pRX_MSG_PROTOCOL pshreRAM = NULL;+ n& A7 j- s% Y% l: a$ e
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ T" E& K2 n% C) j5 j; u
% |0 w, }$ E5 @0 y1 H* v+ [
while(1)0 Z9 E2 e* E1 g8 d5 }0 M7 R
{
9 b8 p, t0 s, m- g$ f read_MSG_buffer(pshreRAM);5 A7 S% e8 N0 H; U: G6 B" \
} a2 y2 f( U' \
}
# P4 h3 N2 Y# S. f% c* @
! e L4 p& {$ N1 [# A8 `! }3 |3 {3 } tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( M* {3 w6 M5 E" ]) r{( m- n. J7 e) b/ }, }
RX_MSG_PROTOCOL buf;, B7 K3 a4 q" y" y3 [ o: |/ l
# P9 V. p8 _ c- G$ h
buf.a = pshreRAM->a;4 K6 U; B& V: U7 U1 ?' \
buf.b = pshreRAM->b;5 Y; c' l3 z" l% d
buf.packet_cout = pshreRAM->packet_cout;0 J* f& B, J I. i
* G5 G0 ~8 A; A. M
if(buf.packet_cout != count_copy)
& I' A. C- Y& O$ q. i {
5 x& Y, m, C" A! N2 [ printf("a is %d\n", buf.a);: z' r" u. E+ P$ J4 a- y
printf("b is %d\n", buf.b);8 ~. Z* H+ C4 @ e0 ?0 F" f% Q
printf("count is %d\n", buf.packet_cout);* w+ ^; Y7 C/ A- u5 C5 E( h
count_copy = buf.packet_cout;
9 ^8 I( Z$ T( K0 O9 w# q, f. d }1 N6 L1 Q; I! h$ Y. a
else
8 {2 n# t1 L0 V/ C5 k {
, y/ j1 W6 \1 h: l7 x; t5 X printf("No effective message!");4 S9 {/ j: D3 W& V- \, w9 u6 A# J+ T
}" D$ a: T) g! u6 Y4 a
}
% S; Q4 v" r0 N! w2 a3 q+ p1 V9 F( [& _! Z# S: |+ i3 c I
4 L/ N. r& D7 \# U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 @- V9 T8 [; T: T, C使用下面代码,对内存使用了mmap函数后:/ U8 {8 s3 W) a) a
#include <stdio.h>
8 r$ b0 w5 P; l#include <unistd.h>2 Y; S! Z8 c- @& ]& }* J
#include <sys/mman.h>
, ~0 I" v$ B. _; h. L#include <sys/types.h>/ z7 i- R, T: n) q
#include <fcntl.h>7 e; Q2 U; H# G& s! \, t# L3 C
' R b3 s' t5 l, E% T7 [- |: t8 {#define SHAER_RAM_BASE_ADDR (0x80000000)( p0 Y3 ~/ k" E( m" p
#define SHAER_RAM_SIZE (0x20000)
! ^ t! `& W m" d
9 d; f$ m9 k; ^2 Ltypedef struct: S4 P! d* X$ t( w% ?9 S
{ k& P" b$ L1 R& ?4 y9 t8 a9 d) J
unsigned int a;
8 c6 V* N& a- t9 N# v; | unsigned int b;
2 ]. X0 I9 F) L! W; ] unsigned int packet_cout;
+ z8 }, H. {" u9 v6 }8 K' Z* n. x5 |" v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* h5 p3 H% d5 s7 _
' V5 `9 q( z6 [& j- c0 a3 C: @* g9 `2 {void read_MSG_buffer(int *baseaddr);
5 k$ c/ L! n' E9 T4 Wunsigned int count_copy = 0;
* L, w) G, {( M3 t8 I5 L8 z2 A; ?# f: L$ b/ B) {4 s2 _4 Z
int main()7 u9 n# H$ w) a3 w
{
: M5 H- ]% j1 m6 r( @" f6 | int fd;
3 o3 L8 |2 @2 m( H8 T int *mem = NULL;7 V* S ?$ v6 _6 E: }! u
& W& q0 q9 e. D if((fd = open("/dev/mem", O_RDWR)) <0)0 u( r @0 F# l" L4 A2 e+ Y8 }
{; U7 a* P9 M4 [+ L; \ n6 |
perror("open error");
3 c6 P6 z7 E" C, J return -1;
8 ]0 ?! d+ l! m j }2 ?" ]0 m7 V1 S
2 @) b I; g, {6 C4 q. g# `! ^
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 Q- \& F- v/ ~3 z6 e G2 K4 b+ o9 i6 g6 I$ C" J& P
while(1)/ B0 j5 P t8 U; a# O# \/ T
{
4 F# M6 B. j% o0 V6 j& u4 { read_MSG_buffer(mem);
' E1 b8 T2 N/ ^+ f: A }
# x$ S1 B* J! _! p) P& D: A2 G! a' J}0 N1 ]8 z" q, h" }
+ f* D- z& D V% q$ y0 x2 Vvoid read_MSG_buffer(int *baseaddr)9 }+ A, q3 x; g' x* E
{- w( J& M+ i0 o. k a z7 l
pRX_MSG_PROTOCOL pshreRAM = NULL;" ? ~: M& `* F d6 `
! R5 y% K& G) {0 j8 |, B
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ [. O) U4 X6 e1 ?9 l
5 m2 ]# r5 J o if(pshreRAM->packet_cout != count_copy)
% i' q; b& r: p- m {. o7 Q% a7 P8 t! D
printf("a is %d\n", pshreRAM->a);; Z, t4 X4 B4 L' }
printf("b is %d\n", pshreRAM->b);
. }0 s: E% m6 V v+ A printf("count is %d\n", pshreRAM->packet_cout);, ]$ q9 C( T7 C, A) z
count_copy = pshreRAM->packet_cout;
) t& B- X0 `* A {& m }% \, c$ {. W+ p& ~) h; @5 y$ W
else4 t) g- q! d# C' e( o+ f4 M
{
% O; Q; ]- R% p1 ]) [) d; ]& o8 e8 C( I printf("No effective message!\n");
# r9 Y7 u) S/ ^ }5 W' p. o" `- E& Y
}, J* v' ?5 m" B5 \: @ ~/ o
" v x! K6 Z# ^, g没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' w# N) F. a0 r2 E) X
. O# s- H$ ~- s- w: j' q
/ M, g6 y' C! s) L- o
* c/ k# k8 K$ _# G4 M
0 q( t/ z3 t% B( ]2 U |
|