4 D& t v+ P1 L- {7 l( q/ MOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) N c$ I8 M/ V9 D5 q9 U" j8 X( R
#include <unistd.h># p' s3 [5 W. X, e
#include <sys/mman.h>* J' b V$ i( j" k b, ^% |( S. C
#include <sys/types.h>6 F9 A5 N ]' ]( c
#include <fcntl.h> . z- T# C1 ^) H* p3 @. n$ i2 l! c" y4 B9 l( G: S' Y
#define SHAER_RAM_BASE_ADDR (0x80000000) 9 K+ g, Z, B3 e / T& @& [- W- J, E$ i( E9 c) y% vtypedef struct 2 `0 R& y3 n$ c7 r/ M4 R6 J1 ~{ 9 ?9 }2 Q0 c/ ], Q unsigned int a;& }' W2 N7 G' Q) t
unsigned int b; : _3 O2 G5 a/ O, o6 A; q unsigned int packet_cout; ) r+ J4 t3 S4 c9 |0 q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; & W: \% o. G4 {/ z6 J& k' i- O9 B0 a8 W; P5 O* B6 P b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);/ o+ N& B2 v; E) f* _5 ?4 O: ~! v( l
unsigned int count_copy = 0;4 w, T/ W$ u5 h. J' H
6 q0 S ]1 ~$ ^9 w$ I1 D7 V
i6 `8 K, E- u! b8 ?! L, D" ]
int main() ; N, e1 j# h- J6 i{, Y% d [# D o: U
pRX_MSG_PROTOCOL pshreRAM = NULL; Y2 w0 }* P: K pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; * U, Q1 I( `$ _' K6 Y 4 W j7 j5 k, V' H6 y- p while(1)' i: z1 H9 G* I6 c
{3 x+ g# t: j9 T) B. @
read_MSG_buffer(pshreRAM);. V6 Q! k2 z$ h4 h
} 3 T5 T) N; R$ k# a- Q. @) F# e3 w
} $ S1 Y7 }$ d5 |, F; ~' L# T* ]3 [6 T5 x5 w& ~) |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 f/ f! ^; r3 V# n6 X1 l6 z
{ 4 V2 Q! v# g0 [( O8 i RX_MSG_PROTOCOL buf;# A4 `" P: U" h5 a
6 B- f7 K+ c. U8 z/ P0 P buf.a = pshreRAM->a;# v1 P! x2 O( }
buf.b = pshreRAM->b;, J# `# X' M+ [8 L) \* u8 c
buf.packet_cout = pshreRAM->packet_cout;& {7 l1 K5 J) U1 r
( @& n9 L& c4 |! o, \4 o) S if(buf.packet_cout != count_copy)) j) _9 |1 Q0 k! H) O1 `
{1 B9 s$ |6 ^ C8 t4 H" ~) ^. |
printf("a is %d\n", buf.a);, V# N7 M ~( q5 Z6 @* P" C' Q
printf("b is %d\n", buf.b);& `: U, S* i7 p1 r" M2 X; s
printf("count is %d\n", buf.packet_cout); ) m( z, M# a7 E2 Y count_copy = buf.packet_cout;/ ^% h8 e$ u+ k! I1 y, X
} ' y' L& G$ u7 r else 8 Y! k# Z3 }: n {# L- g `7 [6 E" M' A# Y5 X6 ?, @, d3 e
printf("No effective message!"); 3 i8 ^+ h( b0 J, Y }, n3 t* N7 H/ B% H$ R
}! l; `9 j0 O% X2 h& Z
2 P2 {9 e/ ]1 g. w5 ^
% j: `" E; G3 O9 J
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 j: `+ { o: _. E, i
使用下面代码,对内存使用了mmap函数后: + Y% X, u/ ]/ l7 ^/ B#include <stdio.h>5 q _* z, @9 {) A2 P# k
#include <unistd.h> 9 h0 R4 S6 O4 D' @1 C9 c4 K: m#include <sys/mman.h>- t6 V% F i# _
#include <sys/types.h> 2 }: j1 L- W: F+ J7 P! ?7 x#include <fcntl.h> H, ~3 A+ b: S7 y8 e, _7 s/ t0 X+ B+ j. Q8 p% O
#define SHAER_RAM_BASE_ADDR (0x80000000) # g& i3 L$ i; A#define SHAER_RAM_SIZE (0x20000) 6 {! @( w; Y% f3 [2 n5 k
+ F2 P) v9 d3 f) c4 g _0 \) Jtypedef struct ; g( o* ?6 l4 d' ]$ _, J1 A& Z! W( W{, p0 G6 J5 b; Z3 T
unsigned int a; 6 H+ M( o" W* ~- z, p unsigned int b; . O- A% O8 u* g# F' l# L8 M$ A# P unsigned int packet_cout; 0 h3 ~( h, F! r# R, a. \' \1 q' U- ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; 1 `3 m+ o' Z& z6 S, w+ I; _9 K4 M ; s6 `3 r: z6 O, D6 d. C% Y1 w3 Wvoid read_MSG_buffer(int *baseaddr); # t6 f7 @) f, hunsigned int count_copy = 0;# ]6 _: f4 D+ Q) }4 o
; [) e( N* r1 w5 b
int main() $ A' Q6 I3 b/ W7 P$ x# a9 o{ / L! Y6 b0 `, U' |% G int fd; + F2 y% y K# I9 Z" j+ G) n3 ` int *mem = NULL;/ V# S7 ?% Z0 {; ]
% p: Z2 d: v* g- o0 `" D
if((fd = open("/dev/mem", O_RDWR)) <0)+ e8 h4 I- w- ?$ N6 [
{ 5 z8 W' E9 j* D# D/ n2 ? perror("open error"); ( i2 s0 t: S, o return -1;1 u/ X( X1 s7 s3 T
}2 N/ N6 `4 K, z! Z$ F( a
, n( e9 h6 E: S8 h0 O: J; R mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 X& Q9 c. C3 m. q* s. Z4 f
( ?, w' R' V8 j) J while(1) 7 ]. O, G7 O, A) _2 r% o7 l# N2 Q { " i, Z! i1 \/ J5 Q1 F read_MSG_buffer(mem); & h# @; X& s% L) k2 N- g0 P } ) e/ B' E3 y# A0 q; [* @* y" L}! c! c8 Q# `7 V5 J" W+ Q1 t$ N
+ x5 v6 P8 }) ]( G9 v9 h
void read_MSG_buffer(int *baseaddr) ' n, t5 R) q9 D G ~- {7 a{" a! D8 n/ V5 r
pRX_MSG_PROTOCOL pshreRAM = NULL; : j# d. ~" z! G/ P$ M8 k * H8 y( m4 d9 l6 u, U pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ k d! O$ Q; T9 D* u; T
7 M: L |3 M( _) h" R/ w if(pshreRAM->packet_cout != count_copy)2 z& V& b: G$ z# m5 [& V
{ 7 _3 ]! G) Z) g, x& r printf("a is %d\n", pshreRAM->a);0 S5 r8 v9 s7 j, x, V
printf("b is %d\n", pshreRAM->b); $ E3 q4 }% p* t6 H1 f printf("count is %d\n", pshreRAM->packet_cout);; G' b/ U: q6 g0 P* B
count_copy = pshreRAM->packet_cout;) _" {- k' d1 b5 V* W4 b: }
} 3 Z& J8 S; q6 S& F1 y else 7 I- P* K. t) i3 Y {! `! k i3 a+ S/ T; N. u, f& p
printf("No effective message!\n"); * k! g5 M' @: b9 N } 6 [" c, q( R& K j5 B} 1 q' _1 j* u- U1 x1 E1 F' |! w+ j- P p
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? 2 T2 y1 h2 a9 T' i2 a 1 A5 r/ y& @* n% T3 w5 I* T0 U$ `6 O& G- ?+ s& g0 N; \' @/ s! Q
8 w8 ?2 }% g, J/ k
. O/ i3 w! p8 S* I* {! x( @