+ _% N! _" A0 f% S5 s C) btypedef struct # A6 H3 Z0 B L8 p{) {! [% v; F A4 u2 A- l
unsigned int a; : C8 L' ]5 Z y4 A' k6 \9 q unsigned int b;/ j9 r; e3 o6 K4 {! R
unsigned int packet_cout; - w0 v6 C( j# Y7 i2 y1 D6 f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 @( E% o8 d/ W% [, l2 J/ V. ~1 @
, n. z) F* W& @, e, ]0 svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 P/ c" p5 M1 o# x7 l, f9 m
unsigned int count_copy = 0;: s1 s# T! R+ h8 m
F8 N5 J* K) h r+ m+ [/ i- ~3 X3 w8 dint main()+ C. W* i0 w, {) ?
{ 1 q" u M+ b! M+ m: k7 t pRX_MSG_PROTOCOL pshreRAM = NULL;3 c) Y6 o1 j$ ~- U% d
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; # @2 j" z- J! `& r* n3 X# Y. C p$ Q
while(1)" |4 c/ _1 o* Q) v0 M. @3 J
{ + ~: ~5 E$ u) B read_MSG_buffer(pshreRAM); 0 t6 V$ V3 _3 G. b! e; _1 S: J, G; v } + d: X8 ~) X: \" \}, g/ {7 A) [- G, p. z$ d
/ C% W! u3 I! k, ~4 ]void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' a+ G: n6 Z! v1 v- D
{$ n0 u- P( P- }
RX_MSG_PROTOCOL buf;5 B' Q; E, I8 R' i6 V6 H/ E0 J( p
2 D# J1 h) ^2 v& L9 H! m buf.a = pshreRAM->a; # J2 |+ L I# H6 V7 [6 I. U buf.b = pshreRAM->b;4 ~' i+ Z$ k7 U# F' T8 f
buf.packet_cout = pshreRAM->packet_cout;( f9 t+ J3 _ Y2 `% L6 u& C
$ ]+ G% ]# p5 Z* A9 e
if(buf.packet_cout != count_copy)0 l3 \6 |, ^6 ]4 \, ?3 } k4 `6 b; B3 g
{ & A! d* s2 P5 I0 H printf("a is %d\n", buf.a); 2 Z' N3 c' D/ i4 w8 H printf("b is %d\n", buf.b); - X1 W, G: m8 r6 x3 T printf("count is %d\n", buf.packet_cout);: m2 U& [/ G; u: d) g# H
count_copy = buf.packet_cout; 3 L0 f6 z% _6 f, q: G! Y" q }( T" n! Q: T |5 q9 g
else , U0 L; y: _1 V$ y' t, r8 w& k. B9 R { F4 g2 Q `+ p- | printf("No effective message!"); 3 p: D K, g( C; m& b } ) O4 p" Q+ `) I1 J, i# Y8 i}+ i, N3 c) ^4 V: M( Z. S6 }6 \
( A: Y; K2 Z5 q
0 a5 P: P1 E0 i& W1 D2 N但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) G* m8 m/ ~. d+ N: t: E. p, Y
使用下面代码,对内存使用了mmap函数后:# p! j. H! I; E% l6 K
#include <stdio.h>( o4 x# _# z# j3 G) K0 `' L' g
#include <unistd.h>8 Q9 n8 f+ J+ W4 x. S; j% Z2 z
#include <sys/mman.h> ( B- Q ^$ @7 N' R#include <sys/types.h>9 Q, S/ y! k! P& C1 h
#include <fcntl.h>0 f% L. ?* Y* K/ L8 i, i
# Y) {0 {; X3 k3 m
#define SHAER_RAM_BASE_ADDR (0x80000000)8 x" R& ^! k" a9 ]1 ^
#define SHAER_RAM_SIZE (0x20000) + g8 H' q' H7 T9 j 2 ]5 @* W8 U8 ^0 t+ Gtypedef struct. R; L/ I, l( O* i3 T( w0 w8 i% t7 R
{ ) t- G7 N: E' ~% ^0 U, s, O unsigned int a;/ D h& \4 K# P7 t
unsigned int b;# v- Y3 K& ~+ J& J$ s9 T
unsigned int packet_cout;+ O% `6 ?+ c* v* \, x: i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; $ r( n; d: e& L4 [/ t' z5 W$ b. W& Z- [: }
void read_MSG_buffer(int *baseaddr);# I: l+ t9 }6 u' L7 R0 h i
unsigned int count_copy = 0; " m$ M+ ^' A. G0 V' ]1 J; G5 \, D) e# v, d
int main() 9 X: X2 d: H- D. q. N8 j, M{7 J6 w. }" x; y3 K( H
int fd; ; s& c8 B, p6 K; u3 z2 Y int *mem = NULL; ( k9 a9 D, x p' Q$ g$ T0 ^& Z8 z5 i) b( g% u
if((fd = open("/dev/mem", O_RDWR)) <0)4 y0 P" F5 w1 {+ ]+ E
{- q8 H$ ~. A7 Y# u6 B ]0 g
perror("open error");# k' G( T$ A2 Y8 r2 C
return -1;4 d$ i8 w) k9 R$ X* R) t
}& Z, t2 ]* x/ H- m4 b- {- }1 q: t
# _+ X( J' A. W7 Y' v5 e. a) ^2 ^
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 ^( J0 m. j' `8 \/ k# H. b
# D! d/ I! v3 T; I9 G% e7 @* o
while(1)/ M/ G: x% l* h1 u' ^7 _% {8 V
{ ( \3 X# {9 Y7 r& u read_MSG_buffer(mem);% P, n& Q$ y3 R* E; U* a
} / Y# J3 h& v5 S% a, q
} # ^5 [ v, {2 W4 F& r* \; ^6 E/ p7 f% f5 d; Y W( \5 U$ n. d
void read_MSG_buffer(int *baseaddr) $ {6 \1 N9 Z7 ^" Q: y{ : f% V# g3 ]9 f F( @1 p( A5 c0 }# m pRX_MSG_PROTOCOL pshreRAM = NULL; ! G- o3 c( @6 O/ j* E: G/ l" [! `6 y0 O% P+ c, @
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* K8 C6 \* o8 q2 ]# ]7 E
0 C4 i' C' i; I" C, r# z if(pshreRAM->packet_cout != count_copy) , P+ I9 i4 }3 M {( B4 _( G' R& a- K
printf("a is %d\n", pshreRAM->a); : G* H& j# K" B9 J, r5 h+ @5 N# i printf("b is %d\n", pshreRAM->b); ! A" X7 P3 F3 n2 H' t4 K printf("count is %d\n", pshreRAM->packet_cout);! u+ @3 o0 _1 ~$ s( }/ q- E8 S7 L
count_copy = pshreRAM->packet_cout;3 |/ Z- P r6 N% c; T1 T' k
}% f/ F0 L& P" h, |# M( X
else" ~. U. a6 U8 y0 v' P% p6 i2 B
{ D, H; G0 C$ \: B( i+ F8 x
printf("No effective message!\n");4 }& R0 D; T4 |- ?
}9 |3 _$ n. K/ i: Y) W3 _
}9 {1 |& D6 D3 R% I
. L' y5 z; Z. d没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! J9 T5 }: P; ^
- d) u. f+ F' G% {3 h7 `8 [8 }, B
- c6 T' c8 \) |4 B' @, U! z" E4 ^& _5 k5 Z: I) q6 |6 f
9 {: R+ v. M/ @) B" D' W0 o