|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 E+ Q9 p2 ^) u a; Y6 y+ I
- G: R! q. Q; E( K& NOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) ^& L8 Z6 r" L+ H% y8 x#include <unistd.h>
4 M) j! N7 N, _' v! W, I5 n6 n#include <sys/mman.h>
! ~( [* {# m5 @#include <sys/types.h>
, V6 M9 `- d/ |' P" Y) P#include <fcntl.h>
; k ?$ N3 c6 {) q4 J% c' |7 p: a, f! I% l5 Q
#define SHAER_RAM_BASE_ADDR (0x80000000) & N8 `3 N2 x+ V0 Y
( V o/ E. _( Xtypedef struct2 m4 M. T0 ~) g
{ z, O4 d/ I( z
unsigned int a;
3 E+ _ v6 o W& N% B8 A9 k unsigned int b;
. G- E+ b4 o7 L+ q. @1 } unsigned int packet_cout;
* z M0 m$ A) {& B% q0 G}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
a8 S0 G O r4 M1 b: t, g$ l# K+ g* ~: u+ }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 j J9 J4 n) k$ a4 _unsigned int count_copy = 0;. r' S! {8 g4 e( y
. Z4 ]( Y) T1 k7 ? ?# {0 z0 b( \" { P2 E
int main()4 l# V: [5 i# z o6 M2 `# u4 J
{
0 f5 F- }* h+ m |) A# t pRX_MSG_PROTOCOL pshreRAM = NULL;9 |! V0 E: B" B! U
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" M- Y; o& R- Q Y
2 z B9 I ^/ ?. [6 M while(1)
3 V/ ]' |+ z, B' [: ? {
$ u. z' p9 n% m' C! C6 s7 v; V! ~ read_MSG_buffer(pshreRAM);; S! [: ~3 a* v2 a$ L
} / _: u/ I! Z( z0 k( e0 o; {: ~) _
}
$ ]2 L% b2 E8 b# w5 W1 b! }4 a# s
2 q0 q/ U' I( I5 H1 @7 p K6 H5 ]void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. {. j2 z A7 f& ~8 t/ M2 K* d{) S: |& @( z4 _+ ?
RX_MSG_PROTOCOL buf;0 Y( d7 K; N) j+ m& I
% f9 g1 u, \5 I
buf.a = pshreRAM->a;) a7 N) g' ~; Y! J: D2 K" t
buf.b = pshreRAM->b;
* L- F) @3 U. K0 z. m Y buf.packet_cout = pshreRAM->packet_cout;
( V, s2 i# @ ~; H 5 ^* @+ H) |! A) S; E. O# X5 E% { Y
if(buf.packet_cout != count_copy)/ r* |1 f8 ^+ h0 o
{2 L& F* u) L$ }
printf("a is %d\n", buf.a);% g$ Q* k2 g; ?
printf("b is %d\n", buf.b);( V0 n8 a: z( {! F) j) X! k
printf("count is %d\n", buf.packet_cout);" e( c% Q7 r+ e4 U. g
count_copy = buf.packet_cout;
% i$ i) ?; Z! |6 M2 B+ | }
) f Y- u7 y( X1 y3 s; k3 c else
9 A( B8 _- ` K9 n- W {
9 U$ y p( c3 F, x; l. Y7 ]' z9 Z printf("No effective message!");: |2 B5 { r' ]5 m; j+ n
}
8 i- M: _/ N; x1 E( {" p* c}
1 }3 \; q3 \ ~; ], I
& K0 s" ^' z6 G. E. r' j6 u" [- j6 L: S7 t9 l4 e' Y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- ~1 l4 R* A! l+ v; j使用下面代码,对内存使用了mmap函数后:. G: H2 P! @2 [9 Y7 w
#include <stdio.h>
$ e; f! I+ z$ z+ X#include <unistd.h>) s# _& ^" ~5 I" h- G, `
#include <sys/mman.h>. k6 m' x1 Z9 N; H- Q6 z
#include <sys/types.h>
J e: {3 O8 P2 \! G#include <fcntl.h>! Z7 }- G* G" y1 i! [
4 P9 |9 C& @; J1 m8 l#define SHAER_RAM_BASE_ADDR (0x80000000)4 e) n5 \+ W C) i& f
#define SHAER_RAM_SIZE (0x20000)
4 ?# d* r* P/ S4 u1 d- A" A7 @% ^1 f, s/ B i4 }; B0 Y
typedef struct
z- }* r) Q2 r0 e! }$ z{
5 K, c! a M, Q unsigned int a;
% h! b2 D" ~( z$ l unsigned int b;
7 H3 _- d! Z- F/ Z unsigned int packet_cout;
) X# ?3 f9 r" J+ z3 c' ^0 k$ x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, A" ?3 a2 e5 r5 [( m. y
9 H8 C' `. o1 z& uvoid read_MSG_buffer(int *baseaddr);
) e. ] H3 H& _- ]. \5 uunsigned int count_copy = 0;, ^8 O8 |4 f& k
# k2 x6 M4 S% K/ T1 Dint main()
+ n/ z0 v0 z. {& ^5 w5 P{
J2 ~0 A# V& m1 ?$ }$ _ int fd;- `* w9 x- _1 ]9 H, _# l1 c$ o/ b
int *mem = NULL;
% [2 P. N; `- o/ ]7 D" \# J# z& Y# d- Y; K
if((fd = open("/dev/mem", O_RDWR)) <0)3 S" U. B: e8 V9 Q* g( Q% |
{
3 q5 t0 ^% k0 I# `3 l& S perror("open error");2 A2 z% C! L( }% h o. P) C" c
return -1;
# h9 C/ i; T' {' R }
% ]0 Y3 Y/ z7 m) B
7 E! N% L1 b& v' P3 T) m mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" p: A' l) v Z- q5 {! ~
( ?# n, q9 e' R6 P while(1)
2 b+ l" ^" ~/ |- O9 O {. E1 B9 L$ l; {: h; E" V' Z: t& p
read_MSG_buffer(mem);8 O" Q5 ?( R$ N
}
b& _- `( ~. O C- z, ]" D/ v}
9 n, u& X$ B1 o9 I$ p4 y" ~6 v' k8 b: |
void read_MSG_buffer(int *baseaddr). D! t1 [# P- C4 f; x* C: P3 p
{
& @ y! g4 y" ]4 T3 p: u" M9 b pRX_MSG_PROTOCOL pshreRAM = NULL;
4 P/ B# \5 V8 t2 ]
* J( A' g: i. e; \) \9 E pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, Q/ x g) ^, }' Q
! ]& C8 N; {- s$ f if(pshreRAM->packet_cout != count_copy)
( l9 T) d: `9 R6 O1 ]( N {' _7 M' k7 {5 M# W O3 P% Y1 E' R
printf("a is %d\n", pshreRAM->a);
$ O V7 g# g% p6 D% q printf("b is %d\n", pshreRAM->b);
. s# K. T6 r S0 X" y printf("count is %d\n", pshreRAM->packet_cout);
0 ?' B5 t/ N4 x3 b- e- I" l count_copy = pshreRAM->packet_cout;
4 x `1 m0 j% o" ~ }
& N& {: R& {2 P! u else
6 n! m( y" [( @& ]$ k' R2 O {1 m/ Y0 _4 }0 v- n' O% Z) i
printf("No effective message!\n");
" E- q' w3 E1 M7 u& X3 `+ g4 |8 T }1 }! o) u3 }. w7 E
}
/ ^% i7 [! ]$ C# r; l
8 k4 \2 q1 i7 e0 x没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& G% G8 C+ N: F7 Q* [ ~! f! c0 \2 c) @: ~" A. W. T
( F: O8 r, R9 A+ a! w
7 {- D0 m% K% h; U* e2 z0 n
* ?, x1 I1 a% X7 G* D |
|