|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 `2 b+ z$ F- z" z
; @5 Z/ {' M z S/ cOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 U( A1 C5 \1 M6 E3 m7 O, a A
#include <unistd.h>
* V. q- ?+ U$ S# ]! Q7 [ \#include <sys/mman.h>- T* @( i" j8 Y! x
#include <sys/types.h>3 t6 {. L2 h: O+ W& V5 M g
#include <fcntl.h>
) ^/ Q6 q" z- X" S/ b9 }
: z* C4 F' [. {7 u4 ~#define SHAER_RAM_BASE_ADDR (0x80000000)
! s6 v' |) w( l' ~, G K' ]' c% L9 d5 m6 }# n {1 d1 b
typedef struct
( e! N0 |3 D4 L1 v' r{
9 ?" G( E1 W' I2 R# m( O4 r unsigned int a;
. R* Y6 I2 H) T6 R# [' n o4 w unsigned int b;' _+ @+ Z: t" `5 }
unsigned int packet_cout;/ w, E! D' o7 [ N$ E. I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( v0 K; I0 X) R" X4 w! C0 r+ B' U+ @& q8 Q% w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);, q+ [5 [! |1 B" t
unsigned int count_copy = 0;
. d6 W) {( @2 N) A" y1 b: v" L; C2 I
2 S: T# t* `, C1 [7 C8 y) Y
int main()
! f& |! O4 l+ i1 C# ?{
9 o1 L% H+ }$ x9 E# ]6 z pRX_MSG_PROTOCOL pshreRAM = NULL;
# U8 s: W/ O4 j; s- H pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) p/ d# Q4 \6 I( U. z/ d
$ L9 m* z, g: |6 U, v2 {3 O while(1)8 K4 f* G& d# E8 k: }, L
{
0 o$ K2 W- O- a% L) N( d4 d/ A read_MSG_buffer(pshreRAM);
8 M0 h! [7 a! k# d' j } ! T7 ]& N E6 ?
}
1 w4 X8 J+ K9 T
" [' { c0 Q. \( _# ]( j/ _; tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ o" E. a! b L2 I0 L: t: b3 x
{
# ^6 w5 k. ]! M& X2 E' ` RX_MSG_PROTOCOL buf;6 ~1 B- Z% u7 v+ a
& I$ B1 s- m" M- i buf.a = pshreRAM->a;; p- S. m0 R0 b- R s c- K- F
buf.b = pshreRAM->b;/ j, ^: x( `9 A; ?1 n
buf.packet_cout = pshreRAM->packet_cout;
; w7 U( e; o3 ]% u+ ?
& e/ ~- b8 S' ` if(buf.packet_cout != count_copy)
& @" b# P; J+ m/ G$ u {5 O% K+ H7 I. l$ K5 N
printf("a is %d\n", buf.a);! ~5 N" V$ \$ H" g, t: O) F
printf("b is %d\n", buf.b);
& l: ?. O5 v& V1 `, J printf("count is %d\n", buf.packet_cout);7 A7 y6 H, j, G" v1 E
count_copy = buf.packet_cout;
: y" P: m% u* k7 L# c }% _# _/ Z! J6 U
else
% l u$ S% [0 O& Z3 y0 @* I {
" e; n8 @7 b" P- ^" ?# [+ y3 E printf("No effective message!");1 h1 G, F/ `- Z6 O d
}7 u' r. P1 Z/ U
}3 W8 O( _" O8 N9 K; d' Y
- c. d% ? @, B. w
( [0 V8 C6 a+ \0 d
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 S5 h2 k* X# a. }5 K4 N: L0 W使用下面代码,对内存使用了mmap函数后:5 L. H1 g [5 e" ?
#include <stdio.h>2 V2 ]) f5 K$ f' K# `" u
#include <unistd.h>7 y4 c2 k9 E% C
#include <sys/mman.h>( G1 i' r/ C" M: s% _
#include <sys/types.h>
/ t5 j0 E& P# E7 H9 B#include <fcntl.h>8 w1 `! F/ j. T% B3 w! ]3 ~! J
: }" K0 H8 t |5 u5 S#define SHAER_RAM_BASE_ADDR (0x80000000)& d8 r' A. Z( ^$ c6 e
#define SHAER_RAM_SIZE (0x20000)
; j! }( H. J3 @4 f& f" _) J% S6 |4 f4 F6 n0 V& d
typedef struct4 ^% P, p3 s- s* J! B6 W
{8 C; P, X7 \4 F9 K8 ` g$ s6 J5 S
unsigned int a;/ f) U' y" c! P& _; a
unsigned int b;- A2 D2 | F0 K5 q0 M% a
unsigned int packet_cout;" h$ j% z$ [/ H( |" g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: j7 `$ K2 {* M+ F6 F- e
$ y3 J* \4 H4 u. kvoid read_MSG_buffer(int *baseaddr);
# m4 x2 P* i8 V! d! t( junsigned int count_copy = 0;
5 }& s. |9 f2 s1 |* \/ h
8 c$ L* Y6 K* N. E1 z# J; S1 s# {int main()
* n9 z$ A$ c. ?: A# M) p{
, N( n$ @* d( w int fd;
& H+ l _5 I z3 ^ R: | v% n) W int *mem = NULL;
" J' T% [( W% a2 a: l: `1 O8 S/ X/ K! R+ e# m% L" C+ b6 q
if((fd = open("/dev/mem", O_RDWR)) <0)
x' {2 r% N+ s7 K7 i {0 e, e$ W% z ?
perror("open error");% b% J, u4 g6 x$ O5 q# [8 c3 y
return -1;6 j$ C9 m" k; X- l4 v7 Q$ A$ p
}) d9 J# z, ?4 _5 W3 f% i' l* M
' c3 L2 L: v0 J
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' e3 f3 O7 D+ `% V/ ]
2 D7 A8 a4 V% M& C) ~" p while(1). q" j- h- T: n4 ?8 N# c
{
( i1 R. \/ O0 b& a read_MSG_buffer(mem);
! l$ p/ G( K2 T" A6 } } , j2 @3 S+ r' J4 `4 J, ]: `0 H
}
& }, Y e5 I: A. b
. {" l4 W, H% ^void read_MSG_buffer(int *baseaddr)
; h' |6 C/ w% E# e: y |1 C. B{' J C5 E3 S5 \3 w2 m
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 C% J1 a* s" ?* O" T# g2 M
" V" X: w5 u. x/ B2 F% G: N pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 A' u7 [/ Q/ e4 J8 Y
( f# b% _: q) S5 l( v, C if(pshreRAM->packet_cout != count_copy)
/ t ^. ?0 T4 V" F- \- M7 h6 } { I, }* A; i P2 b O
printf("a is %d\n", pshreRAM->a);% e( A1 C$ \+ |
printf("b is %d\n", pshreRAM->b);
+ F7 g3 ^1 Y9 @ printf("count is %d\n", pshreRAM->packet_cout);
1 ~3 Q' K( O: b! S5 P7 U count_copy = pshreRAM->packet_cout;
7 D; W, z; p/ V/ N }9 P% i9 S( r, K* i
else4 o2 s; H4 y# ]
{+ @2 N) y8 B$ b9 L, r, b
printf("No effective message!\n");
( h( P5 R: v* f3 t c2 z$ j }
0 h/ {+ e$ i2 o" y}
* B# Y% O9 ]! a; q
. G) R# z; H/ W, D: T没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! y* K! o1 g6 U# H) c' ^1 m' [
@% {* X1 N+ |5 J4 o! H
# l6 |6 L& c# T' Q% Z: |
8 h9 ] T5 I8 q0 x- J' M5 A; `2 h6 Y: I7 y/ `+ f8 t% o @
|
|