5 m; S' Y+ N o3 _) Z0 Itypedef struct K2 O9 A1 ^. Z2 n{ 1 ?6 B1 | k! u' H unsigned int a;* a5 D; f1 V. b
unsigned int b;5 J7 c: S/ K# x% x1 |9 s6 k$ _" k0 @
unsigned int packet_cout;" x V4 c1 T% F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* R4 e6 }8 y4 k( g4 D8 B5 K
: d {6 w' b" |( ^) R) W: Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- v c; J; h( l0 P1 e# p
unsigned int count_copy = 0;( F @, F/ n! H" J
+ ^( X' f! n- C5 [! w# r
* ~( O0 P1 ?! g, eint main()% K. u( _' P! |7 ?8 B: X$ @
{1 V Z- t, {' ^0 U8 y
pRX_MSG_PROTOCOL pshreRAM = NULL; `" \/ Q, U+ |2 P* y
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; 5 Y7 N5 \5 q, z- c& i9 d9 I 9 Q$ d* f8 i1 y- O l6 V while(1)6 e$ R, K8 a! S8 Y2 B+ a0 ^0 L
{6 f- Q- T1 H/ C" z7 V7 ^, y
read_MSG_buffer(pshreRAM); ; s+ w! Y7 c* t2 P( t } 8 O) M# ?9 Q; t}4 G$ ~1 F6 n1 `' r/ b5 U
9 m* [. B2 L# q7 }2 ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" A) W m: ?* H2 H9 N+ O; W; |
{+ m. a5 r6 ^# W+ o- Y8 @
RX_MSG_PROTOCOL buf;5 Z- _, E) b+ Q! s; g4 U
) P' P$ o N7 k9 D5 b buf.a = pshreRAM->a;& O. ?* Q: P I; n* ^9 M1 C
buf.b = pshreRAM->b; * E% E- T: F1 h4 j, x+ e, M buf.packet_cout = pshreRAM->packet_cout; : H9 Z8 F$ t: p' c0 h0 ] ) ?" _! q, G6 C8 ^! I if(buf.packet_cout != count_copy) ! d% K4 c0 o( p7 _: X {! r8 l3 c% P! F% ~. @8 r* x/ \
printf("a is %d\n", buf.a);% P6 E6 x6 A: i2 f. ~- G
printf("b is %d\n", buf.b);8 V& s1 ~( W4 }8 Q. i1 G; @& H
printf("count is %d\n", buf.packet_cout);8 z4 |( k, d5 x7 p9 B g9 J$ q
count_copy = buf.packet_cout; 9 H3 w# w8 ]1 N6 o a/ y } 2 J7 `' F7 X7 y7 K else( D: ~4 \ H6 N6 k
{9 E6 `3 }# h8 w2 ]1 d0 F% x& O6 x
printf("No effective message!");! F* Q; G! g( ]3 M5 n# m1 t+ `
}0 g4 F% i; ~) ^' V) V3 h( I
}# r- X/ x, V( V( p9 u1 X$ O
. y' K# g" Q0 g, _9 N+ A - Y9 g) |, z) X' d' K但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。 ' H) _# T& H( ^ z8 u c- E使用下面代码,对内存使用了mmap函数后:" w/ }, }# m0 l ^* n! ]! \6 t
#include <stdio.h> ; F/ b7 Q( |. V#include <unistd.h> 8 T& s c4 n! C6 b- @6 `#include <sys/mman.h>2 t$ j+ `$ A; s" x3 i1 n
#include <sys/types.h> % |; ~9 t. W# h- T7 H#include <fcntl.h>; q& [8 b9 h0 D% `4 ^) Z
4 Y( r3 Q+ u! h: Y#define SHAER_RAM_BASE_ADDR (0x80000000) ; E. e* ^0 ^5 U$ L#define SHAER_RAM_SIZE (0x20000) 1 m) I3 D. R) l* F5 u, Q( E
9 B$ I" _6 m' t7 Z
typedef struct! J# [4 u1 k* D: Q: s$ E3 q, d" o
{9 |* A( G' {; Y! u
unsigned int a; / r* w9 v1 C1 \2 G& [( | unsigned int b; + i3 a: X% M [" @; N; b/ [ unsigned int packet_cout; 9 x* ], E9 k. J/ v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ J, T2 f+ `5 \6 t$ c
- e$ f6 ~* I4 U
void read_MSG_buffer(int *baseaddr);: y$ I! v7 h2 T; p
unsigned int count_copy = 0; ; [# W7 A& e- R; R- K. u# k " V4 {0 X' D5 B$ v" o9 eint main()# W0 [1 I% p* i( Q1 h, B
{ - ?3 X- U1 N$ z( ?% z int fd;; |! ~3 i* i( ^; t6 v; _
int *mem = NULL;; L% Q" G, I' A3 R7 k: g7 P
5 X9 U: I! p6 \/ _* Z3 A
if((fd = open("/dev/mem", O_RDWR)) <0)# b2 r3 z; N8 \ V
{ 8 G. A0 T$ K% h7 o( J4 \! P$ W" q perror("open error"); 3 Q5 j2 C# ]# R' r Z( o return -1;# S9 |1 }# L/ e8 c% {. F
} 2 v) J" j0 F B3 H; U ' @$ z, L1 P. m. @ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); ' _0 _% x- Y" M" C* `( V( ? ' g/ x( W) O* T' d# m: J5 W while(1)9 ]0 D8 V9 I, _
{ ( ?9 r7 u3 \$ \3 S! m: v read_MSG_buffer(mem);2 z, E( s$ Q* p/ O; f% x, X: b
} . x) e c+ z& Q8 ~% E. g- i} ' f3 g1 } u9 x: E" g9 t; S, k . k' a$ K* S: K M: zvoid read_MSG_buffer(int *baseaddr) & r! D9 W9 ]* I: n{7 A( F* W2 i6 n4 K/ [2 [6 X) i
pRX_MSG_PROTOCOL pshreRAM = NULL;9 ?. Z: e. f& `3 s# V- ` L# `
7 w4 v2 A- D! ]
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 ` K8 e7 o2 E* K8 y8 G) ` F- `. U
0 |* P# v2 }9 [; f- n8 Q2 u
if(pshreRAM->packet_cout != count_copy)/ `0 F' m6 Y* x$ v5 N" O) s
{ / }4 H9 Y" U0 L4 Y, J, n9 C2 E% h( C* n+ P printf("a is %d\n", pshreRAM->a); ; r+ Q9 E# b4 {2 x printf("b is %d\n", pshreRAM->b); ) l, j: u! w5 }6 G$ t7 l printf("count is %d\n", pshreRAM->packet_cout);# E5 K; \) g! a' [- n
count_copy = pshreRAM->packet_cout; 3 O3 A7 L' y% u. A2 k9 a B4 z }9 K, B+ ?! w/ H5 Q; e, q# L4 h1 u
else 6 r: j* r8 F; c* k" [% e. Z9 A { , b5 e, j9 r" Y% J printf("No effective message!\n"); / Z6 q/ _9 Y w$ U+ g8 N! F( a } $ ?4 E D% d- ^: \* ], M( Q1 v( _* S} Q: P4 n* O2 Y+ B9 l! E
& h- ~) ^5 T/ N% Z8 _& ?2 x没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) B7 f2 c o6 e0 P8 g3 B
. h0 G% i! u' ?* \) [* Z1 j) F