|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 w7 j+ Z6 q+ }3 o. w, P8 Y2 _" V% {6 @ |' B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; ~. g' W# i0 l! ~
#include <unistd.h>
0 K- I( X7 ?: {5 K#include <sys/mman.h>( ]) G/ e% ~% _8 Q2 f0 N8 p& c
#include <sys/types.h>
8 T: s! O: s, z9 G6 ^#include <fcntl.h>
6 Z& c! g! L. J
/ n- |, D5 \6 E* x4 w#define SHAER_RAM_BASE_ADDR (0x80000000) / |1 W; {$ z ]/ L/ ^! f
: }6 s. A( `9 U; C2 Otypedef struct: ]( j; k& Y+ b
{
$ a: {/ n# s: m0 e3 l# U unsigned int a;; Z' c& R" ?0 t8 k; y+ S5 o
unsigned int b;" I( L5 m0 f4 u3 @8 x& N) f5 i0 [
unsigned int packet_cout;8 N2 E; R! `, Y( K& }% n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) \) Q0 o5 j$ z6 B7 F+ y! e3 f: C7 q
# k* x/ G% F) ?% M# S; s5 v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. U) u% K, M8 v5 e7 ^3 Cunsigned int count_copy = 0;2 O" h; @/ H9 h2 X0 ~8 g2 K5 Y4 D
+ o6 M$ `" z% a, m
7 I0 t4 u3 M! E3 wint main()3 x# ~! ?" Z, ]! [: W* _
{6 W. R; S' P9 Y. D6 K2 r
pRX_MSG_PROTOCOL pshreRAM = NULL;8 K% N* U" U% Z6 |2 K0 I
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* m$ I) ~5 l/ n1 M: {6 ]9 @6 Q0 b2 A. q/ _
while(1); e" @9 q0 N; B" C8 V9 A
{; a. y6 }1 N' P, B& c% @( A
read_MSG_buffer(pshreRAM);
0 q* P; x0 x, o; S5 @% e. w' C7 [! R } + K3 {' d Q( Y: n/ r0 c
}
. d% a" t$ ~1 D; R% c! t5 }$ v; K/ a2 o4 S6 X9 X/ u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- ^# m, t) ?6 n+ T$ H( ]{8 I; s5 u' o* }" K
RX_MSG_PROTOCOL buf;
* k% l ?" Y" w1 L. _
7 @! U& r# B! _6 x }( P# h3 C: j buf.a = pshreRAM->a;
2 X! m; r2 ]6 s. {6 d9 i6 J buf.b = pshreRAM->b;
! p' ^3 w2 ~* _6 e& J buf.packet_cout = pshreRAM->packet_cout;: j1 X& l Q1 _ n7 J
& M) }& ^, d) r$ W% T if(buf.packet_cout != count_copy): a* ~/ a( x. E- \$ f. t
{( i- b; x( e5 t* A7 k1 R7 m
printf("a is %d\n", buf.a);
* X k. ~: A {/ v printf("b is %d\n", buf.b);
' f+ {; y9 X; l* G( S3 ^9 x printf("count is %d\n", buf.packet_cout);; \ M$ z+ \0 |- q& e0 p
count_copy = buf.packet_cout;: [0 e) i" k7 a
}
/ `+ L7 [5 n% S% O( M else8 p F+ A1 D/ |7 \- u
{2 R. |6 o* \! V6 s/ X
printf("No effective message!"); R& U6 N0 @4 o( u& d4 U& L2 S
}/ e# h. D r3 u. R* h
}
% f% ^$ a) j0 k; U( P: J* w) I/ Z& F9 Q' D. T9 L% k3 `
8 E$ }4 ^$ T. \但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 x4 y( \, T- X; h3 o
使用下面代码,对内存使用了mmap函数后:
* \! Y6 Z8 n# e# B3 n) d#include <stdio.h>
# m/ ?: J% \0 f#include <unistd.h>
9 G P+ R0 ]7 ]1 e9 Y8 c#include <sys/mman.h>
% o% X; S" p4 N4 `2 L* {% l0 }9 N#include <sys/types.h>
8 v' H* t' Y5 \. _) ^9 p, L#include <fcntl.h>
$ o; [# @! Y# l+ e" I( T6 n' \ _# t8 ^, J+ A. ]
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 n7 \9 ]9 ?- W#define SHAER_RAM_SIZE (0x20000) & e g( V: v% |& @
( R2 c" M' S* O' v" Ktypedef struct5 O- a' m3 K) I" ]. o N& _
{( ^/ D& D; }: W/ v
unsigned int a;
- }. x' f/ a3 Q- Y, c2 `: Z9 G unsigned int b;/ C: ~+ C, R+ I5 D
unsigned int packet_cout;
; |4 K% R$ v% u8 e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 v2 A# W+ `# u* n9 K( ^* ~1 R: F8 C+ ~6 ]
void read_MSG_buffer(int *baseaddr);
- d% w4 S/ `& f$ Z- G; g4 Runsigned int count_copy = 0;
; H8 _/ i8 `6 l" m5 t8 d( b% ]( S) S1 _4 m
int main()0 n* c$ e' ]5 _. n: x3 y& X0 n* z
{9 g9 x A- ?& g
int fd;
" C9 \/ |! Y; C. U2 S+ [' S int *mem = NULL;2 O. k6 N- J* j* w) ?# J% ^
! d' M( e1 U8 A: K9 w# C8 D
if((fd = open("/dev/mem", O_RDWR)) <0)3 E6 M. O8 D% ]) S, f8 C
{
5 R6 U4 \( u& s' W; w perror("open error");% G5 n. M' c, h, L' v4 Y' d4 b
return -1;7 N7 s$ [! \7 l2 k2 R
}% @' }2 O: N; @- l G% ]
* t" |/ p' N- O6 Y mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! c. o1 m0 H" J0 I: D
4 v" s: Q8 _/ i7 N* l
while(1)0 G, ~2 r/ |$ `- Q
{. s: x$ U4 u' r' U. r. P3 A
read_MSG_buffer(mem);
. e1 s! H4 \5 o1 t1 H }
4 _0 n% \& r+ T5 E# o. G}
0 d1 z, e# K& f4 A( F( P7 E; ]2 o! ~' M- M
void read_MSG_buffer(int *baseaddr)
+ |9 n7 {2 F! o% D8 R1 j{
3 L3 c/ I, y# B5 D- s" { pRX_MSG_PROTOCOL pshreRAM = NULL;
8 _+ M5 `/ R7 A( e7 S- b
& m) p2 _* C) N4 u8 j6 d pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 ?8 O1 J7 c+ ~5 N' ~% T- l1 ~1 ~, c3 ?' [" b. Y/ Z8 s
if(pshreRAM->packet_cout != count_copy)
9 `& u6 l2 u! v0 M! i {
. ?4 h4 V! w' D printf("a is %d\n", pshreRAM->a);
( P; _0 r+ q# Q; h printf("b is %d\n", pshreRAM->b);
( B) O% n5 E# x4 V printf("count is %d\n", pshreRAM->packet_cout);
. B4 h, |! d+ X count_copy = pshreRAM->packet_cout;
( B4 M( c! z: C+ _$ p+ E' V }: T' b# F9 A x" A1 E
else
7 m: x* @, ]2 s! j: o. t+ g# c {
2 H- @6 D& t" _* ` printf("No effective message!\n");
3 V+ Z& \0 U5 ]0 a$ i) U0 j, Y }
1 |. m0 q2 n0 R# e) h}
7 k) @$ a1 \+ {. v r
2 C5 k! _- d" c没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. ^. g' R: G! i8 P0 a! Q' k
' s, p4 Z. x' k. m1 t- [2 I" }. N$ ^' w+ ?% q
) k+ u: [* Z, p) V! F
; L% R% @6 N( o |
|