|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! N' A, G' J( q! Q* B2 R
8 l4 S1 d4 T0 u; e4 f0 b( g1 AOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 @/ g5 D7 P5 s
#include <unistd.h> d" v. H4 D$ J6 s1 f; f3 Y
#include <sys/mman.h>0 w$ {: p0 w" S" t; G, D
#include <sys/types.h>! X" U2 I& i# y" N- R5 }4 V
#include <fcntl.h>* K$ [* e. ~0 T6 {
5 l$ Q) H' [. h- o" [/ a
#define SHAER_RAM_BASE_ADDR (0x80000000) ( G" v; @% `4 l9 J) z, S% G
: x. {! v6 H; Ttypedef struct
$ e, Z7 h0 a$ E{ _ F* k+ e1 [( X
unsigned int a;
F& q# Q& G, D+ L4 ~- ?% O unsigned int b;
" @& m* k. N7 J" G! B unsigned int packet_cout;5 Y0 N. ^7 p& ]7 r1 x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 O) i& ~/ T6 D E4 F2 h7 {3 N, a( U9 ?) f! r9 L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, G; j# Y. C/ e) F; E% ounsigned int count_copy = 0;
+ p+ V. N# d1 n9 K6 _6 H* n8 m
- K! _" W3 x" E$ S
( {% L. u, E/ X0 W; A' d4 o6 Iint main()
$ K) c) v$ R3 g2 S! h{
u$ A; Z, o. q1 Y7 F3 G pRX_MSG_PROTOCOL pshreRAM = NULL;
. H0 y. v" s5 |2 k8 { pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, l* i+ Z# w5 S1 q6 }
0 e. n5 e' E2 O+ D+ m( k
while(1)
# @2 q9 E" D' [ {
/ g8 m3 u2 x- k* Q1 Z- u( O read_MSG_buffer(pshreRAM);5 r0 ~3 F: D" c" N+ u# \% y
}
; G; `* ?4 R t}
; N7 r, R% ? O* I5 l' ?# \ O& x& w- M1 E* V4 E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 A: n; J$ g) x$ c* [{2 g0 S4 c- e- j* X! d f) x, E
RX_MSG_PROTOCOL buf;
; }7 V% j1 d% q/ T, N8 k- K, _7 y z: @8 v5 T% D7 e+ A9 G" W* ?
buf.a = pshreRAM->a;
: P( y! T* |7 Y& Z7 F* u/ P( ? buf.b = pshreRAM->b;- A7 Z+ M1 [; J' U9 F' c, q
buf.packet_cout = pshreRAM->packet_cout;. O# M% g: x8 D$ z$ t5 s4 r6 X
- i" Z: W7 F' q" \, D' L0 H if(buf.packet_cout != count_copy)+ p; L I- H- {1 Z8 q! e5 D8 Z
{- o9 x! }+ G) s% F: s
printf("a is %d\n", buf.a);% i/ e. c' \* C" o M
printf("b is %d\n", buf.b);
% ~% k( j% {+ ?6 ^! t printf("count is %d\n", buf.packet_cout);
' F; h( Q2 y5 |5 F! r. c count_copy = buf.packet_cout;
- C# H6 {# S3 a% i2 p }
+ O# ^: g, U/ { else! _: A# u3 s( K( z( G* Y' T8 E+ ]
{
" M4 V3 q: D7 N; T! X0 j: Y3 N) p# s printf("No effective message!");% U7 T- Y7 f9 f+ _" v& K) I. L
}* Y% H' i# Y+ N1 S% a# N
}' s: h8 D- y6 J' i+ `- G
& O8 Y& A* H& U# ]* |7 q9 x$ X. y7 g
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; m! S- a' W" ~
使用下面代码,对内存使用了mmap函数后:
' l/ t* q- Z; Z0 u, N0 m#include <stdio.h>7 L) u; j' k, K7 s9 B: N
#include <unistd.h>
: u1 A* l9 N6 j# y* X4 u#include <sys/mman.h>6 M( f- S* Z2 H& j0 i* ^
#include <sys/types.h>% D6 G: O+ [" ]9 m, a
#include <fcntl.h>
6 N3 O9 ]% y, e1 n
9 l+ ?" w" D; f' [9 k/ y) ^#define SHAER_RAM_BASE_ADDR (0x80000000), ?6 l; r9 y# g% }
#define SHAER_RAM_SIZE (0x20000)
4 @: Y! ?7 x9 D* y+ p7 q; m* k5 g) P: E1 u" c
typedef struct- j$ Z( }: ]/ x5 K) ~ H
{
* b* U, H h$ g- { unsigned int a;
0 g# O; B! _9 N; }6 I" w8 T unsigned int b;
; A/ H$ k8 l) f' b2 d' t unsigned int packet_cout;
7 ]% Y2 A2 N4 k; u/ Z% T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 |% L* U# r! p5 a) i) i9 x1 n m! K4 g' h9 R0 m1 m7 R
void read_MSG_buffer(int *baseaddr);7 D p& Z* k. B6 z
unsigned int count_copy = 0;2 E, z1 l6 o! s/ ?7 e. A* G
[# |& {$ w: i2 ~& _
int main()
' X" j `) e+ u8 Q4 t{
, e, f% Q+ L6 h* z+ ? int fd;
8 M$ j7 I; P: C# m. |6 {9 K9 ~ int *mem = NULL;- d4 p0 P3 O# H1 I! E8 F$ i" M
+ ^: |; r+ t" K( D4 s
if((fd = open("/dev/mem", O_RDWR)) <0): Z6 h' K V: G
{
9 J/ b$ }3 _% K1 z3 H perror("open error");0 c& t7 x* d$ x( n
return -1;. I0 j( K. r9 I- r3 V
}
3 M, \& @6 Q2 s
# m0 k6 o. B: ~, J mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- i Q8 E2 A$ P6 q( B9 L% J* b z1 U: Q5 G
while(1)1 j7 {3 O/ ^8 G% ]
{0 z$ F+ P* z* B8 k! E4 r7 D4 Q, M
read_MSG_buffer(mem);8 e" @/ }2 |: s7 K
} , e$ U+ v( V4 v# ?. r% W- B6 _2 p8 `
} v# @: r; e, @ q' ?( G) \8 R
; l# l4 c3 C R; t( W6 M
void read_MSG_buffer(int *baseaddr)0 }6 Q+ t+ a" B
{" @- u& }& a2 I! p
pRX_MSG_PROTOCOL pshreRAM = NULL;) @: x( S# k( e3 g) K$ w
8 c5 j4 S3 S3 Y3 ^- E Z pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 D% z% ~9 Y4 ?; R, z8 \8 J+ i8 u& P9 L/ Q8 h
if(pshreRAM->packet_cout != count_copy)
9 _$ K: d8 ?8 x- B {+ q4 H) M) v$ I/ D( f$ @: l2 b7 {
printf("a is %d\n", pshreRAM->a);( F/ t, P" `. S
printf("b is %d\n", pshreRAM->b);+ H. Q# M6 B) k$ }+ E0 l/ O" L: V2 g
printf("count is %d\n", pshreRAM->packet_cout);
5 s7 R m9 d+ p* k: { count_copy = pshreRAM->packet_cout;
+ g6 e4 n9 o6 { }" \8 P/ x$ F7 S: L9 G( ` [3 _
else3 M7 }0 c, G( q7 F( P# m5 t
{6 F7 y% [& M! E$ u
printf("No effective message!\n"); u* Q4 w! k& g$ |- Y' f v
}' k* k3 K/ ^% k: U0 p4 |, ~
}1 V \6 B2 j& X8 J. i
, q' |: \: Z+ R2 W
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 w" i) H8 i. D
! v$ y# `( m9 y+ \( h9 D( W
* g0 \, W* p$ d+ m3 b. H$ ?+ X1 G8 E& S3 |: C7 n
" S1 I; }% Z9 Y5 K4 y
|
|