|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' e5 e' u$ a3 k, l
5 L( G8 o; ?$ fOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 a" } ^3 H, ] a$ I% Z# B7 b#include <unistd.h>
" x0 u, G# {4 A. W0 J' z#include <sys/mman.h>% [# i- Y8 k' C5 C8 {7 Z/ a2 t
#include <sys/types.h>
' h+ ^2 z F8 n7 P+ D' `#include <fcntl.h>0 L- M- H0 y) K- R: m, b
6 V" t% I B) t( z2 d#define SHAER_RAM_BASE_ADDR (0x80000000) 5 I. g b6 \, w
. j" n- X' f6 m& v6 T
typedef struct$ t! ^; M5 p: s1 L
{/ D- l% J- |3 V1 M- p4 i1 z4 m4 a
unsigned int a;! ~* q: W, O( x$ }5 L3 r
unsigned int b;* Y8 j+ H2 \7 {) K) U
unsigned int packet_cout;
% h4 ^ `. @. B- l. j! h2 t/ @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( T, ^+ N5 A c; ^
3 p+ y$ n, n5 V+ u0 k% T) l: rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 O' ^# Q+ i! w# w- Hunsigned int count_copy = 0;1 U, r2 N3 a( ]6 \1 e. a
& V- l! Y* s3 z; x
1 M. `6 ]( ^5 V( L) p; x
int main()
% y/ g8 \; \' I{
9 U' R+ z: e; V5 _) \4 m pRX_MSG_PROTOCOL pshreRAM = NULL;
# c1 K% s3 S% z! b; o `' ? pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
' e4 O; H; }2 u U" T
- D; t3 I! F r) w! |, L* N, @" \ while(1). ?. N0 G5 B, V+ z, f+ ~, ]
{
, w; u/ {/ [! X/ w7 a4 {; r: Y read_MSG_buffer(pshreRAM);
8 J/ G! V: W) c/ { }
0 u, r6 S. w3 Z}2 ^2 W. E. p* y% M2 { c
* c9 m( x& r- {! D6 n( d1 ~void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 l. w; {$ d* A- y: [7 Y{, x# O ^6 S$ N2 H; f6 r7 `
RX_MSG_PROTOCOL buf;
5 w( Q! u; B3 t. x: @# t
o- [* [$ T: l$ @ Y3 T1 I buf.a = pshreRAM->a;
. S) X8 p1 n) w$ _' s) W buf.b = pshreRAM->b;
" H- d+ j" ^3 r: Q' S" c8 M buf.packet_cout = pshreRAM->packet_cout;
' O9 M! e3 g6 M, a- `/ b, \! ^ f
* c& u: z6 o" c; K+ d if(buf.packet_cout != count_copy). A2 y1 W M* m5 e
{& O6 F0 N1 n7 K7 w) y
printf("a is %d\n", buf.a);- _: a1 Q$ R* h5 |( F
printf("b is %d\n", buf.b);. c; z% n$ e6 n. z5 U
printf("count is %d\n", buf.packet_cout);
9 W2 r" [6 F9 A$ Z1 d count_copy = buf.packet_cout;
6 t- h7 U) K- C$ \; q }% [( e. b$ S9 B* U' q
else
7 ^! @5 q: b- ^; ^/ g. C {" W* k' }+ y% a+ S8 l' {3 w4 Y( d
printf("No effective message!");4 `) V% B* P7 @- I! x( i
}
: q6 z2 Z0 D' N}/ q( U8 W" [2 O6 E4 Z* I: h) |3 f* @
) v& W3 f+ b, V# `9 d
/ X$ d+ A8 `: _& Z) ^( c9 v
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ \' y1 S, o+ X3 M& ^使用下面代码,对内存使用了mmap函数后:
7 s7 Q2 v4 d2 V#include <stdio.h>" ^% u* [7 I: p5 j% S! D
#include <unistd.h>( V% i" \* N$ S; T. A. P
#include <sys/mman.h>
8 v) d. |/ q, y5 }; J* i#include <sys/types.h>
/ Q3 Z- i# C( ~0 a- `! ^- d* E#include <fcntl.h># q8 ~0 M. y. L9 L$ a0 K6 X, ` _
% R8 J& R, c" u: G. {. R( `
#define SHAER_RAM_BASE_ADDR (0x80000000)% o; V7 s; _9 C1 h7 |# t
#define SHAER_RAM_SIZE (0x20000)
3 S8 i5 c5 l# y! @4 G
2 M% p( [% H+ htypedef struct
$ w( M T- Q* G{
; u# ~9 _0 O2 \* W3 | unsigned int a;, [% }6 Q8 N7 n+ E% l9 H+ g+ a
unsigned int b;
. d. h9 k+ a% h3 ?0 U& K/ z unsigned int packet_cout;
& i: P4 P: F& X4 a# n5 g1 C! b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 M) {* K% l; T2 R1 d% y& ?9 h
4 x; E3 X! z! m& Y/ t) Nvoid read_MSG_buffer(int *baseaddr);* D; ]+ g* \6 Q( ?; y# X. R4 T
unsigned int count_copy = 0;/ S& w9 j8 B1 T* K
( }3 ?2 B- p8 L; y5 a4 Dint main()
% x H5 H2 f, ^0 y+ j{; a9 s2 u( n( x
int fd;
f1 N4 d0 K, s; q& P int *mem = NULL;
& ] l% H4 i; q& ]( d; q
+ X, U7 U/ z9 c" y& X4 j if((fd = open("/dev/mem", O_RDWR)) <0)
5 n; x" Y0 Q4 M% ? {
; I" v3 Z8 y- m& @1 O perror("open error");
3 n9 i) a3 Q0 d: | x4 @ return -1;* E7 Y: s( ~2 k/ D, Q; Q/ C8 w
}
% ~2 a( X4 W) D! K8 q
1 n4 O$ I# w2 k+ d% O mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 q( i) V! R/ }
2 C3 @7 ^9 i6 s0 P7 E
while(1)
# P2 W7 V$ n0 Z, g. V {0 C! ^* V y o) ?& L& P$ E) f( b
read_MSG_buffer(mem);
! h0 Y5 o0 E+ J3 y }
$ I( e: t3 v# j* \2 S/ }7 {: W}
& A$ q9 I% O4 R
1 H! y9 r) M; Q3 q# [8 ]7 ~& q) }void read_MSG_buffer(int *baseaddr)1 }0 h1 {# V1 r- H; F# j5 w; Q: L
{/ {" x7 c5 Y) Y! h1 a" l [- V
pRX_MSG_PROTOCOL pshreRAM = NULL;* i, y$ V9 Y. V- F- L
+ Y t. Z. M' e& `' _: o: S& J pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 W- J/ x+ S6 B
$ c3 w" D. t( P0 e if(pshreRAM->packet_cout != count_copy)! [; ^8 S$ D/ X: H! K. S
{
; o. R8 l ^# H5 z( ? printf("a is %d\n", pshreRAM->a);/ A8 I' d; K% d& Q2 \2 m _
printf("b is %d\n", pshreRAM->b);
: `! `$ _2 q# A7 L$ J: V. ? printf("count is %d\n", pshreRAM->packet_cout);
6 n" V2 @- p5 N! l6 w count_copy = pshreRAM->packet_cout;
2 o1 ~% v0 {! E9 x% u" w/ ^ }. n* S1 Q8 G6 k
else- ]. [/ u0 {6 w/ R# @! ?7 X
{
{3 ?: X5 P& r# x printf("No effective message!\n");
- Z8 X ~" C# f7 j0 x) h, h }5 l* f0 K$ A* `5 O/ h
}: l; z1 a+ B7 j# n8 T
8 V- w) `( m6 u8 Q' @没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( p: T' e7 A: ~( H( p
1 R* H9 n( p+ x% Z- a7 E+ M# [
, W+ O' a' H$ @- K
% Q4 @. n# H) O8 x) M5 H2 s, `1 {- V N4 M% u
|
|