|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " G6 @ `- M- b+ w8 L: g" m# `( q
: q t& i' \/ ]$ F1 Y) u+ y! i& K1 n
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) j9 F/ X' _0 k) Q8 X4 M
#include <unistd.h>
% i' c6 w6 ?$ d0 R#include <sys/mman.h> Y1 ?$ Y4 n- w; k7 U- [* u
#include <sys/types.h>
5 t4 E7 S/ V! O# H @9 s#include <fcntl.h>" T) c; ^$ @& {: s) y/ m: F
) Z2 A$ S: m: d1 y, \#define SHAER_RAM_BASE_ADDR (0x80000000)
3 ^- S$ v7 |% D+ C. b3 ?. @
, ?% E- Y% ^3 y0 j8 Y. a4 t/ t$ ktypedef struct
6 B5 ~+ a _* } ?" g5 A2 H{
\) I4 _. f( @: z unsigned int a;
* |! W7 R( A/ T6 N: c7 c6 T unsigned int b;
@) Z$ I Z+ h. c. ] unsigned int packet_cout;9 r* E2 I$ i' k" p- S5 i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 r" M3 u4 \: i1 u6 b8 Q
0 \3 e8 }0 v) ]: ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! k0 c: n* `/ H& Y/ Junsigned int count_copy = 0;, S* w& g" _7 }& U0 U. ~; O
$ y" g* d4 j n5 p- m$ D
0 r3 f' r9 I: k. L! D
int main()8 f* ]" V9 u/ ]6 U9 N: k8 A. \1 U
{
% ~3 A9 q0 R4 \; [+ K pRX_MSG_PROTOCOL pshreRAM = NULL;, g* D2 i+ ]$ M( R( [) U6 H
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- @; J, Y6 F- l. g, k; X! D! v! X4 z$ Y
while(1)4 C4 ^5 L+ [( C2 p8 F" m
{# @, |2 Y# Y9 C9 z
read_MSG_buffer(pshreRAM);
- K1 S3 \, ^0 P" F! x. t9 f }
* U/ g/ E* d1 T. K}
; O$ q& ^3 {2 h- c; I; c. @ Q& d* f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 o4 O( T' B! ?8 Y* `% X{
" {0 n2 F9 D& e RX_MSG_PROTOCOL buf;7 c) z. B) A+ p1 z0 N, H8 c
$ ~3 l5 I4 g+ Q/ Y. ~: u8 m
buf.a = pshreRAM->a;' |& [2 q. _+ {' d: w( r2 t
buf.b = pshreRAM->b;
9 \2 V# S4 ~6 Z. i. v+ Z buf.packet_cout = pshreRAM->packet_cout;
) g) Z( M' B& a- S3 }- c: U
1 W5 D$ l5 ]$ k$ A& | if(buf.packet_cout != count_copy)( a. D2 r( ?6 t5 }
{
" [7 [$ o6 L3 S7 o n1 { printf("a is %d\n", buf.a);1 u" i0 g. R; H4 S: X
printf("b is %d\n", buf.b);, g: `+ W$ z& X6 I( Q8 H
printf("count is %d\n", buf.packet_cout);3 J" Z- Y0 `# i
count_copy = buf.packet_cout;
' |' ^+ l+ c' {% y; e w }
8 u* o1 H; Q ^$ _/ V6 T# |, M else
8 d, H* b# q: @$ I2 T9 x {
3 D, v" G3 e, e1 F printf("No effective message!");; o1 }" S" Y3 Q9 s
}- }9 X2 \$ [$ E0 H/ l$ W
}- q x% D0 ^( F3 O$ t
" ^. T' M& L t9 k8 p
4 e0 U7 y2 ^; M* ~但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 U1 F/ O: q3 S使用下面代码,对内存使用了mmap函数后:
( u: m# G8 D4 U7 n- d#include <stdio.h>9 N% L) l% K; x3 F5 k: W
#include <unistd.h>
4 q! G# | P" e# E7 O' j, ]( m#include <sys/mman.h> U6 t$ K6 n5 ~- i
#include <sys/types.h>+ [# S% ?( @+ G" y! `. D
#include <fcntl.h>
, L) [4 D; y! D! y' p2 H5 ^. F/ t# {0 G3 x/ j& Y+ e
#define SHAER_RAM_BASE_ADDR (0x80000000)
( k/ q$ \" @; E6 y5 K1 ?#define SHAER_RAM_SIZE (0x20000) % _. T2 U' m7 `8 W( b0 P0 G' q
2 F' b& |% ]3 j9 w
typedef struct
1 g$ i% H$ R5 d7 X( V, @; N1 g2 f{
{. c( B% O$ {! U unsigned int a;2 d) A& x0 c1 Q/ u5 N5 l& V
unsigned int b;
1 N" S& Q2 s+ o# `5 f6 W2 }; T$ a \9 ~ unsigned int packet_cout;
/ a. t" k/ L% q! F5 s/ n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 f& I" J6 \4 n; ]6 S6 v! M" q2 ]
: E) p( Y& ~) M( b ?void read_MSG_buffer(int *baseaddr);
1 q7 l$ i; w/ O( tunsigned int count_copy = 0;
7 e% w V' Y& u* t7 ]' @" v# H: k( ]3 ^4 t& G: F- o. g8 V
int main()2 Y1 \& ~! B) n" G
{" B1 Y/ d, V* B+ q; s
int fd;
/ |: }; K O' H# |- b int *mem = NULL;. I$ E7 Q% H; P+ W. I! f' W
4 d* C z0 n, O0 c if((fd = open("/dev/mem", O_RDWR)) <0)0 n9 H4 G4 @- }- K: O. a
{
3 x( H( z% |" Y- a- Z! v perror("open error");
& @) F# B; c$ H2 T+ s return -1;
) q( \& \- R. \: I) r6 M& X, O }
8 Q% _5 y1 K) Z 0 ?3 R# A1 o3 ?
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 ?9 y3 q; W$ M3 g4 `. k0 s \
7 G/ R }9 e+ O* X# _/ I while(1)
! V6 q" B" E, h {- D; c5 c# Z$ @5 I: E5 T
read_MSG_buffer(mem);
k( h$ m( q* { m } 2 A5 H9 t7 l" h% w( A
}
5 d. F" L( C% |0 d
& i) p* Z9 ^$ y8 a" Vvoid read_MSG_buffer(int *baseaddr)" d! d0 Q2 \1 s9 B
{* ~3 y( F7 E3 u: V! q" q3 ?
pRX_MSG_PROTOCOL pshreRAM = NULL;, y" S8 j" t [+ b; O
6 `0 R9 N: ^; Q: f
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 O4 L* F, d& | G
4 e9 C# m$ C8 s1 f if(pshreRAM->packet_cout != count_copy)
. p7 v; \& v# x" S: K5 f {
7 C- U* ]( z6 z# P$ v; A: k( w printf("a is %d\n", pshreRAM->a);# M$ `2 G; Y( y5 n( F
printf("b is %d\n", pshreRAM->b);, E! j0 I) t, i! @ A. S9 A) q
printf("count is %d\n", pshreRAM->packet_cout);
F1 P0 a8 {/ I3 {% g5 Z$ H count_copy = pshreRAM->packet_cout;3 ~3 j" h6 ~" }2 y1 q% t
}. G6 l0 b$ s ^3 H2 O9 N; ?
else
$ s, D6 R& k3 l* _) c. x8 d {9 L e' ?0 D$ M
printf("No effective message!\n");! i, a3 C' K# X4 x1 u2 {* y1 n
}
# l" a& s( M/ C* S( j}
' Z6 q$ d5 ], r; |+ Z
/ N: G& P7 ?, X( j没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, j! n/ ~ t3 a& F
# }( ^" @) D( G
) G5 ]& V) {" Z# e
0 k4 c H; x' q6 a( `) e0 P% x
* K0 S+ p/ p# L% k$ ? |
|