5 P$ e9 Z9 e% j: T- l j/ stypedef struct A5 ^8 F1 j1 T" Y( c
{ . B# |. U) n1 _% t9 g unsigned int a;5 c! X3 h2 V2 o( d5 N- F2 |" S
unsigned int b;$ c# g- w! ]! [% A: ^
unsigned int packet_cout;) {6 r9 K8 ~5 B3 E( V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; C( w' `1 b5 Z. l+ q, F , l/ T7 `- Q; O) X$ Mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) L* F" f/ s5 _" x8 N7 j/ r
unsigned int count_copy = 0;' k+ H- b; R( d; i6 H
0 P' p( L" v' S! ~5 x# O1 ~& A y7 O$ D* n6 Q
int main() 0 }7 t8 q: Y; F4 n& n5 X: h9 x{' s6 I" x8 `7 N+ B
pRX_MSG_PROTOCOL pshreRAM = NULL; Q; }1 \0 G( [2 U9 f pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; ) F3 [. A3 q0 `2 W k1 h 4 i# q1 ?" `' p' c: x& P' X3 U) `- S while(1)& |6 }4 e6 }! t _4 l4 j
{ ' b7 s/ v$ ]7 G' g% {5 }+ t read_MSG_buffer(pshreRAM);6 g5 v& \" Z5 \' v
} 2 B( D/ {& |2 |& |4 M
}4 u3 L5 W" I, v
5 S+ D1 U) J) M8 b# @) e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM) : x& ?4 k8 a- @9 _( S! [& s{ & R g3 {. D0 f l, }5 A# c RX_MSG_PROTOCOL buf;! ?1 d) `0 Y) o
+ k" O" c W# _: [4 T9 B buf.a = pshreRAM->a;; n+ O, s+ C h! o, r
buf.b = pshreRAM->b; ) B# {* R S, j5 T buf.packet_cout = pshreRAM->packet_cout;/ T9 y q! @, i) S- \5 `5 S: J) h
' ^+ R6 N: ?8 p! }3 B3 a) Z& `7 k if(buf.packet_cout != count_copy) 9 p" R8 A2 B/ C7 E- k- P7 J: Y {; Y3 f& e: V/ ]/ i8 [ v& h
printf("a is %d\n", buf.a);9 j, \0 Y$ A# W% P2 w2 I7 X; `* e
printf("b is %d\n", buf.b); % x" O8 N9 C5 H Y1 ] printf("count is %d\n", buf.packet_cout); 3 `/ A9 E* J3 R count_copy = buf.packet_cout;9 u1 y6 o" v% a n" L+ f
} 7 t) ~* y3 A. I3 { else " O9 R. m9 J5 b6 R" {4 r" K {9 h2 u& v) A9 q+ M+ I1 b
printf("No effective message!"); & q7 D* ^3 R+ z. W6 ^ } 1 e3 b! l1 e" c. I; d2 R} 8 C f& q9 ^/ S- a6 u5 ~5 b/ j1 \; O
6 {! f) L) Q- O4 n& t0 h4 {0 Z0 v
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 |- r( P$ O* \4 f' O) J, G8 r! E
使用下面代码,对内存使用了mmap函数后: 0 P$ n8 N4 B) @3 x#include <stdio.h> $ ?; R7 R$ r& e4 W8 F7 ~#include <unistd.h>" M0 @% }" W' `
#include <sys/mman.h> / e, \1 v" D' W6 Z0 z; l#include <sys/types.h>) U) y% S! ~: [8 b! `0 j) a8 D
#include <fcntl.h> ' O* Y6 r( ?: P3 Q+ W 8 F3 @8 Y: [1 A+ j& m+ L1 f. f#define SHAER_RAM_BASE_ADDR (0x80000000)& \9 G8 \0 w7 q8 q0 u; `1 J/ F9 ?
#define SHAER_RAM_SIZE (0x20000) $ s* h% j$ C H$ C* B# k6 F/ ~, S ' Q; ^: S" _0 ctypedef struct ( D( Y i; `% e" d7 |( [" v{8 K- ?2 h( U. @0 J( [
unsigned int a; 8 `# d. q. `& U w: O. ?" z" t3 l( S unsigned int b; : g9 }$ u [" l/ E/ n; F+ h5 X unsigned int packet_cout;8 N# k4 U8 K: A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- d# C$ L0 S- ?& E( e
1 g% U' \, ] {1 Svoid read_MSG_buffer(int *baseaddr); 1 W3 W2 n/ D! ~ }/ Qunsigned int count_copy = 0;+ G- t1 f2 e7 v4 i; F r( P; M
2 |) K- E' h2 Q
int main() ) K4 M O* O% y* n* _{0 i# p; W: ^' z2 I3 L1 c. m3 ~
int fd;2 Y) _+ v2 X5 L/ z: t8 r
int *mem = NULL; . N! ?; |; h7 _& t( z2 E& M, k j5 w
if((fd = open("/dev/mem", O_RDWR)) <0), A/ r9 f! z/ q$ c
{ / u' V( q! Y+ R$ e. J% f perror("open error");% g. ~7 Z5 e! _0 [
return -1;0 L2 k8 ?8 g- f7 l
}9 }( X- }* l* F$ b L8 L" m! O
8 ^ v2 {8 Z2 B7 Q1 s, ^" `
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 0 I* O8 K; E1 `) o. Q3 j i- _0 _+ I8 }: [, g' ^- o while(1) 3 j# t( w; B2 O' Q+ B; p { 7 d9 R/ Z/ I6 L, a# q* l read_MSG_buffer(mem); ) }7 X0 B4 ^# [/ H } # L2 s# p1 Y* Y: v* l1 J* N" E1 C
} $ e5 w0 v' ?3 ?, h- s, o) A- ?; C" W6 E# G0 t1 [/ d C& O C
void read_MSG_buffer(int *baseaddr)$ w/ C$ }7 z, _7 D, J4 t) t
{- v9 o1 u. G2 @, o( I5 B4 W5 A2 X: U
pRX_MSG_PROTOCOL pshreRAM = NULL;" r! j2 C( k1 T, B2 D) c C
# k. B7 O8 Y1 Z' ]. X- O pshreRAM = (pRX_MSG_PROTOCOL)baseaddr; ?7 K1 Z0 l+ b: V; m; ]1 `$ l. Z0 n$ t. D0 a/ v5 p
if(pshreRAM->packet_cout != count_copy)# H7 M$ _' y9 t* C+ s
{ / _; Z8 W/ r* g9 }" D+ B$ a printf("a is %d\n", pshreRAM->a); 8 z5 y+ ]. X/ M8 ^$ o& R& G$ A printf("b is %d\n", pshreRAM->b); j# r6 U! n# v) q9 j! K0 u @
printf("count is %d\n", pshreRAM->packet_cout); - B. X# v6 b- m R count_copy = pshreRAM->packet_cout;0 p% s4 e, Y$ _' ?, Y1 I& R
} " i4 k, v4 u4 V* o$ l0 \5 z1 \" O( q else ; O) C& p( G5 y3 g' ~/ o {* Y) K* I5 Q1 [' N7 H0 i
printf("No effective message!\n"); ) g+ [% @3 x- G( j, A } {8 i! V: M9 U/ K
}) F3 Q# a( C& K1 W
5 K/ U) q$ @! q7 n没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? $ m* \# U: t6 A8 B' Z ' `4 d' e; w% D2 }+ l& U% s6 D / z5 D$ w- D7 _; F; C% n. z* R p [
5 Z/ `) y9 B" y5 L" q4 t