标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页] 作者: zc_fly 时间: 2014-8-19 16:38 标题: OMAPL138的内存映射是否在Linux下已经完成??? 本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ( j& r: t% Y0 z* b0 r0 o: x9 t9 ^6 {4 y% y1 P( ?; p4 @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& ~' o! l) R/ z2 ?
#include <unistd.h> $ h7 z2 S& X1 R E#include <sys/mman.h> 7 O1 ~, k( z, X) }/ x9 a#include <sys/types.h>, Q1 D3 Z% R' a% q% ~3 Z
#include <fcntl.h> " m- a( [% N! D% ], O: y+ J3 G* U% K- {
#define SHAER_RAM_BASE_ADDR (0x80000000) / ]0 R% x; s8 K# Y" X o , E7 s% P9 F+ D7 Etypedef struct4 m' w$ U: Y: k
{ # u- P% W/ J' c* S, \ unsigned int a;1 [1 T' g0 m+ U
unsigned int b; 7 |$ k5 B# I: v A: Q6 u; k unsigned int packet_cout; 3 R" G6 X+ ~2 e$ W* H. s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 }, x2 R% a4 l; i( {
% {9 b' Z; g+ U, ~& s+ ~$ I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); , O, \: X g0 ~0 k5 b0 L, W I- N' Nunsigned int count_copy = 0;9 K0 N$ |0 x. W3 r$ V
H! o( K; t- y' B6 |) s" o/ s
- e# D% x) j! r/ v3 ]* w
int main()9 d; D; N+ N( K. n: t7 x& T
{ : f* u7 k" {; u6 D+ R* c0 T$ J& d pRX_MSG_PROTOCOL pshreRAM = NULL; 2 n- U& G# }4 R0 c3 k% D! f9 x pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; . [/ R) ^. N9 i / d5 b( W7 {. \: r8 e; { while(1)2 }5 C9 y( N* m& A$ ]5 H
{ % E4 M3 F7 P* E5 _( m& f read_MSG_buffer(pshreRAM); $ |1 B1 @3 l+ U( r- U3 T2 I" N } . x8 Z$ B8 g7 w W' `- j% x9 v) C
} L# d. V: _* a9 T- C9 D& l' G( f4 ]# U 9 O% k6 Z" K% H, Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM) 4 ~" ?0 a( `# O5 Q{; Z, |/ g" |: F- i5 L
RX_MSG_PROTOCOL buf;/ w4 q3 o* `7 _4 a/ y
" U. B& c' C. |$ c$ _$ A0 p! K
buf.a = pshreRAM->a;/ e" G7 v# O% _$ J
buf.b = pshreRAM->b;* o, Z, I' ~% {3 F' ~( E8 |
buf.packet_cout = pshreRAM->packet_cout;6 G# ~+ P# J3 J- B4 \& A5 v
* x9 c8 b# r, \
if(buf.packet_cout != count_copy)" t4 r' ]- Y( u X
{2 D; A F2 T# k; R/ b2 O5 e; Y8 f0 E
printf("a is %d\n", buf.a); ; S2 k4 Q4 z0 q7 H! ? printf("b is %d\n", buf.b); ' o: t' f9 b2 r( E( @! F printf("count is %d\n", buf.packet_cout);) Z& r3 p9 i, o8 c ~; [
count_copy = buf.packet_cout; / D z, S; T. l8 v# l& C R* T! t } L- S/ M- [; {# Z
else " W) d' I- t" E' s9 h% T/ k { 5 @9 G/ ^, U$ ?7 l printf("No effective message!"); 0 v9 K& W) S! X* M h* t } " v* ^& v2 ?# k}7 E: S3 Z* Z6 B) z
7 _ y- b% H4 ~
+ ?/ {* i! r$ A" o
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ S3 D5 D4 b; x; l
使用下面代码,对内存使用了mmap函数后:$ Q- g6 F: E* @* \6 R
#include <stdio.h>& A& F8 v6 z! C; V5 \5 K4 M3 H
#include <unistd.h> , I3 s/ j6 l; L/ w, h7 y5 W#include <sys/mman.h> , y9 @5 @$ y; ^9 Y& x! z* D% _: [#include <sys/types.h>! @3 X" G) n+ U9 j! Y* \1 ^, y
#include <fcntl.h> . B0 `: ^ ^% ^+ W# u3 J$ \ 8 H0 w( n, P5 [4 D- o8 U#define SHAER_RAM_BASE_ADDR (0x80000000) . D( R n, D& V0 ?- l) \#define SHAER_RAM_SIZE (0x20000) . {& T9 Z+ P5 a, q3 Q; G2 x; X, P* W! y
typedef struct ! e- z, }" t" D- T( ?5 k! [" u+ t{ * x v- ?; c; V: ] unsigned int a;% r3 {( y0 x# _( v- ~; ]: d3 C$ U. v
unsigned int b; , S1 p1 O5 n: \" k4 A b unsigned int packet_cout;( K G* C) j8 M& a( V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 R1 ^2 d* r H2 g y$ r* \- B! f
: k4 G) H# }, Q; B# V6 Pvoid read_MSG_buffer(int *baseaddr); " z0 J, t6 m; C' l, ?& ~6 xunsigned int count_copy = 0; 9 {8 i; r! J$ n2 @" ~7 d% M ` ) y; X' h1 V5 J8 f6 Cint main()+ V3 C w5 k m8 _& ]: k
{ # g, @; l$ ?, g" N/ @( Q1 S: m/ l int fd;% y+ K( F" }% X% X' Q: c# I
int *mem = NULL;) _! O2 y9 A6 L; L
^4 R/ Q4 H7 \2 R if((fd = open("/dev/mem", O_RDWR)) <0): [7 N; N4 F. B& W2 ~+ _
{' L X6 x2 d5 Q, \4 j
perror("open error");; {! R0 m' R/ Y
return -1;5 W. ^# u j9 M1 |8 Q, f# d
}, Q, w: f3 G, U
) x' p7 {* c" G( c mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); $ Z& P" Y3 P2 @/ I Q ' A3 n; b( d- r$ E while(1)2 Q5 k/ ~2 H& b" s4 n! n8 [+ f+ q
{; h9 g) Y; J3 j& H
read_MSG_buffer(mem);' f4 I, o) w6 [; N/ R
} ; J# R9 f4 z- V" R} + u- U- @ Z2 s3 l e5 V* Q. E6 T# L3 c* Y9 c q8 b8 y( K
void read_MSG_buffer(int *baseaddr) : I$ H8 O$ V* X; a{ 1 z$ j: v! m B- G2 U5 @7 |- @9 e pRX_MSG_PROTOCOL pshreRAM = NULL; 4 |7 _& w0 O" ?( B/ ?9 n1 G+ `0 D( @2 s2 ]" `7 Y0 g
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* y, B' w. M. f2 t4 D5 ~* z
( F- o$ M7 A h* D if(pshreRAM->packet_cout != count_copy)" D+ ^. p2 z/ [: @3 E' z% F
{ n! K' F7 c$ ~ printf("a is %d\n", pshreRAM->a);( O5 ~4 T4 M( p# }' x& M! ~- p# j
printf("b is %d\n", pshreRAM->b);% A( ^2 Q _7 D# M: \* p" H
printf("count is %d\n", pshreRAM->packet_cout);& [0 D$ |7 T. L9 r+ d( Z
count_copy = pshreRAM->packet_cout;% G$ G$ ^* |8 {' [* Y( s. g
}* S. ^$ M/ H" d$ G
else b8 r. R4 |0 Z/ t- ~7 l) P" Z { 9 W- n& B/ U( p- }6 v) ^ printf("No effective message!\n");2 T/ k1 E8 m. N# ~( S
}, X$ Y: |$ x$ w* O$ {* a
} & F* _4 Y' N7 } 4 ~ A; ?+ p) w+ G2 \: A没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???2 ^7 X; l* G& f, A5 Y
4 r( ~4 q' p: X6 e4 I4 Q # M) N# ~+ G, c 3 m% d5 u. u& f$ o8 A/ d' L / \" V" P8 N& N8 |* g, C