嵌入式开发者社区

标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页]

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 K, |, _7 \2 {2 o- n

. h$ b% o3 M) e+ r4 {, @8 a7 v3 POMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. Q: q: H+ W  h5 t) X
#include <unistd.h>0 D$ ]" a/ z  n! G" r+ @' I
#include <sys/mman.h>- f6 n# O8 [/ t7 {; q
#include <sys/types.h>4 ?6 I( |, w- }+ P# Q/ E; C
#include <fcntl.h>
' t& j+ A+ h# P  k! A( f/ x: z' r8 J( {. i: z4 a& T8 Q
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
& b) B3 e! Y' `6 T) F9 |4 ?
7 h0 t! F& @" T% \9 A2 ttypedef struct
4 J  G* ~9 I' m7 ?" n( \/ L5 V3 K7 j{; E) x0 A6 s; \* ?
        unsigned int a;
. m! X8 P2 k+ \7 c% t) j9 B        unsigned int b;% J' J, S! ]1 w3 d
        unsigned int packet_cout;
+ H2 U& m7 D: _4 q) }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 H% m) Z7 g( _8 l
" Z6 B  G1 a) U9 w0 n1 N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! P: k3 k$ R8 J4 Zunsigned int count_copy = 0;" a6 J! g  S' Q3 A; F

! Z' X; z- f8 J* C: W6 n4 l$ O0 v: \
4 ?( X  y3 d  Q. y6 I3 Pint main()" Q# ^4 M5 z. S* K6 m+ e
{
9 p7 r0 e% E2 p3 O& ~7 L        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 v  W1 Z' W$ f* }! [' T( i. y; P        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* v4 u: |8 O! h4 u; J2 n7 n
* ^" Q7 ]9 B& `7 @2 v' `        while(1)2 [5 h* y/ d% K6 I3 b
        {" _$ I+ c1 |$ ~5 W& Z/ ~
                read_MSG_buffer(pshreRAM);
* Y- P! X5 j# t        }               
: C" b, p8 l6 b% H' v7 d. k6 a1 Z0 d}
, l" I3 S" v& }# e
7 x2 s% s8 D! p) ~& Z5 }void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ F0 F3 E2 O" n1 ^  A& H* a{
6 H! f+ k2 y# s! u# ]! T        RX_MSG_PROTOCOL buf;- K+ O0 N+ ^% r9 j& E& w* u8 V
        
2 S* W0 v3 f3 ]! D. D        buf.a = pshreRAM->a;9 L& `9 u% h' K# v6 a
        buf.b = pshreRAM->b;. j$ _9 S4 [6 l) h* O4 O
        buf.packet_cout = pshreRAM->packet_cout;
+ K$ b% a- {3 e/ U- s8 Q( V        
; s8 F. E' G/ a  c% y- X5 s* G% U        if(buf.packet_cout != count_copy)- l& o; j& o* f% y1 T
        {8 t1 l* C5 a( R* s5 T1 m9 X
                printf("a is %d\n", buf.a);; r/ O  Y& H) p
                printf("b is %d\n", buf.b);$ w8 W% @8 `4 S3 }: @2 Q& p
                printf("count is %d\n", buf.packet_cout);  {1 ?9 h0 }  W8 o6 L+ a/ Z" s1 C7 |3 q
                count_copy = buf.packet_cout;$ g1 M' I. |6 C
        }
# |: `+ F' w3 z& I. z% O        else  b8 H7 i# s$ s( G" G
        {6 M* m! Z7 r% \0 |: O5 x* Y
                printf("No effective message!");5 f2 B+ t* f5 J& V5 T
        }
! e% N- m$ s% w: t. w8 N0 a* R: I}
( r% y/ Q) w: `  @; j, \# I) ^) A* I5 I# x  p  F
; Q: l5 O: }" T, w. V3 k# P, f4 W
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。! i  g4 |( A# i; c5 F  {- s
使用下面代码,对内存使用了mmap函数后:
) R' ?6 ^& o0 g9 \0 r, p#include <stdio.h>  W  j) r, W9 V' k
#include <unistd.h>
2 M6 W$ j5 o' Q" D2 X1 k) V" v, L#include <sys/mman.h>
( I7 T9 S! M0 R5 @9 \5 I  ?" M#include <sys/types.h>7 Q8 X+ i$ @2 s; X3 @
#include <fcntl.h>
( {; `' |. k+ \, n. X: {" |* @4 y- e3 S' g4 r7 w
#define SHAER_RAM_BASE_ADDR    (0x80000000)3 w: {# E, t6 N
#define SHAER_RAM_SIZE         (0x20000)     |1 |( e. s- _( _

" ^6 a5 H/ l. J# t8 Stypedef struct4 }" I" i) a* C+ \, J" V
{
% p. S$ y) r: P7 d( G        unsigned int a;
* w1 _  p2 X/ j& _6 F  t6 D& O        unsigned int b;
' f9 d5 x7 I: P' q' G8 u* h        unsigned int packet_cout;
9 Z9 L  S/ O0 {5 ]; m* j( b0 a}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 I- l; ^0 q" \; R' q5 N2 e" O

1 K/ |! k  I- }7 \5 yvoid read_MSG_buffer(int *baseaddr);
7 X  D5 @! I% ^unsigned int count_copy = 0;
/ U+ k3 P4 \% U1 R3 [0 y
! ^: F) U9 {0 q  S* Sint main()8 d1 r/ x& g: d* a
{$ `4 y  S5 E; ^) d2 @1 r
        int fd;
; x' m, y. f8 i/ Q( B. ?        int *mem = NULL;& G$ g1 J0 `! B4 u* ]5 U; |
8 v8 `7 d$ k5 E* i
        if((fd = open("/dev/mem", O_RDWR)) <0)
( S0 |7 Z8 q4 q3 R$ E% G        {- H$ y: p' a$ k8 ^
                perror("open error");
2 w5 s5 W; o  x% Y                return -1;
( {8 T! `4 m/ I* M7 I# m0 X5 m+ f        }! c: I6 ~* R' A, K1 t$ h
        
2 A) A/ a: j7 ~" \9 f8 ~, r/ i        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 I$ B3 T% t9 _5 Q+ F* z% V5 x
. p7 M, Y' z- _$ T( Y        while(1)
( S& r( c( e, U6 L) r        {
' |# h* F' W6 P9 D+ Z- g& m                read_MSG_buffer(mem);8 s2 O( \4 j' P3 L& M# `$ r1 L
        }               
5 q7 R- x. x  n8 V, O- a& P}
( ]' N6 s- c- H* }1 I* j4 u/ ~3 ^7 x9 _
: |; N0 a5 x. x, _9 C  N9 z0 o, m4 qvoid read_MSG_buffer(int *baseaddr)1 F& K% J; C7 v" Q- o$ H" G
{
' G) n( m# x" s  Q. a        pRX_MSG_PROTOCOL pshreRAM = NULL;; R2 a% i5 l; S7 h7 Z! ]5 ?

+ e6 x5 n6 i( H  p; h6 |        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;' v* r) e5 \& |: }  r! h7 V( s
; x8 J* @% M% Q* O* R. Y
        if(pshreRAM->packet_cout != count_copy)6 A. z! W+ K( Z" w9 i4 G$ [
        {
- \- _) X' N# A1 J2 r$ U, C                printf("a is %d\n", pshreRAM->a);
* Z2 P% b3 y9 K8 I6 h                printf("b is %d\n", pshreRAM->b);+ g0 K' v  x/ {' O( }# I9 O
                printf("count is %d\n", pshreRAM->packet_cout);
& e1 l5 @0 Y: V. M                count_copy = pshreRAM->packet_cout;
- n0 a3 a. o( I+ x) a2 q        }$ s" X" A! m: Q% U; G9 ?: |
        else
$ @9 t/ t8 r8 d4 P        {
9 Y2 Y7 r& c" L$ P% |& Q: j) `                printf("No effective message!\n");& R5 i7 s4 x2 f
        }# c; }5 q. P% t4 Y. ]4 K
}
1 U, g2 b; _3 Q: P% i1 W
% u* S+ u" [. a' Q4 H  t( @没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 }& l- m, j1 v; J0 F; g
; H; L7 Y+ S6 I/ \9 Y
0 B) p7 N0 y1 |0 R( M# s8 T! q& n5 m/ F- N9 H: m& c5 \1 n3 G& W" K8 k" r# ?
7 l4 O) n1 ]" K+ d  W6 C6 G. d





欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4