|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 `& H9 U2 N' C8 Y4 q9 {3 @
/ T0 Q/ I( D; d( o# t: eOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>5 I, f7 X y! {3 a# _
#include <unistd.h>* ~2 j7 t+ r9 r2 \% D( p6 a- H
#include <sys/mman.h>
( x) y5 g8 E7 o#include <sys/types.h>
* |4 y' T8 f% _0 ~) Z6 i+ D" g#include <fcntl.h>
1 {+ u0 e" W& y7 b, y# P1 b+ i
4 g2 g% c% ] w/ V1 L0 B#define SHAER_RAM_BASE_ADDR (0x80000000) 5 d- F# w7 S. z% J/ K1 K
4 r6 I, }" c# ^1 ] \) O
typedef struct
2 `5 ]' H$ F. ^, B{4 \0 d# Y4 Q6 k( J$ P
unsigned int a;
4 V- {% V5 G# J* s4 g2 e3 h unsigned int b;
' ?( a ^9 o0 ~* p+ [ j unsigned int packet_cout;
3 b, E: m0 c" B; u}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# J! q/ c7 t4 x" ^* g+ W7 Q2 r8 F& w9 ]: l8 k- Y0 \4 N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 D/ u- [1 i0 }2 z0 p. ?unsigned int count_copy = 0;( }2 i$ l2 b8 ~3 K7 r" m
4 Z+ }1 m H/ o+ p
7 F; v& x7 J( K
int main()
& X/ N. q1 ?" c6 k$ O{
/ K$ O4 y1 B; x* w# Q+ ]) a pRX_MSG_PROTOCOL pshreRAM = NULL;
; F1 d) }, G6 U) U pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. q% B; h3 v! V) G. ]9 w- f5 S- L- |! S3 W. z* j+ q
while(1)
; `4 N/ H+ W5 q' J {/ o2 `4 |4 i+ o
read_MSG_buffer(pshreRAM);- d. x% O' H, G1 o# Y9 G* d
} ' ~/ ?2 ~+ v1 h" n) i2 _/ |
}8 E5 ]- w5 t0 W- k9 d
4 b7 r) `8 o9 a2 K
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: L( Y: P" W4 D& [' a9 z, S{
2 ?6 [. \' k9 A( ] o4 m RX_MSG_PROTOCOL buf;
) g; z% k) z2 Z( p* X
0 t p' w% m! |; x0 b2 m* |( e. @# M6 M buf.a = pshreRAM->a;
8 M- K* B+ {3 k& @ buf.b = pshreRAM->b;
& m( a7 r2 [! f) U6 l buf.packet_cout = pshreRAM->packet_cout;8 l- v! h5 }0 }5 e5 G5 j, k% u
2 ]/ c4 Q( \. O3 ?! }
if(buf.packet_cout != count_copy)7 m# ?! b8 j5 |% K. ~0 J
{+ J$ B( k3 ~; G$ y
printf("a is %d\n", buf.a);
8 t Y, O# E4 k/ K1 j! \% e printf("b is %d\n", buf.b);* { E7 i5 k9 m3 b
printf("count is %d\n", buf.packet_cout);3 Q8 Q4 K7 t, t* L; q. f/ C
count_copy = buf.packet_cout;
6 b& g; G3 p N: _+ e& B" i }
1 @8 c5 q0 @. g1 u; W' O else
' X: w# d4 s ]* |" R {
$ d; @* o* F- `, g& L printf("No effective message!");
& [( k. q3 @: j/ D }/ C) f6 n; _) H8 K9 |3 e* X# D
}
, n$ K x7 @. J K) E2 d
' Q* j9 d( H+ c3 v6 S
% z% L+ F- ^1 g4 p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 i* o4 x: ]7 h9 U& g使用下面代码,对内存使用了mmap函数后:
' c- U' Y1 @' K#include <stdio.h>/ i4 |6 o1 l3 _/ u2 K
#include <unistd.h>
$ H" v3 X! `- L7 i#include <sys/mman.h>; ^3 W, ^' B% D# C6 }
#include <sys/types.h>
3 H( t& T2 p6 t W$ X1 B#include <fcntl.h>+ m. M, L5 l" [: V1 U- {4 z
( t, M8 g% P/ }$ F
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 n+ a2 g5 ^" T6 \#define SHAER_RAM_SIZE (0x20000)
2 W% b) k) v4 t: w
' t; V; f% u) \' h* d8 D8 atypedef struct
5 P7 K5 @4 U+ E9 _3 @% J{& O5 l) d4 ]* v4 _8 |
unsigned int a;
8 Q3 f# t3 R; y- k4 H0 ~ unsigned int b;
/ ` r7 g& M+ _5 Y unsigned int packet_cout;
% {8 y: k0 t, h0 s1 g9 ]}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 n, K' @4 ]# A$ ?
) c7 E2 ?+ H; C& @% S# {void read_MSG_buffer(int *baseaddr);
# p* [" g& l7 G i& h% B" \unsigned int count_copy = 0;6 F7 y, a$ h( p% b0 r: m$ p5 z' t
. c! Y5 o' `, k* u3 ^
int main()
# j, W! `0 I% q4 D{
: T. X$ @, s1 k int fd;
) h8 { Q8 T0 y% m. F- S. G int *mem = NULL;
7 u7 x9 I. I0 p5 h3 k; r% u+ F! X$ _
: n9 j$ G& o$ r$ y. C if((fd = open("/dev/mem", O_RDWR)) <0)
( e! @& V4 C% K V3 T( _ {5 K) u; j! B, c3 A& [$ s
perror("open error");
% k3 p3 c z+ s$ j# [% m return -1;( O( w | |4 `! R: g3 y3 B
}
; ~6 }7 D& R7 y
/ O- ~& {: J. G$ x, e$ { mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) g n( [ @" r- R/ S" |2 P/ V1 H
while(1)+ O# W' K/ U! h l: n
{
6 _3 p6 b, C/ ], Q$ g: _/ X) Y7 r read_MSG_buffer(mem);- ]& ]* C( k# n( D, ~. N
} 0 u% q& B9 f' |) d5 L& v3 z" N
}
% ^9 E Q/ F1 w* H1 n7 L9 X
4 d c! V" S3 Ivoid read_MSG_buffer(int *baseaddr)! r' }; k" ^* i4 s! O, l
{/ {. J: A1 q/ _0 T) {6 v& H
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 }% [ `' c( w; [
; J! R2 Z- {# a; s, @ pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 h$ q. }6 J, @( T: ^# F* V
4 Y+ |7 K- S; @, E- R
if(pshreRAM->packet_cout != count_copy)
# G; u4 ?$ _! }) P {0 A8 J, z! Q* @, S* k
printf("a is %d\n", pshreRAM->a);8 @9 c0 [4 z: `. U3 c: u0 l# @
printf("b is %d\n", pshreRAM->b);& r* f9 D- S; V' \6 G( C
printf("count is %d\n", pshreRAM->packet_cout);
: ? v% N* [3 @3 N2 a* w count_copy = pshreRAM->packet_cout;
: |- z9 }$ i( A }
# x& }! ^* S* q else8 Q& F4 |0 q( W9 @, g: p
{
: \1 u7 V4 f1 g0 D printf("No effective message!\n");; j) _8 I' P R
}9 B% I; i3 i, ^
}
6 u b- n$ q% e) n! a8 Y2 u @4 F
8 k6 T5 `* Z: d) R# N. e1 P没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???7 X$ T, l5 s2 u; Z6 c: q5 }7 I
8 U/ U* p; {' Q$ R3 }/ H: U7 k8 Z
) r* P. C$ e' R5 u* Y- @; F- a
( Y. f# `- n7 e. X
|
|