5 e" `6 S* q- Q3 C& _3 c. ~typedef struct5 D! i+ V# a1 t. R$ T
{* I) r+ P7 Q- F
unsigned int a; ; d; G. r; G5 o unsigned int b;* H! k- l# n5 B; H6 Q
unsigned int packet_cout;* _9 A+ F8 [! m% W8 U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: ~* x" v1 {0 D2 c' k. p
$ Q6 R$ F8 M F6 U3 E8 j( pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& c" H! R: X2 x, M% j' g3 S
unsigned int count_copy = 0;. z. A5 V% J S1 F( {" e+ ]+ {
6 S. V7 V. q5 u# @0 Z/ U) {, c3 G u1 p6 r7 n* J$ M
int main()' I0 j# J$ \7 l
{) ]5 u/ P7 E) l
pRX_MSG_PROTOCOL pshreRAM = NULL; 5 X( ?& w0 J7 f5 |5 |. m/ j) m pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) {7 p9 ?8 C4 M: y0 x
! s' |! W$ L" {7 k o4 W! B; T2 ~: I
while(1)" d( p8 V0 ]' Z& J( i
{ 9 L( A+ A, E+ s! D; F# L0 | read_MSG_buffer(pshreRAM); 4 d% H2 d+ |9 ?& T w! h* u2 Z } 8 b4 P; T8 |& N. u
}$ j/ N" J+ e- u
+ j- Y0 v i5 L, I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM) ' |2 Z' X/ M8 k4 {7 k{: L3 U8 p$ V2 p2 I0 F
RX_MSG_PROTOCOL buf; : [" f! T; `( x% V& p 0 d* T, R0 f$ ?9 {7 q
buf.a = pshreRAM->a;0 e( ?* e: w5 Z9 G% }" [& D
buf.b = pshreRAM->b;$ d7 C3 D; w# V# a- v
buf.packet_cout = pshreRAM->packet_cout; . n [7 ^0 H+ j ! [2 D& N) U6 G# p* M# ] if(buf.packet_cout != count_copy) {# a. d0 a2 U3 O! a
{ - h" w4 i- J m- e2 j8 F9 A& n+ q printf("a is %d\n", buf.a); & Z8 u9 k2 l C' c# X1 v' _ printf("b is %d\n", buf.b);8 d6 R8 J6 z3 l ^; E
printf("count is %d\n", buf.packet_cout); ( }9 K- c" y' g" A count_copy = buf.packet_cout; # r6 j8 R* x# r% u7 U6 E( {+ B } ( D" P( x. @$ X: q else ' S. p D& V7 ~! H3 B {# s* ?( d( p# `2 H; [5 A9 ?
printf("No effective message!"); H/ E- b& Y5 T: `- n
}# V. b- b o( U
} , @. \/ u ^2 @ # R- T' h, A! T* W( k n % `3 `, d- D4 F- o$ N但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: J. s4 z* ~# B9 H. d" g- O% H3 Q U: h* t: v
使用下面代码,对内存使用了mmap函数后: / P6 [" r+ l+ k' G) @#include <stdio.h> 4 e+ s* u) D# ^( c! i+ O#include <unistd.h>8 ^: L2 [/ J# R' ?
#include <sys/mman.h>" E% e4 Q# s& I) X7 Z
#include <sys/types.h> : _2 R5 m5 Q' r6 L L#include <fcntl.h> 0 Y5 t+ g$ F! R7 o0 Q / w9 `. _" q) J. [#define SHAER_RAM_BASE_ADDR (0x80000000)$ R* u& a+ b9 n7 \1 U# R; C9 M
#define SHAER_RAM_SIZE (0x20000) * j9 _0 Y' H7 H; v' w
+ C! T" ]3 t! R5 A# ]) U8 @
typedef struct ; |) G. u4 x o) h3 x$ ^ _7 {{ 7 ^& ~5 ~4 @6 j/ _8 m l$ B! y unsigned int a;$ m8 n e5 W: [( f! m U
unsigned int b;% N: d; a( B! \* ~. Y- x' y; V% ^
unsigned int packet_cout; 3 Q, U% g, T4 h- B }4 s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; ( U3 B1 ?' @# k& @ . ]& X$ h1 o5 ?2 A5 @" Svoid read_MSG_buffer(int *baseaddr);+ u* O% K @$ d) S9 Z
unsigned int count_copy = 0; : u/ S! @. }: t/ r D3 ]" H/ w" C9 v: V: O G
int main() ) m) i) M) b' S% J, E{$ V2 U' M2 E W% @
int fd;9 B6 f+ e) i& g
int *mem = NULL;( X# f; j# t) U. z ~( u1 Y
; h4 t' ^/ h: q4 q: H; y if((fd = open("/dev/mem", O_RDWR)) <0) ) k) ~8 k% @) R6 n# }( p { : O, \. X# L+ A! f& ^ perror("open error");0 P! I1 E4 J" M3 _, e5 D" X
return -1; E# e! I2 c: i. t4 _ } , a( {' s" r7 x) f) A( F , f& D* X7 D9 L6 c( N1 V
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ L$ {+ |) W& v) X+ h3 W1 _# ^
% B5 P8 v9 E6 K. i% ]# N
while(1) 5 G/ T4 W8 t( `7 x! I) O9 p { 5 |4 e: d: w% Y9 ] read_MSG_buffer(mem); 1 N1 i4 u8 R& \, j# z& C } ^: y3 x* Q: D
}- V* x, O3 A* h. T* s' q" D
# K- I, P3 ~+ _& V$ h+ I: d( `void read_MSG_buffer(int *baseaddr)8 Q! c5 O) w) ?- F( x
{- R/ F2 P1 `+ H/ O9 Q# G
pRX_MSG_PROTOCOL pshreRAM = NULL;7 S& u. ~( t7 V7 q
3 |1 V% ]7 x N, ^, O M
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ C) R; p% C3 l0 h T% [
7 U( ]; B; q. Q) r) ~ if(pshreRAM->packet_cout != count_copy) 1 `9 W2 p* t4 D' ^. N {8 ?- a Z: _& r/ `- g) @* y: M$ t6 z$ _
printf("a is %d\n", pshreRAM->a);8 R" ]; m- k- g3 H
printf("b is %d\n", pshreRAM->b);$ \+ K2 w G0 e2 k/ A
printf("count is %d\n", pshreRAM->packet_cout); 0 J% K- _# k6 y1 Q count_copy = pshreRAM->packet_cout;6 a b9 u* h8 ^0 V% W3 ]7 ~! c& I! ~& h
}4 {% _9 @/ h/ _) Y0 R
else / e% H( J' \! A* L, D" ^* w {6 Q% y5 E9 v8 _4 g( Z
printf("No effective message!\n"); & S+ x, g% G( C: z4 ? } ) R+ p0 X. r" H}/ [; b# G! ?6 T
" _8 U- U. k+ v: m4 N$ s+ z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? 7 a9 O7 P) s h% @( t * U) F/ R& ]8 {- s9 R 0 W( C) Q; Y1 A4 [$ } 6 `9 e8 U8 U- k3 P+ B7 h " j) n& l# C2 l# n4 }1 Y