|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( \3 B, M0 r" |7 M1 Z; r7 a3 Q
1 f+ @* O5 z) D: D, l) ~OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( Q o/ a/ r) g/ h" t; Z0 t8 X#include <unistd.h>
" ^3 w+ O8 n& g#include <sys/mman.h>- V0 d# _1 g: {* V: H
#include <sys/types.h>5 p8 B0 m8 q& ~6 h' f$ j/ v- U
#include <fcntl.h>
8 m/ K! ^, c: ~8 V* j4 O
$ ^: y/ t H; [: U) y D#define SHAER_RAM_BASE_ADDR (0x80000000)
, v4 {# W3 m% C* q6 P0 _" l, e$ o7 }; P7 q
typedef struct
3 m/ P; R c9 l7 p# m' d$ L{
2 o! J: M- v4 X2 e- f$ v unsigned int a;
1 z! ~# |% V1 L) M% ?5 P* o9 s unsigned int b;0 R) m" \3 S# e0 k7 X+ [& v
unsigned int packet_cout;
, p8 _& m9 N; j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 ] O' Z; y/ v/ @4 u1 K
- m3 p, J7 q1 cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 W* G% M. m0 c7 q: f" E7 e1 funsigned int count_copy = 0;
) z; B* ~' m& [& {3 j7 z1 v o, A' C* [
( e: _) `& m9 U3 o zint main()4 [; K6 x6 j) G7 g3 ~; z1 R, D: J
{1 D8 q+ T8 V# Q F5 W
pRX_MSG_PROTOCOL pshreRAM = NULL;4 R. p! ~$ ^4 J! J
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- L' t/ `/ O. _2 m. t! _8 I, ]# R7 l5 Z, q1 h
while(1); i: e" l! I/ T- J1 k: i
{
`' d4 @8 ?. Y3 R read_MSG_buffer(pshreRAM);, D! c3 s# O3 W2 c2 z
}
8 ~' F3 ^& z( j$ S& n* J}
& m$ v7 ~% G; i1 x; |) O8 t
. i5 c* ?; t7 B) k% ?) k# }* yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- u/ X3 N0 V1 c* A/ v
{
$ l/ p9 h$ f5 v, S! z; z( N/ j RX_MSG_PROTOCOL buf;
5 Z( g/ X& `6 f, ? 0 _, j: G3 }0 L! ?9 ]
buf.a = pshreRAM->a;
7 f A' X& d' c: {+ g' t3 ?$ R/ }/ v buf.b = pshreRAM->b;
- k) q+ K, G$ R( O1 o& X2 {6 O buf.packet_cout = pshreRAM->packet_cout;9 u% G, D8 Z: l0 D1 |) |
' N* I0 c$ X) O" l. [* e
if(buf.packet_cout != count_copy)
+ e: M) s& S5 Z( G9 c; ?' i {
$ ]7 o3 e3 W2 g printf("a is %d\n", buf.a);
! O# w/ R u5 Z printf("b is %d\n", buf.b);
: Z5 L8 `% u8 O8 T$ G* ? printf("count is %d\n", buf.packet_cout);
8 t8 b' @2 G3 P. ] count_copy = buf.packet_cout;7 g1 y0 w- L7 t, S% K
}
+ T+ t* j* V) {1 P: K* u- v else R5 L' ?( K- n# @, n# U/ T* E
{
. F( n4 y4 _. [. H4 o! i& e" X, l printf("No effective message!");
: {/ ^$ G% V$ W e. Q: R% t }
% I! Q$ q/ ]& ^- Y}* K6 |. @1 S: M6 M% N( y9 @
, l8 y* J! y( N9 {- C3 D9 p* `3 N2 q! a
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 N, ]; x! b7 T6 R' p7 g( Z% e使用下面代码,对内存使用了mmap函数后:
- B, d( I( V* @5 }7 _6 v$ C6 M9 R& Z#include <stdio.h>
8 X% T1 X/ Z/ ]! ^$ X#include <unistd.h>* o+ ~, Z. L/ E/ O) @
#include <sys/mman.h>. F/ F6 q D" E/ g' Z" s
#include <sys/types.h>9 g( m3 F4 j u/ Z
#include <fcntl.h>
2 [2 z1 \/ l4 [" L J
7 k, B" J) L, P. r#define SHAER_RAM_BASE_ADDR (0x80000000)' X: c+ p4 j5 @$ I
#define SHAER_RAM_SIZE (0x20000)
$ ~8 V( P9 i v w$ W7 n. C
* m+ A% K9 T4 z8 y9 |typedef struct
7 |* ~/ ~6 l2 `' b; J{
- y g9 O( `) L; b! Z- n unsigned int a;$ A; \) m, f5 h' \: `0 s
unsigned int b;
9 Z8 A, d4 l; ^/ e2 P, m unsigned int packet_cout;; n: X3 a+ K9 `/ {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# A% u% u1 E( N- v. M( C; e1 ^7 c
: ]% \) v8 s' y, w" ? ^" i
void read_MSG_buffer(int *baseaddr);
* @# L3 s0 H/ [4 ~' i1 }4 g; K9 Uunsigned int count_copy = 0;
# W4 d1 O0 U& _( z8 c& x) I5 J, m- x$ V
int main()
9 z6 h2 O- z5 `/ Q ^{
5 G- d; t, ` W- u! O int fd;
; ]# C* c* p; O f+ X int *mem = NULL;
; k* c; u2 w8 [ ?3 q: f5 N, V
7 N" E7 X& m! I- M2 X5 R0 Q+ ? if((fd = open("/dev/mem", O_RDWR)) <0) `# t9 F' Q/ K, Q7 N: N3 S
{
& N: E f& o! O) F3 e1 } perror("open error");3 i0 y: B; [: Z% a$ O9 e- X8 Z$ t
return -1;
5 u8 T/ g( c( A6 N# S }6 {' z! P7 f4 F: {+ p% `
- U7 R4 P) ~9 c7 z5 {* |/ [% y6 y
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ O# Q, _9 f: m' C7 f; i% k! A1 g& m
while(1)4 A7 O% G+ Y$ ?, m. [4 V4 A- _& Z+ W
{* f3 c l% |* Q9 e' X
read_MSG_buffer(mem);
4 W' E: ~& z1 D0 X( i# ] } 9 m9 l. ^1 T3 T
}
$ ~$ j G* t! H( e5 j! L' I% k9 A. U% _, V$ p% Q
void read_MSG_buffer(int *baseaddr)
0 d) S# Z% {& |+ J3 i6 z2 A{7 X2 K) S" | ]
pRX_MSG_PROTOCOL pshreRAM = NULL;5 i5 H$ s. K! I7 i* F& D0 E
9 E3 @; E$ w/ G pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ [* A6 x8 m w5 `- l
2 \: |8 o, D7 r6 a0 U9 v8 [' O if(pshreRAM->packet_cout != count_copy)* `+ x* ^; m0 J7 M" f2 C G M
{
9 H2 }- k# |; ` printf("a is %d\n", pshreRAM->a);
- E) N8 |( k4 C) z: Y( } printf("b is %d\n", pshreRAM->b);
$ R& ^) }: b( @3 ]; d% k5 ? printf("count is %d\n", pshreRAM->packet_cout);7 w7 E' @% ]. Z1 U
count_copy = pshreRAM->packet_cout;
: [" @4 k$ q7 G! {& Z( E+ d1 C } E/ S9 B M8 A; N/ L9 b9 h
else+ y$ k/ n) s& v2 z* m p
{5 z* ^! j. D5 ~' u) H
printf("No effective message!\n");8 Q! Y# h; o. x- Q: ^
}
" `2 N- F g6 x+ y# T}
, m! J6 Y$ i! h5 ?2 b
7 ?' s' v; m! w/ g没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 F) S4 }4 _& j' Q2 Q+ r- k: o& m
; b9 `) d1 ~) |8 I7 S4 i! R$ @0 o' ?
0 J+ N4 `1 X" `. H4 @% \
|
|