标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页] 作者: zc_fly 时间: 2014-8-19 16:38 标题: OMAPL138的内存映射是否在Linux下已经完成??? 本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # I. T, H" m1 ^8 }
! Z" N: i6 x* _2 b# J/ ^
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h> 0 j( c0 q9 f9 B2 H! r#include <unistd.h> , N5 W0 i' A- w$ d#include <sys/mman.h>1 O/ [* X% h- F; T j" E/ x
#include <sys/types.h> M1 L* E' V" E+ }( g& u. K% P
#include <fcntl.h> $ i. p1 s$ `7 |* [3 G ' j# p( L6 k2 b r( t7 O#define SHAER_RAM_BASE_ADDR (0x80000000) . A& u/ U, f2 _$ ^ ) q/ E3 x6 F+ w* N8 P$ ^typedef struct9 _3 ?# ?; }3 z& X; y9 N) B
{% d; J( _. K' ~+ c$ h7 Y: E4 c
unsigned int a; 1 O- w% n8 `; }9 n/ h) ~, ^ unsigned int b;; o, O4 \# k, l8 t
unsigned int packet_cout;3 J# w% H* F/ ^4 V7 l4 s6 F* H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. b6 k& g4 n! w. q* D
) o. I: M: m1 Q; C% e" ^6 {# g2 s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); ) `$ I9 w6 v4 v9 F0 h% o9 h$ D" J3 kunsigned int count_copy = 0; ! l- d" L4 c2 a! a! L: V% M) V3 S- s3 W0 H5 w
4 H3 k# y) ]( C
int main() 2 a, J7 n! J( ~4 F! X) |{ 5 E( e/ B$ ~' ?+ ~ pRX_MSG_PROTOCOL pshreRAM = NULL;' _. X: b0 j* f# [7 v
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; / L9 x# |! I& n' Q$ T4 N, i4 R: ~5 c8 o4 I0 D' i
while(1)/ j) D5 C6 g+ @) D* V% h1 X
{2 _: i+ W+ ^0 E- J2 `% K
read_MSG_buffer(pshreRAM); 8 x/ @, x( W9 q- i7 s } 6 G `1 L9 t* k3 b0 t% ~9 a} + D" m6 c k2 N0 D8 U9 @7 R3 ]3 @) e2 [ X3 y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM) ; k7 Z# F5 n5 N{7 E2 u" L' q* f3 C
RX_MSG_PROTOCOL buf; 6 r) m- C% H0 i# { 2 y, B1 @5 E. Q! R2 s0 [1 v buf.a = pshreRAM->a;1 r) u8 p- U0 k
buf.b = pshreRAM->b; 4 d9 b+ D0 l7 v" r" X buf.packet_cout = pshreRAM->packet_cout;( c5 G% E! W- Z1 L5 F( Y7 U
6 D. U- ]# t! P4 \5 { if(buf.packet_cout != count_copy)9 m: T; L5 P+ V2 i% c; ]
{ 0 N2 j2 U) s0 |+ q/ U! { printf("a is %d\n", buf.a);! q( d; h# r: R" U) A' S- a4 Z
printf("b is %d\n", buf.b); $ u; m8 w1 E8 Y3 W7 @6 f* | printf("count is %d\n", buf.packet_cout); G' g3 c( ]& w8 X
count_copy = buf.packet_cout; [' Z' C& s; `) S* {5 q
}- U8 O. l: m8 B5 v3 F3 o+ u
else 2 W: H9 S( S; `# \4 T& a { 9 |+ O0 x8 t4 D, P printf("No effective message!");# {* M0 ^2 J. B6 I" m1 O- ]
}, c) x0 }$ Q0 `" z- D; g
} , s y) L2 K: d( x) y + Y/ }- `2 N5 ]) m/ G- o) r% r- u% ]( T9 ^: z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。7 V2 ^% S! U! p& Y
使用下面代码,对内存使用了mmap函数后: & r) N7 P6 d$ n; V#include <stdio.h> 7 L1 O6 R( R m# B. Y% w$ }. z#include <unistd.h>8 q6 j' C; g8 I( c1 j6 d
#include <sys/mman.h>6 _& L5 {5 I# u
#include <sys/types.h> 7 W3 w" H; w' Y2 B5 \# Y8 _#include <fcntl.h>1 u" C. r; l, L: c" U5 }
# z+ R) V$ y2 Z% |4 n2 j/ b#define SHAER_RAM_BASE_ADDR (0x80000000)8 O+ k2 Z$ H: w/ q- h! U$ N; f" h: p
#define SHAER_RAM_SIZE (0x20000) ) v3 H/ u2 `# S# U; ~ % E) i: v7 F1 s5 ~/ C$ P9 _6 E: Vtypedef struct* s4 }' r1 @9 x- M
{5 F2 J L5 w5 k7 U5 K
unsigned int a; 9 ~- S) l5 [0 e1 ]0 W0 ~ unsigned int b; r w9 @( S+ o
unsigned int packet_cout; ' d! V w* H; a2 D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; - m8 ]& _6 ]! S* B + j# Y# i: r: P6 fvoid read_MSG_buffer(int *baseaddr);% I1 U5 g7 ^ N4 `) a7 @+ s
unsigned int count_copy = 0; # r3 i6 i1 v3 k1 H J( k$ Q% F' C$ y, z3 B* ]0 m" P3 A- x
int main()0 f: P" l/ O( `, o
{ " l, l X6 Q9 a" G6 r4 u int fd;! x8 j P+ x8 L; M1 J2 h
int *mem = NULL; " |$ \) b/ i4 w( I+ w( Z; S % q$ Z! o# {9 G$ n4 u$ s6 A if((fd = open("/dev/mem", O_RDWR)) <0). t# M" {% h k& s, V
{ 4 h) o ]& c3 d perror("open error");# ^, q; G& Z* @6 B* G
return -1;; u9 t2 I1 x% C! C9 y( b4 j1 }
}/ ?" }5 D! t* C- P# _! i
$ m% M3 b; J# s9 A5 D( U' [
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); ( E7 k: k1 Y; s1 A( P8 I, B! C( Y. C; s& }& X
while(1)* H, k: y2 _# Q8 h6 F0 D) w
{2 r, m: i* x6 B. _1 B3 r
read_MSG_buffer(mem);# i8 S$ U% l: H
} / ~6 P1 l5 X" O/ L' J: j8 W9 |
} , R3 v. ^1 e! V4 g3 `3 d6 L' I! f+ C* V ]- S
void read_MSG_buffer(int *baseaddr) ) J) W: ^ v% {% x6 m- F1 n{ + s h/ @# d$ V4 Q pRX_MSG_PROTOCOL pshreRAM = NULL; ! H( N5 W' S1 h2 t( _5 q; H; D2 @ 6 b% H, h3 E1 t. n5 ^: @6 Z pshreRAM = (pRX_MSG_PROTOCOL)baseaddr; . g( k, S; t6 Z* O: e1 v0 o" m 2 ?" H4 s- b+ E4 I5 A( X% Y" w& y. W if(pshreRAM->packet_cout != count_copy) Y+ J% b1 }( C2 @ K {" w, V0 T" `) `7 y; ^* j
printf("a is %d\n", pshreRAM->a);/ d8 w- M/ m, g b; o3 w3 |& T
printf("b is %d\n", pshreRAM->b);& X3 _1 s% {' b0 q2 F: y
printf("count is %d\n", pshreRAM->packet_cout);' i' N) t2 f: g( S
count_copy = pshreRAM->packet_cout; % I7 B, S8 b9 s+ t; T% X1 X } : b! N1 n% D+ ]8 G$ ` else- C& q; U L2 ^/ f. T- O7 t: F, Q
{ + @. f) p: A' Y" F% f! T printf("No effective message!\n"); 7 A* r* M$ t3 k" [. X } 0 ^" g" h+ u" [( r% @' @}5 R5 c( e) ~" Q2 H) g- C; U9 N1 ~
Z0 O" t v5 J9 E( A* u9 \7 ]没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, ~/ U. D, n, `* I. t7 d0 E+ p
" A6 O! W1 x/ y h9 L& X* O7 r. r5 J: z! K/ _" F) n
# H; T1 S! R- P) ]1 O9 [
- [" l7 x; F1 \$ H/ y8 h1 A