E" \1 c1 T# Wint main() % g' _ o" k e. S{: Z% v. z" E) \1 f. K
pRX_MSG_PROTOCOL pshreRAM = NULL;, C) ?' h; X2 L8 i: Z! h
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* E K: ]! k& f' W1 \
2 i7 q3 h N8 F: X) d" R# U; N- M while(1). w; n; x2 i, @3 k+ c2 U& |
{ # P4 D: o% C3 ^* X( v) Z; h" m' u read_MSG_buffer(pshreRAM); 1 M2 j' P- y: W6 a } 4 ~$ t* g: F2 S0 Z9 Q T' j( h
}5 X+ {4 ?' ^/ \ G
9 C% L) @2 d" | r8 xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 m/ e6 X D Y& _ E! g0 P* J
{. M* O A S# K2 U
RX_MSG_PROTOCOL buf; - u6 `- K" W" E9 X6 E / |' T" T" q6 {$ O* @8 @ buf.a = pshreRAM->a; 9 H5 p( x m/ J+ r7 M buf.b = pshreRAM->b;# G/ ]/ S1 z. Y2 b6 U
buf.packet_cout = pshreRAM->packet_cout; 7 K% p# q: }! M4 | 5 {) N" E" M! }" d
if(buf.packet_cout != count_copy) 0 b; O0 y7 S! _6 S' j" F { : `% M9 ]. c6 ]! u5 `3 N1 b printf("a is %d\n", buf.a); 9 B0 | Q( e: W3 F printf("b is %d\n", buf.b); 1 p7 V* f& d/ {! I0 ` printf("count is %d\n", buf.packet_cout);1 c4 Y) q, f6 }4 I1 C
count_copy = buf.packet_cout;9 n7 X- k! x+ p- G" C7 J k: d2 @
} - ~# h, A( Q) }7 E. W else2 b' W! L1 }' T5 [3 k% m2 I! S
{5 E, }0 \: x: ?" P5 Y: ]
printf("No effective message!");( X4 c, |/ I" p/ ?- c6 I( w1 W
}* b# T6 T6 M, d n! o
} ' T; A, g0 D3 ]# q- k# X; K 9 y/ @ U h$ R & \: O, ^6 ?+ F* G y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 D" ]% U) k! ~) o7 I* P5 _7 _- K
使用下面代码,对内存使用了mmap函数后: 9 K v. T/ }4 [: [+ x# k#include <stdio.h>; L' O* h( q% Y% c
#include <unistd.h>0 X7 d9 j0 ~" s6 I
#include <sys/mman.h>- Y9 H+ ^ j2 j+ X c! T
#include <sys/types.h> 0 h3 d8 z% r- d+ \3 t) T, v+ b#include <fcntl.h> 7 ?$ k% c" Q. Q( E* H9 L- k8 w& v) W$ M. g
#define SHAER_RAM_BASE_ADDR (0x80000000) 2 D+ _( E7 N( Y( F5 r7 L2 [: C# L#define SHAER_RAM_SIZE (0x20000) : P6 l- |3 Q, k. n- S8 w T& Y" {) M5 V, f
typedef struct 3 n! r. \& G$ q8 Z( ^5 s0 N, x{* O y! P2 h+ k3 v8 x$ [! e# b
unsigned int a; ) T( x! t" p5 C* a' g unsigned int b;, `$ S3 J' y2 S+ N9 h$ |* p t5 T
unsigned int packet_cout; 0 t J* w& ^8 s) ]- I8 X}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% X( F8 @" B7 [
+ z$ e( g7 E/ n0 Y* X5 G6 n
void read_MSG_buffer(int *baseaddr);$ Z8 z9 ?0 a8 N/ n
unsigned int count_copy = 0;( X5 C9 b/ }6 j; `9 S4 U
1 q" R+ n8 w5 i5 m/ p z
int main()2 G3 B% k% e* a1 ?9 g% s8 z% j
{ 9 X# j. |) n. P n. _ int fd;# A3 B0 }$ @( u' d# R- Y& r/ u2 x
int *mem = NULL; ( W( U3 k5 l1 e * P( f- t: K% i" W0 E/ q if((fd = open("/dev/mem", O_RDWR)) <0)8 M+ @6 P( \$ v
{ ( V4 w k1 F, O+ ^+ K perror("open error"); 3 j: C5 B% |/ I& _5 c4 ]' L return -1;5 V/ [9 D( K" d; q3 g7 [
} " R' @% L' W3 z) m( h , i' z: z' ~; c& n5 U5 z7 \1 v8 d' u/ A
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);9 Z: s& _! r" {; M
) _8 p) i' `0 ~" W& ^ while(1) / u6 u: Y% V; A( m0 n- L) R {6 h7 ^4 C2 ~! D$ A5 d$ Q
read_MSG_buffer(mem); 3 O" K& E1 m1 h* y4 w1 e } & E' ?+ V) Z# q2 l}, E _7 X" s$ g) ]; b) l
7 w) `9 W+ h, D0 Z3 R! @; t
void read_MSG_buffer(int *baseaddr) 7 w5 r3 X: H- A; c- f{0 w8 {) G. E7 z
pRX_MSG_PROTOCOL pshreRAM = NULL;: h; R7 p$ x" R/ f( D5 L1 ]7 n
! |1 Z0 T8 j( a5 S) X- r
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr; , Q8 u+ q ?" i( H5 v3 T4 E, Y/ w4 X
if(pshreRAM->packet_cout != count_copy)% |& y; ]( F9 a8 r9 X* P
{ 1 g( p2 D2 T$ C/ {# h printf("a is %d\n", pshreRAM->a); ' P3 E! g* [& S# O printf("b is %d\n", pshreRAM->b);+ F" w& f/ c' V# I) X5 R# Y$ H
printf("count is %d\n", pshreRAM->packet_cout); ; W# U' g$ S, B count_copy = pshreRAM->packet_cout;6 K# X9 w0 @6 L% W$ @1 E9 w& A9 ^0 O2 ?4 O
}7 }' U! \( N9 f' G \
else( Y7 I. I3 s7 l6 s% O
{- F; V/ w4 P1 C" H
printf("No effective message!\n");- `" f8 k* ^; J q
}' N& [2 f6 Z& V B, P) ?
}/ r, [& [0 }: g1 |3 w
- ~. q' t. ]# i& Y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? & d/ m( O. A, x$ B; m% ~, K3 @* c" N; ]$ l# C: ?) e5 w) F