标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页] 作者: zc_fly 时间: 2014-8-19 16:38 标题: OMAPL138的内存映射是否在Linux下已经完成??? 本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 k" a5 u& `! T! O8 Z * w0 t8 e8 `2 ZOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h> 6 z' L# F& `4 P8 J; y#include <unistd.h>9 \* L: u% Z2 j, V% X. }( Q; ^9 m
#include <sys/mman.h>$ b7 u( a4 i j, b: s
#include <sys/types.h>* s( q: v+ i) j6 H2 f& r
#include <fcntl.h>( w+ ^2 h: x# V! W' v. f1 E
1 Y7 K1 n: E( B; n7 o5 R
#define SHAER_RAM_BASE_ADDR (0x80000000) 7 r4 j3 j0 l/ m8 b 8 t3 z- W4 e) btypedef struct9 |% |8 t+ e! c) I
{ ' P3 r, k# Y0 u( i unsigned int a;" C1 P( f8 Z+ T8 J I3 }
unsigned int b;) f( I6 }% ], N, E
unsigned int packet_cout; 6 L; _, ?/ K. i3 i' Q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, C2 f/ {/ n: m; f2 q7 _5 \3 p
6 O3 p" f' ]. m6 v3 qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; R$ \% P4 H1 ]. d
unsigned int count_copy = 0;+ T* K8 w2 ~5 j% {
* \4 I M% T3 p: P/ G3 c6 D E0 i, f
% A3 H% h9 m4 M9 C+ Iint main() 5 V3 U" K* f" a{ ( r9 ~$ n! ^7 A/ K( W6 Z0 l3 {0 T pRX_MSG_PROTOCOL pshreRAM = NULL; : m4 u% y1 Q/ A+ b+ i4 M" k2 q pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; # N, v8 D9 S# k1 H" e- u& ?1 G \* k: A
while(1)2 g( ^6 _6 F# e7 F; |2 C
{ & w$ i H# V5 y8 q; t read_MSG_buffer(pshreRAM);& |5 r/ W4 x6 c y6 |4 k, M5 `$ ?
} 9 V8 Z. k9 B9 A: ^+ F7 ^( {} , L g: t$ x, H5 z! V# Y+ z1 w( o% V; c- S6 U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM) % S+ c& ] G- ^4 p! S8 G/ P2 {3 _{ 5 M# S8 ^( ~2 Q( J( @ RX_MSG_PROTOCOL buf; 5 t7 q& R8 u: j$ c! ]5 [ 0 p, `* D# s3 s/ w$ M& n buf.a = pshreRAM->a;, }7 P4 i6 u- U* k
buf.b = pshreRAM->b;2 r" n* R% l F/ l* V1 Z( R' y
buf.packet_cout = pshreRAM->packet_cout; 5 Y4 I, T4 S1 z $ j& f( |/ j5 @5 W if(buf.packet_cout != count_copy)- {+ u- _5 G; V; o' \
{! C7 c1 a3 U' r# Z) [) Q; L
printf("a is %d\n", buf.a); ( ~. v' S+ z3 |$ m, b9 P8 q4 V4 U printf("b is %d\n", buf.b); $ E0 W& U) _/ \5 r5 b" ]$ u printf("count is %d\n", buf.packet_cout); & |7 t! \0 L% ? count_copy = buf.packet_cout;6 t$ r) G9 O2 J$ }: W J* A4 w
}% p) N, h1 e- S
else1 z* Z! `4 [$ m( x7 X3 b9 ]
{1 j/ ]- Y" b/ z0 y, F
printf("No effective message!");1 l4 [% v* ]* Q# s0 y# J
}3 @7 @! N. Q; f4 w+ ]
} / Y: J% I3 t! w) H8 M+ w5 z ) ^: {7 H/ K" a9 n, H4 J/ z1 z1 y ; v- z+ Z* i# p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。3 G' M3 _1 r9 E+ K* v4 p
使用下面代码,对内存使用了mmap函数后: 3 Z% n& o* {& Q; X6 K5 h#include <stdio.h>3 r1 k& t2 x8 q3 l$ \; P E
#include <unistd.h> 4 Y' N8 B, e s i+ U& |; b5 X#include <sys/mman.h>4 @9 n6 y/ T* E5 F4 O1 {
#include <sys/types.h> * h, j' y2 f9 g# }#include <fcntl.h> " l/ x; h6 [8 y* v$ k y0 O+ c$ g7 b, D, D9 q
#define SHAER_RAM_BASE_ADDR (0x80000000)2 I" s5 n3 J7 L
#define SHAER_RAM_SIZE (0x20000) , O$ [& ?: b" `. f
# v4 z" K' h$ x; }" h* _typedef struct : e+ X1 u2 e) ?8 a( ?{ , s4 r H# X, g s2 A5 } unsigned int a;) q- n. g) @! B( b: i3 P, P' w
unsigned int b;! K2 }+ Y- E0 q2 ^1 q3 Z! o* l/ Q
unsigned int packet_cout;+ H6 C5 H! n# c2 W4 P; ?4 N3 `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ `2 m0 Z- R+ d* N
. k t4 m# x# S- R
void read_MSG_buffer(int *baseaddr);9 g) w* g" u( O. a ]6 s/ ^
unsigned int count_copy = 0; 7 G5 h! F6 q6 K: r q, I% N 0 ~# l$ _7 S& M: e" d+ p8 [) y- Gint main(): [. k0 l, f& ~ P2 N) @
{/ A9 ^0 d2 E3 m% B9 I" v
int fd;8 G# W! c& I0 x9 ]
int *mem = NULL;, Y) B! J( u8 c6 N8 }7 J& w