|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 ^" J) U1 M, |9 C) g
& E$ y9 Z: R/ L, [5 c2 L" m1 s8 T* vOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ ?* ?# Z) P' }% R% x: R
#include <unistd.h>" j7 s, i% [7 q- y& A9 d
#include <sys/mman.h>
' V; L' `5 E. Q0 ]3 [, s' ]#include <sys/types.h>
' S9 {: m5 K9 m. A#include <fcntl.h>4 E# t# J" o7 C# N. x
+ g! u" u9 u0 @, f" I0 J9 [#define SHAER_RAM_BASE_ADDR (0x80000000) 2 g$ G5 V+ W8 G/ j$ ~8 N
4 m1 J8 f" ~# T2 s
typedef struct
0 @9 A( @% m( u( G6 X{' ?% W7 z/ b' c" g# `
unsigned int a;
' c0 k: a! q- ? r, [8 _7 @ unsigned int b;9 K/ J8 k+ S. i6 b6 G
unsigned int packet_cout;
$ n: b: M3 Y4 n; ?: ?" S}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: _' N! [* N5 |
% V9 ~* b/ N' J6 I. a. nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 o: j. B: [8 S6 ]1 B( Xunsigned int count_copy = 0;" s/ j$ e; o }8 p& f" I
- w4 |" L) Q. O4 W: x
$ @- a# a. {+ P8 fint main()+ Q) z# \/ t- J6 z9 H* w
{
. S+ @( G8 I9 W6 q pRX_MSG_PROTOCOL pshreRAM = NULL;
' j* h( ]3 c1 n, @1 ]. O7 `' h" Z pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" }3 P/ s& W$ M1 T
. H; c+ D$ _; s. h while(1)
8 \4 x Y/ w; K( O- |# E+ @ {
! w5 W$ r3 H9 m9 D" P } read_MSG_buffer(pshreRAM);
% G+ F+ L9 H* ~ }
+ H. q5 w- j, q+ c/ F2 U, U- u) ?}, H/ ^* _: w E; K1 k" o
1 c. x+ G# ^+ F$ n; a9 W3 e+ f, u l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ X( }) q# O: K7 F5 p, t
{
% P( x1 }8 o' j$ p: U: R8 { RX_MSG_PROTOCOL buf;! i- o% m1 o6 x1 R9 r+ _& \
/ Q# z: G0 h' `4 v. C buf.a = pshreRAM->a;9 ~* w3 O4 \3 u% e
buf.b = pshreRAM->b;
( ?' a" F" @' E: s7 k9 E9 s+ j2 C9 c$ i buf.packet_cout = pshreRAM->packet_cout;: U& y9 p9 |9 @
: v2 T9 G4 f+ n3 F7 L
if(buf.packet_cout != count_copy)
; ^8 R2 I2 p+ L! S {4 Y- L( s$ u5 }6 Z2 U
printf("a is %d\n", buf.a);
6 i- g; B5 ?9 j printf("b is %d\n", buf.b);" l H$ S) i/ w1 p5 T+ S
printf("count is %d\n", buf.packet_cout);7 K/ s4 s- X% M) \ X) I
count_copy = buf.packet_cout;
; c* B: E* D8 @' t4 S. n5 }6 s }3 A! \1 y) m/ Q S
else
F9 p/ o5 \1 k, A" ~% D0 `: B {
% J- [, y: G4 {8 N) ~1 ~ printf("No effective message!");
8 f, V: L) e+ E- [ }1 x/ T1 R4 _1 t& o9 E6 y
}
! X# R+ S" D8 e0 ?* \' g9 p) ]- h7 y/ j/ o) M9 a3 r' E
- I9 Z/ E; Z( e- l- K但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% _. d7 z: A2 L9 i0 C( G& k
使用下面代码,对内存使用了mmap函数后:
% [' ^- {. c$ `4 U#include <stdio.h>; F: n' J- B$ _
#include <unistd.h>
. h Z) k# s: o$ b) G( Y) C* u#include <sys/mman.h>9 f- V4 _2 Z) z* o6 x, R0 X
#include <sys/types.h>
4 P5 z% e% \3 E7 K#include <fcntl.h>
% P B& l: ^# j, D5 H) _0 I
' X r, b% s2 G#define SHAER_RAM_BASE_ADDR (0x80000000)
4 M" \8 A a4 Y0 {5 A#define SHAER_RAM_SIZE (0x20000) + f4 y( ?3 i8 K/ u9 W$ t! g% T
( H0 U& Q; B5 [5 a @$ w) \
typedef struct3 G; c6 z) ]: N( D- {# C8 N6 m
{
& s+ }: ]8 [. p9 C unsigned int a;6 r5 o6 t! p& r( q" r0 H T
unsigned int b;
) z' _: \8 r$ N2 i. e9 M unsigned int packet_cout;
3 Z! m" O# r' J}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 r7 y5 Y! C: g% }5 f! L- _7 c
, C6 H4 Z9 l% X" a" y! Avoid read_MSG_buffer(int *baseaddr);& e0 t/ i+ x! }( `" u
unsigned int count_copy = 0;) X$ \1 }6 @. {( r/ Q5 _; g5 M% }
u6 q, r$ \: j9 e
int main()
! g5 }7 ~3 p. r" C{
/ i( ]0 q5 M5 `& ~6 Y9 \" b5 O int fd;6 x! v& V. l$ C4 K9 j% i
int *mem = NULL;+ i& J" a0 Z* |7 K
! T9 _& K# ~1 k t ?
if((fd = open("/dev/mem", O_RDWR)) <0)
- c+ ^3 q5 U% C7 a& Y/ D# ~5 W {
7 Q# b9 a9 ?+ Y perror("open error");1 E8 r/ I1 [ J; F! \+ D
return -1;
3 Q* y6 ], t3 ~ }% ]2 l4 ~2 O$ s
& e. U* A3 X+ t! u6 R* w- |
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' n9 {$ M/ X/ Z6 C) {: c% e
* r; C' R( \! _ while(1)
" _1 I; H$ t( Q {
( P. E9 h; I9 k9 J read_MSG_buffer(mem);9 ?6 \& ?3 P4 J
}
/ x6 y# _ }1 J3 f: O}
9 n1 R/ G0 a1 F: k
4 p% s# l- T% P; Q, ^; Bvoid read_MSG_buffer(int *baseaddr)
. G* L+ T) ?# _: I3 o$ P1 u{
' l6 T z$ s2 O5 U7 }% E" f pRX_MSG_PROTOCOL pshreRAM = NULL;
3 V/ A) B$ E/ H, \; W) J$ L, D+ `" A/ d! G: Z4 v
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' B: g/ a9 h) X$ {0 I: ]5 p8 ` m# E6 S! [2 s4 u
if(pshreRAM->packet_cout != count_copy)2 U+ Y' J L7 U K6 V' S
{
5 o# e2 ~) p, ~ printf("a is %d\n", pshreRAM->a);
4 j( A2 R- I4 u4 b- J( I printf("b is %d\n", pshreRAM->b);
3 m* B6 ^7 H: i* ` printf("count is %d\n", pshreRAM->packet_cout);3 k( G5 T. @, D, ?- C9 d. j# B
count_copy = pshreRAM->packet_cout;
R0 a, t, ]2 T }+ c3 k- i# R p' o7 g& K
else" w7 M! c6 s! g& ?7 W( K! V3 O
{$ B2 P2 k8 ~1 ~0 O+ r! d
printf("No effective message!\n"); E9 k1 M4 X% K$ T
}
0 |( I m& z/ N, H& o- n) b" ]}0 l6 q3 j; f. ~
4 {+ [ V' @/ c# ]# T没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???7 G/ ?6 @ {4 I" W0 A- {! L
% G3 u9 `. f0 n/ H$ `5 R8 U
. H$ Y0 k8 p' P! I0 f) {, E C4 X, ?! c$ p, X) H C
9 L1 \5 G& b- b" {7 A( s- D6 N
|
|