|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# b: E7 J# z# C4 ~
. S" M: w# e1 j$ P% Q( f2 COMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& R3 D' Z' p6 R9 v$ s* X& m
#include <unistd.h>5 Z5 G# b* S# ^" F
#include <sys/mman.h>' g" ]& v% g6 y0 {1 k
#include <sys/types.h>9 Z7 C2 f" H/ d, X
#include <fcntl.h>8 d) G& O( @* Q/ L; H
6 a/ q% `4 z4 Y7 L/ j#define SHAER_RAM_BASE_ADDR (0x80000000)
# t3 ?$ m, I- b6 E: c3 O( s, ]) C' z
; F% L; ?( T% e0 Z! rtypedef struct4 _/ F0 `9 @9 U* A/ Z: w
{; ?' `: H5 m9 m
unsigned int a;. v; H! A; e0 v! y4 v) x4 A; t. V, E
unsigned int b;- l: f8 r4 }0 y8 S" ]2 E
unsigned int packet_cout;) ~4 ?! I1 T& _* b1 H9 H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& b, P! D* @, Y: o) C
' }, K, y/ k2 w. `, ~, f/ Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) _. O5 b# _; ?' X2 S0 v8 f: N
unsigned int count_copy = 0;% H3 ~. }2 H- X, ?, d; l5 s
. z# S# L* B% X& a
/ g+ D' I) e/ k E/ g$ Y$ ]int main()7 U& E; z0 n, b
{* O- _* j( ^- o
pRX_MSG_PROTOCOL pshreRAM = NULL;
( I1 |* I3 I+ y9 L) v) @: d pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( F# u& b. J' |. I$ z' h# o
, r) J k& W3 \
while(1)
* S# W* b; l' W {5 J! |( U6 q K5 K7 V4 O7 W0 c
read_MSG_buffer(pshreRAM);
% d4 i: E- }* F0 s" M/ ` }
+ x$ {5 v2 C$ t4 b}- I" ]- Q: I5 v% }. k, z' }
8 }/ j/ F* h4 S# P& j+ Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ U6 N& X5 q1 I9 q4 i{
+ P. s: J6 w( Q) d1 [9 t RX_MSG_PROTOCOL buf;! O9 I* u4 C6 F% m$ \! c' A
; o l' y0 F, }; |- ^
buf.a = pshreRAM->a;2 i- u" r r- \# N$ B
buf.b = pshreRAM->b;
0 P6 D# H# K" p6 a4 T- ?5 f buf.packet_cout = pshreRAM->packet_cout;
6 N9 R0 _: P! ]) W$ ` 0 l6 z3 h X3 q% f" }( }) B
if(buf.packet_cout != count_copy)' B7 r0 s- X$ O
{
8 h9 H) e7 n7 B printf("a is %d\n", buf.a);
2 i& }8 F5 {) Z O1 a' \ printf("b is %d\n", buf.b);3 F! Q, x1 I( T' K- R, C. G
printf("count is %d\n", buf.packet_cout);! N/ H) r# U0 t! w2 c
count_copy = buf.packet_cout;% `* Z& \/ s4 C3 }, \
}
6 p, m# l% M+ S) r! P3 N, I: v+ ?6 } else. S4 B8 T& X1 L3 ~
{9 @) L( s5 D7 } _% P
printf("No effective message!");
* ^! R: A: q* D3 ^2 T4 f+ ] }
1 s5 u6 |+ l0 ?9 r- A}8 F5 s: P( R/ s5 f9 }# ]
4 @, P" b( U: z5 I) g
1 B; }. p A5 H2 G! {* n
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" o9 X9 o1 X: E
使用下面代码,对内存使用了mmap函数后:! | P% A9 t1 B1 B3 k w
#include <stdio.h>% G7 _5 [7 i' m' y" |- t4 e1 X2 T
#include <unistd.h>8 R1 v) S, ]2 s+ t
#include <sys/mman.h>; \7 U5 j# W: Z( c5 p& m
#include <sys/types.h>% z% k& z7 r; I' T# H6 y
#include <fcntl.h> A$ @# V) ?" r3 j
: O1 |) S7 C6 f, W. {0 n! q* w#define SHAER_RAM_BASE_ADDR (0x80000000). ^1 C; o8 e5 S: H5 R, v; p
#define SHAER_RAM_SIZE (0x20000)
2 [/ \/ J' d# C9 H/ Q4 C, t" B( y+ g' Y4 b4 y8 M3 v
typedef struct( N2 `: ?9 u, a' H9 @; {. U
{, y2 V% N8 ], X$ D* o. [5 A( t2 t% N
unsigned int a;
' R: [6 v' @0 ^0 w7 A8 q. V2 q) f unsigned int b;6 G5 l& d( ]) t6 P/ L
unsigned int packet_cout;
7 e9 I; x9 P! M# u8 l0 J, ^5 K% \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 {3 r4 n6 H t5 L! Q) O, m1 f8 C
! y! P* L; _" Zvoid read_MSG_buffer(int *baseaddr);
8 R/ p) l# Q/ i9 v, @' bunsigned int count_copy = 0;
- Z: i# u O" |& R' l7 _# }& `' |4 Y2 t M+ B, o2 G) p
int main()
Z; J) g3 S Z8 [{8 x7 v B& ~) J4 D- Q
int fd;
# ~6 R" @+ O+ X+ v) J i" W7 P int *mem = NULL;/ Q" b; C% V! s* E: p
+ H" s4 J5 {/ \) d' q6 ~" o
if((fd = open("/dev/mem", O_RDWR)) <0)1 x6 Z& a: u0 M- [9 P
{
1 m8 P6 W8 j! J. u; A7 P perror("open error");0 w3 B$ s j; j; o, {3 c
return -1;2 ], [% g8 [' |9 m" y
}3 k. w& N' r |" T8 d( l, z
, {& D; U5 f1 ~# D5 O
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' k5 \6 Z2 _2 x* x6 I
$ r3 i) e$ w/ F# B while(1)7 d* r* _; k+ z; M2 {. m* g
{
. [9 N& l! x/ |) Z+ d read_MSG_buffer(mem);8 d1 l" ]: A. N" C+ V+ I6 K
}
# W) N6 H1 y& F F( Z}& o& M0 X. F; E: d
: V: ~4 w" @+ F1 F3 C4 p
void read_MSG_buffer(int *baseaddr)( B7 k% a7 M# T0 Z$ r8 j+ K
{
4 z) `' H W1 N9 ~+ ]2 d pRX_MSG_PROTOCOL pshreRAM = NULL;
" j% B% ] O+ O8 x4 v
6 d9 u0 g' } ]! k! B t pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% }0 t; \. ~) s) g. Y" C0 \
- v" E7 s d1 a B; r4 q4 T if(pshreRAM->packet_cout != count_copy)
: p! h v$ I. w6 S/ L' ?- M {# x' k$ b) `; x& d0 y7 o8 h. v
printf("a is %d\n", pshreRAM->a);# p, C0 U- {* U! m% g) s
printf("b is %d\n", pshreRAM->b);7 ?3 K5 J2 D5 L1 X7 H' Y
printf("count is %d\n", pshreRAM->packet_cout);0 J; u8 w9 Y5 V [) V8 r- I
count_copy = pshreRAM->packet_cout;
- e' U" C" d+ Y$ K0 y! M6 I4 Z# { }4 g; ?7 m9 f. L- V+ V1 c5 G! v
else7 U: Q$ P( u$ |) M$ A" o1 a* b0 T
{6 L% r) K" ?) X8 j
printf("No effective message!\n");2 l" m- ~# A- A; `' }
}& | ?8 C J1 s H
}, @* E$ W5 T" E$ B/ ?2 {% f
) D5 Y) C3 {% f$ V2 E
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* X0 y0 o3 ~8 M) ~* t0 w" j
& [, f; q7 a; U
7 ^& i3 ?# V8 \% Q" z- u( e U5 i+ F1 J
' }$ I8 Y2 ]& ?7 }' x
|
|