|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ; ^. h1 Y2 Y2 ?7 ^0 O
) v7 y% l+ h8 \" @OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ F j4 t2 L3 a5 M$ k% C) W0 A
#include <unistd.h>3 X8 b, |( t( x+ M% B% O
#include <sys/mman.h>( D5 a: H8 D- O/ X
#include <sys/types.h>9 x i0 Z% S8 D6 V9 \* e! T
#include <fcntl.h>
" l7 i7 A/ P1 X
* J5 Z# j( ~0 y2 _) [0 u#define SHAER_RAM_BASE_ADDR (0x80000000)
2 k: n b' L4 j: R- g5 ]
4 T$ E( ~+ l9 Y/ Otypedef struct
6 o9 f+ K# {5 p: \% y" q8 C{
3 k+ G2 d D/ r' r unsigned int a;( P# l* X; q. O- ]' |
unsigned int b;( Q& U( t$ h/ r" P; N
unsigned int packet_cout;
$ ]( e: H) a) u& ] Y, Q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. O6 g: M1 o. m" S) y
5 z7 ~+ [* [/ i" gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 j3 ?& E; o/ i* a4 m( m
unsigned int count_copy = 0;
! [* @* ?, J h! M* ]: F4 Y0 o* [8 j! K( o
p; q2 L. F( K" B
int main()
8 a2 ], D; ]9 J0 ` y. _! N: x{- }3 [$ i& [) i, `
pRX_MSG_PROTOCOL pshreRAM = NULL;
; i" {! p. l) J: q7 {2 U1 a pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 ?& w2 H7 G Q9 K4 D
$ J& R3 T/ {+ x+ e while(1)
% H1 D4 G0 J6 W% d, c {& X% Z" w- G2 `- g, b! I- }0 G
read_MSG_buffer(pshreRAM);9 E3 [4 ^! z: t0 t x. v! s, o9 G
}
4 O1 l( N8 v% J$ R}
% U! D" [, \( E# ~- X1 I5 E, c5 r9 V, v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); R1 L: D/ U# [& X: p
{
+ f+ e; E# k5 ]& a, B2 |- u9 k, J' D RX_MSG_PROTOCOL buf;
3 O/ D% Y B) ?+ Z, O- s( }/ Z3 ?
& G5 a2 B& m& [) H) ^ buf.a = pshreRAM->a;! c. i: q$ D6 W i: l9 S
buf.b = pshreRAM->b;3 e' ?% [+ |' d& [+ Q
buf.packet_cout = pshreRAM->packet_cout;9 a0 M) M% G# x6 z9 b2 ?# w: C
6 v, }7 ?# ~, v4 F# S
if(buf.packet_cout != count_copy)! v. p. n: v/ F" o u# ?
{, p T: v7 o6 v- V! K3 A# C' d
printf("a is %d\n", buf.a);8 z" t+ C3 h! z
printf("b is %d\n", buf.b);
( x8 Y2 ?0 g' Y# F$ C+ B1 G printf("count is %d\n", buf.packet_cout);% z$ e' V* v1 a$ G8 \
count_copy = buf.packet_cout;
8 c; H" h, c) t }1 N( ~0 k/ k; p2 H' g) y/ [' D
else
6 n w& E. B! | N7 G {
" n& u" P9 v* e& ~ printf("No effective message!");9 Y/ I4 T* E) O: o; y: ]5 A
}; u7 E7 b9 J0 ^% Z0 x: O, h; x
}
9 S4 E- K' d1 n) p) A8 {8 _: c; @4 u: n6 V! s
) W) }9 H. }. K但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 S7 [) q- _% K F- j) L使用下面代码,对内存使用了mmap函数后:2 l+ I' t& ^0 _& \4 }
#include <stdio.h>
" N( W# Z7 T7 N# D ?3 K#include <unistd.h>6 d! N1 |& v7 }9 P
#include <sys/mman.h>
4 `5 I' v1 t( F- z2 W# z#include <sys/types.h>5 W9 t5 y3 S% P& Y) q# ^7 G0 ^
#include <fcntl.h>
- d( \: y/ ^% r+ }5 b/ p( J0 W/ h& n5 P2 W; a% R
#define SHAER_RAM_BASE_ADDR (0x80000000)) _+ F4 w2 T! x1 ^! e
#define SHAER_RAM_SIZE (0x20000) ! b! q i5 U: m0 Q/ {! G
" [; j$ t* G4 p
typedef struct& f1 A' v" C3 J
{9 }$ ]: I" [1 ?# h' ]
unsigned int a;
. q, N& Y2 ~" ]+ p unsigned int b;
7 Y$ ?9 c' Y! X: c3 g7 I2 l unsigned int packet_cout;
/ _% L1 ~# V' _8 F, |( W0 s9 f" s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" |6 g" X4 ]$ F$ V: I9 j4 t, m8 S5 A
6 c i' ~2 h5 r' w8 W- t( x3 Pvoid read_MSG_buffer(int *baseaddr);
" l* }' j |: Q0 Iunsigned int count_copy = 0;- b& v; M9 s2 a' L
+ f" ?# E+ ]9 ~" E. d# Bint main()! S; Z; M( F6 @: p
{% ]- u2 ]3 [( |' v! f9 t: c5 Q
int fd;
; `' H P+ s. f7 Q int *mem = NULL;. ?2 Q: i% O4 v z: `6 z+ P/ z
$ F1 q. j/ k# F* w' ]( `& \
if((fd = open("/dev/mem", O_RDWR)) <0)5 ^3 o- ~2 @% ?* P2 b: u2 U6 u) h
{
: Z5 A3 ^* z* @! ~ q4 B perror("open error");. c- d9 ?3 D2 L) M$ `8 q. r
return -1;
8 C: }# r: Y* c6 N& Q2 o7 x }$ A# n. S' M6 E! ~3 r$ z
3 g( R2 @# N- A9 d4 f
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);9 {2 G% S1 G) i: s4 C
" g" l& m0 T0 q; `* N6 z) S0 V
while(1)
) A: x. v; x( f. i5 `" @! N {8 P7 j x. j' `1 a; C+ @
read_MSG_buffer(mem);
$ ~5 f3 E% c- x" M9 q* k } 9 X- { j- Y* e
}2 M9 g. S |, a4 {7 D% j
' z; }- f: p% g
void read_MSG_buffer(int *baseaddr)
# R5 N* p' ] b6 R4 i2 X{* [4 Q- C; B* a/ b' k. f
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 Y- B6 ?( u" ^0 g3 d) q9 i2 O4 X+ Y* |% j
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" f4 t2 N! Y8 P2 s" t
; z) }1 O6 p% a3 d. ~. f( ^, C if(pshreRAM->packet_cout != count_copy)
. M# Z! V5 I( D0 Q {
) J q: e) y8 Y: [+ `* {8 K printf("a is %d\n", pshreRAM->a);
& e9 A+ R+ G. n0 s5 ] printf("b is %d\n", pshreRAM->b); i: @( S$ M; i4 x8 P$ B/ J
printf("count is %d\n", pshreRAM->packet_cout);# z. Z5 F% }. b! D
count_copy = pshreRAM->packet_cout;
, H3 m! K# M6 R$ | }
/ @' A$ O3 X9 l; h+ Y else
( a; q3 Z* W2 L& ~ {' |8 g3 N2 g' C! C/ S
printf("No effective message!\n");# ]3 r6 w4 o$ T$ g8 S' d$ y; f5 [% `
}
7 D, x1 P# _9 O: g0 O% F% d$ g: u}, ~+ V/ x+ Z, k' _. t1 n
9 s, s- p2 F7 _( g: |* j没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, [; e5 e) t( s* m: V# V; q' Z3 t5 F
7 O0 C3 z) u' e8 V3 Q6 M; _0 o. d' c5 q
% s- f7 N0 s5 n5 @9 s6 H# M
% ?* j1 B, o4 b
|
|