: l( q9 O0 \5 }/ o2 x4 M#define SHAER_RAM_BASE_ADDR (0x80000000) ! P; F K' N; g, U
' y4 p+ u& E9 \7 R* N( [ ptypedef struct' c3 X- ]1 Q8 D2 W. x
{ + x7 \- h: c' l6 q unsigned int a; ( u* c$ \# m0 B p/ p: W; _" ]4 \% p unsigned int b;& r" I+ z( G1 u, E
unsigned int packet_cout; l" u7 _1 L' z! q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 r: L7 j, b# X# e6 V3 j# S
8 B9 J: S2 I Fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 X A" n& B/ p; C' i! p
unsigned int count_copy = 0;0 a" h% x+ k ?% g
X- W o3 j2 z) l+ d1 \4 X& |
, Z7 `3 H% i' O: S0 a% P% ]int main() $ k( j6 K# q! E2 Y) @{ - k; `, f0 M$ L0 J' [( L4 w' c5 r pRX_MSG_PROTOCOL pshreRAM = NULL; 5 ]- l1 s2 t* L. N3 X pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; ( r( F$ h' W7 W; g* g# a * T+ M( p0 G: c% C4 I1 ?: g while(1)2 P7 x! O, t- z6 E0 B5 d, m
{ ! ]* Y! Q+ e8 N read_MSG_buffer(pshreRAM); $ k" c: s2 G) I9 J" c } 0 B3 W2 A0 J. y7 o$ }) L+ B$ T} 6 }% p: o3 S a X5 G R8 r; _ / B; U8 B% o8 l& R- h2 wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* R! X1 y# m& L8 e! h h
{2 N9 W$ K: H, Y/ z
RX_MSG_PROTOCOL buf; / o8 v- ]- e+ F) i2 L! A# h * f c2 j3 T1 k7 `, g buf.a = pshreRAM->a; \- Z3 h$ g- d8 ~+ U1 O, ~3 o9 R
buf.b = pshreRAM->b;0 B0 K. r- B. k5 I& L9 h- ^% q
buf.packet_cout = pshreRAM->packet_cout; ( ]/ Z: X. _ Y, F% ] 4 `7 U8 J" G: o7 K) S6 c9 m if(buf.packet_cout != count_copy) 2 `; u+ [# I2 R5 `- Z { 8 M/ L4 H6 X' N* D5 Q printf("a is %d\n", buf.a); 3 x/ f3 Z( D* k I8 J printf("b is %d\n", buf.b); : {5 l. Q$ ]' u$ [( ^. p: f- Z printf("count is %d\n", buf.packet_cout);: v$ I$ {% v c/ {! ~9 V! h4 J0 V
count_copy = buf.packet_cout; 1 `% j2 n) i) z# V) N! e8 z } " _& t1 [9 i/ l" O9 }# p else; u) J: d L5 _- s" I$ y) g% o
{. [1 k7 j, r: O6 D1 i t
printf("No effective message!");* W4 I* n7 }+ m3 J x
} % V- L g5 F# R8 D, t9 S}% A1 j! |" u+ ~1 e# n3 e* S1 Z
; J/ |) V- _: H9 D9 J" \( Z6 s' R$ ~' y- c& E! ?1 y; I
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。 5 o1 D. Q% S9 s" C+ \) G, }使用下面代码,对内存使用了mmap函数后: , E3 H, [( q( I& I! H) ?#include <stdio.h>- ]$ n6 c7 C" o8 u
#include <unistd.h> \8 h7 x% s- v& z#include <sys/mman.h>" I( f+ t% P" q6 c3 h$ F
#include <sys/types.h>/ m; d7 B+ B" m5 E) i' N" Z
#include <fcntl.h> 2 D5 c1 }" H) T5 ~' t7 X) n( {5 w' m' Q+ C5 k5 O A3 A
#define SHAER_RAM_BASE_ADDR (0x80000000)# J$ ?5 V1 _1 g
#define SHAER_RAM_SIZE (0x20000) & C" ]$ Y; G; `! u1 v: p+ H 6 j1 X1 B% E/ \' S7 E7 Gtypedef struct - s5 R2 g: B7 G6 n* ]1 G& B& T" T# T{ - K+ j+ M" N5 O" e4 E) ~ unsigned int a;4 M9 n: o$ a) d9 F9 V6 [( N" H
unsigned int b; ) Z1 B4 \1 m7 L4 P6 c7 b4 @ unsigned int packet_cout;# Z6 w; I8 ]" X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; 0 ~4 P/ c8 l* c/ }. w9 I8 h1 O b8 h9 w8 X/ o" y
void read_MSG_buffer(int *baseaddr);- }# T, h, \& x# [
unsigned int count_copy = 0; , P* b# ^9 w; O: Q; k6 b8 h 9 y/ D$ s7 L6 a; w2 z: \int main()# i0 H3 \! T i5 @
{ - v* B7 D# G7 g- d9 i, h1 w# t( z int fd; & I. K$ S1 u$ x0 w" w) j) ` int *mem = NULL; % Z3 h3 ^) H. ?: L+ L& O5 m! @7 L+ a: L) F' j
if((fd = open("/dev/mem", O_RDWR)) <0)# m& S; ]( _: H4 d0 v; [
{- |5 \8 `, s- O2 m2 ]
perror("open error");0 x A3 L! z. {4 Y4 Y
return -1; 0 ]7 K% m9 ~( C) v5 ~8 R }9 v$ h4 K% @0 ^
$ G; ^( B+ t! @" I
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 1 f6 J( Y1 ~. \6 o$ k0 m. R+ C $ H$ k X4 A4 d( F while(1) * m4 Z4 y6 R7 }7 M) D { / F; z, }, a8 \- ]: ~ read_MSG_buffer(mem); 5 {5 M- t" Z& v4 M9 W } 5 u7 z* X# ?. q+ Y' g5 H3 V} 8 A- K2 @3 [! `/ g/ Y" U) C' E+ _
void read_MSG_buffer(int *baseaddr) 6 J+ K4 c7 [8 y$ y{ / c6 |& K1 z5 r- w2 N% k pRX_MSG_PROTOCOL pshreRAM = NULL; + | f* G0 b/ [8 B: a: D : ~1 N$ L9 [7 c" J6 H7 B4 X pshreRAM = (pRX_MSG_PROTOCOL)baseaddr; ! o) A- I. Y( B; Y : Y. e, w0 c+ d& a7 L3 u7 _4 e if(pshreRAM->packet_cout != count_copy)6 x- K+ s1 n2 L7 h
{7 E o, a, i; K
printf("a is %d\n", pshreRAM->a); # C, k* Q7 ]! Q, I6 |% E printf("b is %d\n", pshreRAM->b); a$ G9 O l' p& K* P0 R9 M printf("count is %d\n", pshreRAM->packet_cout);/ m; B$ i' r9 k% b' n( P! @ f- f
count_copy = pshreRAM->packet_cout;: L9 F0 Q F$ v/ D
}1 g+ p) h, P! n5 s! {% T$ ^0 u9 @
else - V( H1 |: t. a! X. H- M' w {- y6 R6 m, B! [1 B" |# M4 W
printf("No effective message!\n"); $ Z+ R/ b- F/ U+ H/ N } & G5 H* k- N' f0 d" ]# P6 e1 h}) |8 U2 g' B5 F$ Y9 `! R
; _7 P+ B# M5 R0 Y# d/ ~
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. U8 ~; Z6 C5 ^5 U: J( x