嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 }/ r9 |; X) }( F+ T2 o+ u) h3 F7 P* j9 a
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! I1 b: U) i- z#include <unistd.h>
5 I; K% `; i8 o/ }. j, v/ q#include <sys/mman.h>; O) X5 K* p5 \. {% {
#include <sys/types.h>
4 ^% k* x9 S* q' A#include <fcntl.h>
2 E" F% L1 x* K1 _8 y) E0 j1 }1 ~4 s
#define SHAER_RAM_BASE_ADDR    (0x80000000)   3 m3 C7 i3 L8 }3 ^8 L

. T( y: S+ u: Htypedef struct: c/ R8 z& Z7 J, R6 K: V8 }! |; l
{
' Z! t' z+ M4 @7 w- [( O/ \3 }        unsigned int a;/ ]4 H# H- E* Z
        unsigned int b;# V  _! U4 q6 c" v9 f
        unsigned int packet_cout;
" P" U% p( X7 t9 |}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. G! J+ E) J' i+ O

. B/ D* ^4 n6 K- p8 I7 t* u/ f: {& Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) P# c8 C5 S+ t9 ^/ a& Z3 Uunsigned int count_copy = 0;  A% g' h, `6 }; A

/ u2 n0 ]* l9 x
; {" k. i1 Y7 B! ?* P5 f. iint main(). t+ q) v4 v$ H$ G3 [2 ~
{
) |7 d) X9 @6 t0 a+ k' a        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 S0 D- F/ B) {        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 w" J4 d5 s) ]4 k8 l$ s9 g; R1 z
        while(1)* [* {) V4 l( `& H+ j7 D9 [$ D( f
        {0 G; ^2 c8 z( @- O$ p1 Q" b
                read_MSG_buffer(pshreRAM);
5 X6 W2 M$ ^  e; ?9 ?        }                0 m3 g( W4 H, N$ t+ F3 w$ Q
}
$ V' c, ^- R  p0 s
* }4 N0 [8 ^0 x# S6 Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* J7 x6 h' {, u4 x3 z
{4 R0 b2 i1 C& E7 R& i
        RX_MSG_PROTOCOL buf;5 [* p2 n/ ~$ C# t
        
" |# E1 l% J. U( q. Z        buf.a = pshreRAM->a;
3 r$ v+ h' p. Q, i+ F' `        buf.b = pshreRAM->b;
3 U6 v: s, b( d* S        buf.packet_cout = pshreRAM->packet_cout;
4 p- |; a! N' ~  z0 J1 n9 ^# {        9 T) l) c9 z# I4 E3 t4 I3 s
        if(buf.packet_cout != count_copy)
+ S- Y" F) s. z% ^4 C8 ]* q  H' @1 ~        {
+ d2 I+ Q- W2 T1 \" R7 _; J                printf("a is %d\n", buf.a);. s, |+ z9 b, J8 M5 i, D
                printf("b is %d\n", buf.b);
, f: c3 [& J6 a) K                printf("count is %d\n", buf.packet_cout);
3 [" \$ V5 b) R/ X3 x- f6 q& ~                count_copy = buf.packet_cout;. R4 `% `* r# P6 D6 W+ ~4 _
        }: U" e# f5 O3 a4 r
        else, u* S% _! O  M; c( T* A& r! U# D: @
        {
( j4 B( u: N9 ?: r                printf("No effective message!");  D' H8 s$ b, r
        }+ B6 r) _' q( T2 Z% F5 l0 D0 ^
}
+ e9 s1 D  P) M1 a  A# X7 s5 x0 L$ D; Q- ~- P; U$ G, T
! X+ @7 W; w$ c9 \. ^9 m5 U2 \* N. W
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 E: W4 y' ^0 K/ H- F
使用下面代码,对内存使用了mmap函数后:. P% b4 s5 O3 l3 D
#include <stdio.h>
0 `  z* Z; A8 ^; A% ?#include <unistd.h>& L* _; }! c4 X7 q, B
#include <sys/mman.h>
' q& s. u7 t2 w: H4 n1 c1 Y#include <sys/types.h>, _  H! F' d6 X; o* I
#include <fcntl.h>
9 `- w+ m! t" {3 J( c( ]+ @) ?
. J6 ~5 h2 H! f7 u, R9 u' u' y6 T- z. u#define SHAER_RAM_BASE_ADDR    (0x80000000)
9 F4 p# B+ m* z#define SHAER_RAM_SIZE         (0x20000)   
& M, `: O; D# M- P
5 s1 S: q& \; M% |2 m" s& Ptypedef struct' o$ ?$ }$ A+ O2 v
{( M  T) K+ C& x# C
        unsigned int a;
& o9 ?/ O# o# u% t( }$ N+ r6 O        unsigned int b;% A8 a0 `8 W9 f- t3 g
        unsigned int packet_cout;
! y; M+ ?! B6 d+ s! h+ Q, f) v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 C9 V1 z8 N2 {8 @6 P
  @8 h: G  t5 ?' d& \. M
void read_MSG_buffer(int *baseaddr);7 L, g5 W) Z; y; E
unsigned int count_copy = 0;2 x6 ^+ O5 u4 F( Z
7 t8 ?0 O- t! o! _
int main()2 }: O. r6 w5 I' W$ \2 f" S8 B
{, G5 w; G& P- t; @' s4 g
        int fd;
6 l9 O& b# m+ u  }" k        int *mem = NULL;
2 T9 {  F* u" s) W% b
9 v9 r- {, }: p& k- ^        if((fd = open("/dev/mem", O_RDWR)) <0)
' m8 L) v4 D' W; R+ V        {
4 w8 D0 }! i* f% W                perror("open error");
! r4 t, f. p* s0 d1 X                return -1;; R  P( C& Y: l! H: P7 }+ o
        }& i. N: J8 q1 O5 V: [; v  k0 j( Q% a( U
        
# H) g& p, B' n3 ^' }) E) l        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( n1 {' m, H# i& K

8 [& y7 g1 \# x6 o" _        while(1)
" |. d1 N: S. [        {
* e; M" y1 y# s6 y7 }% }                read_MSG_buffer(mem);
( Q" `" }8 c3 Z, F1 T. Q, ~1 d# ^        }               
$ N( v( [+ @9 L/ ]$ B}* Q0 s6 W! @# z3 Q/ B
  M+ I: T6 q6 L  V5 D- J6 c- L4 _
void read_MSG_buffer(int *baseaddr)
( C7 }. R9 I$ Y$ V* j{
! m4 o7 }* p% }2 N3 p, u        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 a* ]0 b7 n. ^( `. ?4 W) }: N6 Q1 W! D: r* B$ L# {
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; V& k8 \8 e& r" L' U3 N

' Q3 P7 p5 X% G' k        if(pshreRAM->packet_cout != count_copy)3 @7 ]4 r0 E. l9 k: n) m7 U0 n
        {
: U' n5 y& d& [: S1 B" T                printf("a is %d\n", pshreRAM->a);7 ~  S8 E. H4 H( y! G8 W
                printf("b is %d\n", pshreRAM->b);( o+ i4 Q  \3 d3 U* X9 i0 F
                printf("count is %d\n", pshreRAM->packet_cout);
2 E$ I/ [; f8 d, Z5 r/ K& X2 w+ w                count_copy = pshreRAM->packet_cout;4 b& \/ O; s$ D- Q. U
        }
- r0 ?) W3 j/ k        else! l# o  g/ ~  Q5 @/ R; w
        {: S+ G1 x# U& M# R3 l7 k
                printf("No effective message!\n");
1 A- b7 C. M. }        }  E% w& d. h8 u* k
}2 G+ l0 s: x) c- Z$ y

( r4 j6 e1 M; d# V# {( Q8 |8 z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 ^; o  v& M" Z" x; X0 F
5 T8 y; I/ K6 S$ o# C7 v7 w5 S
" l$ P; C5 O6 ~" S" B) B' M8 l8 `6 X, n* L) o- N% X
# }  E) a( p( v





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