|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; X/ u7 ~' @5 Y; q: V$ m
+ Z- Q. t8 e/ I7 E0 d$ v" F$ lOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( ~5 k" r/ U/ J" {8 B
#include <unistd.h>! c& T% y9 N* O/ ]6 L
#include <sys/mman.h>4 ~& H" ?0 O1 P1 s/ V
#include <sys/types.h>/ w. W/ m9 Q/ i! c
#include <fcntl.h>8 _4 D. m0 |1 C: f; V
$ t9 j& \; L- O2 h2 u5 ^* q
#define SHAER_RAM_BASE_ADDR (0x80000000) ( }- v* p4 @& q* _; L/ V" V
" g1 y# E# I/ {8 ptypedef struct
! Z4 |! O4 l! Y1 i0 }{5 p: F) U+ a/ n! q8 |) R8 }: W& h
unsigned int a;9 `- v! Q: Q$ K- E
unsigned int b;
3 M0 i% }9 {7 d \- u1 I$ v unsigned int packet_cout;9 g- w$ J- V0 d* @4 P/ |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 o' O" Q5 C' h4 E% |+ m/ A" a1 J
& Z* _' A- D k& l/ u; vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
C/ r" e4 d4 ` ]& {3 G; ^3 dunsigned int count_copy = 0;
0 M; `% w6 ]$ J& M* X
& K7 }: v: r) q, P
/ x. }7 Y8 r# J+ Z Hint main()% \$ M7 }- w. j+ Y4 a6 |# ^+ a+ T# o
{4 S2 m5 L: D2 u# V D5 z: P
pRX_MSG_PROTOCOL pshreRAM = NULL;6 E. y6 ]% J1 ?
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 q6 J& n4 b" b
& w& ~% h4 n( { while(1)8 l0 \( L/ ~ q) ~
{$ I) H" D: D1 {. V
read_MSG_buffer(pshreRAM);
7 p x+ d* t& x5 t8 R6 z$ d, p1 x } , O5 w' n$ q. O
}0 u1 H) F7 D0 g' x
) a0 l3 h* ]+ q3 h/ Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 C- a; u' E6 d$ m, L3 J# ?9 y
{
3 o. |1 X) L: R+ `9 y' H6 J RX_MSG_PROTOCOL buf;$ |9 \8 I) O) E3 H7 C9 X
F3 k1 |1 T5 Z. [/ p7 ]
buf.a = pshreRAM->a;
1 V/ b& T# J$ ]% m buf.b = pshreRAM->b;
$ W3 B- w& L$ O7 ^9 p4 C buf.packet_cout = pshreRAM->packet_cout;; B8 s; a4 X; a9 O# Q4 g
2 c0 m! d1 S. U! l4 ?& O- P if(buf.packet_cout != count_copy)
% f9 p" b9 V, y1 e8 t- T {; ?% e- ?1 E* B% i5 x8 K; G
printf("a is %d\n", buf.a);
: {2 S+ i$ s9 R7 f, D3 }2 p" k printf("b is %d\n", buf.b);7 P* \2 t0 f& ]2 {# x& \0 c3 q
printf("count is %d\n", buf.packet_cout);3 T: t( D' l" Z0 p; ^* s
count_copy = buf.packet_cout;
1 o* c! S" R! r }
1 i. P7 A3 K; G' Q% X else4 o& h! S' D* ]8 I% R ?# ^
{& T4 P6 @: A# e7 P
printf("No effective message!");5 j+ v2 ^+ n7 x/ ?" A
}
! o3 ]$ @9 [( d$ k3 @6 n" k}0 D, v3 t, j1 c* K+ h# |0 `' S4 T
+ x+ G. r7 E6 i p. |9 c
0 B" c* B5 i2 f9 V4 O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ b1 }7 z4 j$ E" b1 Y' N$ s
使用下面代码,对内存使用了mmap函数后:
' _- N) p8 ^* W#include <stdio.h>5 j/ c7 W$ L7 W X5 ]! P
#include <unistd.h>
8 G$ j) j; x9 M) x9 ~. k2 p#include <sys/mman.h>, F1 A+ Z' ~! E2 g2 r W, |
#include <sys/types.h>
3 w/ S8 p8 c! K' ^' D( {8 ]#include <fcntl.h>
2 u/ A5 e1 }* C* A
% R+ t8 Y$ v* B) O#define SHAER_RAM_BASE_ADDR (0x80000000), Q: e" h6 H2 S* h# p
#define SHAER_RAM_SIZE (0x20000)
2 T6 j, D- l/ r6 T! A& V6 f
+ p3 }8 d* o2 a5 w- l+ e6 Q* S: Ltypedef struct
+ m3 B8 j+ N9 O7 N$ e, r3 Q{
: S' @1 b& ` h- n. {: d unsigned int a; |# M$ X3 w2 ?: \" D* \
unsigned int b;5 ?* a( P; T, Q0 _6 B7 Q
unsigned int packet_cout;% g3 y4 g! G& }0 N( q7 u) h" ?/ ^; v3 f9 L& {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% Y5 r' A$ G0 X) t
( l* ^6 T; `+ Evoid read_MSG_buffer(int *baseaddr);' C7 V- Q9 q- D8 ~$ b3 k/ o
unsigned int count_copy = 0;' ?' A, t \* w u3 D5 v d
9 T+ n( Y7 q, u" U1 z! w. l# ~1 y; G
int main()
( }3 K; R5 v% E2 a: K) a{- ` l# p' k0 G9 e/ r k
int fd;
0 p1 M5 G9 w1 D int *mem = NULL;- T. t2 k0 }+ W4 F
3 W- v( U' l& w. I I( u if((fd = open("/dev/mem", O_RDWR)) <0)
! ~1 v$ G. X8 `. n9 U0 w {
2 v; `. t& t* E4 @, q, v) w& G" v perror("open error");
2 t: k1 [: K; e9 e R5 m2 H1 l. { return -1;% y* O& m' C. f& f6 Z0 g
}) X2 b& z9 k2 v" y1 \9 [0 C/ t( e8 P
: s x; D8 X) v- b2 P" \. V mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 u3 N2 M0 @2 M3 R# k2 l |
% Q0 ?$ Q( h9 o& ^ while(1)
' p4 M7 N; g3 [! U0 U {2 N/ F0 |3 H2 }+ H* M( F
read_MSG_buffer(mem);
. ?4 k& a* A& x5 J1 D }
! Z: c' a; j; T" A: } S. P2 M}2 _; n: r9 H+ V( X
. J; b* G: h) U' U
void read_MSG_buffer(int *baseaddr)
7 r; s: Y. P+ l) T- W, T9 c: B3 Z{
2 a1 m8 Z# E* [+ S pRX_MSG_PROTOCOL pshreRAM = NULL;2 r& ~/ N! ^4 V# A& f0 l
0 U( |; k$ H6 { pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 Z1 @( W. `+ a4 T
* Y W) k0 `; k if(pshreRAM->packet_cout != count_copy)
% r" {' B: N6 ] {$ C! {$ J4 q$ u& H- g! o( m
printf("a is %d\n", pshreRAM->a);
% V3 T2 o8 i2 {7 n" R printf("b is %d\n", pshreRAM->b);
: b) S2 Y+ f8 a) }" B printf("count is %d\n", pshreRAM->packet_cout);2 l/ p2 i- U0 O7 f! {# J
count_copy = pshreRAM->packet_cout; M. O. ]+ [* M. N V& E
}: Z3 {$ R/ ?) O/ A: {( S0 L
else
( G" B# M3 B- C2 { {
* n' u9 i! F5 w& W2 q4 i printf("No effective message!\n");
3 P9 Y U; G& K& E7 {9 U: E, e }
3 j* m. P. e+ b9 X3 u1 o0 ]) g}
+ ?; R- J( j0 ?' _. x, P
( k4 M) y# D7 M3 r- {/ o没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 X& W+ h, ?3 y7 f& U3 ^& {7 b' R A7 o6 I) Q
/ u4 G) H- q0 }
% ~( m6 e- m1 g' C H
% i; l( {; k/ u( }5 P0 E# c- ~4 l |
|