嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 Y! Q; n* H3 f: X! Z5 {, N

* I, @) _. a  }4 S4 G7 c& O0 ~* XOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% t' e$ N4 U* n: L% H, t; r#include <unistd.h>. l9 U/ B8 S$ X
#include <sys/mman.h>
2 ?  v: ]. h/ @2 c#include <sys/types.h>( x% b+ a; ?0 O
#include <fcntl.h>1 y" \, J0 m3 Z' r0 j2 s
6 }2 s9 b  t* ?7 p: @2 B) e
#define SHAER_RAM_BASE_ADDR    (0x80000000)   $ y4 Z3 _+ y2 I9 T8 M/ H) n
, A8 o8 |3 b/ x% [* L
typedef struct' D5 ^) o  c1 M+ v9 q
{/ K( ^! M& U. b7 y/ W/ |
        unsigned int a;
, j4 l" f2 p/ F! F9 f        unsigned int b;
$ E% S) P& c9 V) \        unsigned int packet_cout;
7 Q6 h6 N6 i" ~4 p1 N# i4 R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 a; G& u- S& t* Y; P. O9 b  k$ u9 l& x1 {' \3 p3 ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ m- G( I9 |8 ~8 Q3 Junsigned int count_copy = 0;
; Z. a9 V' i1 v7 [2 Q8 P
5 @' o6 ~: B  o% l
8 ?0 _3 t: k% I. J/ ]- Mint main()5 w! P, w- a1 V4 `
{& Q1 q% x  o8 K6 ^- g
        pRX_MSG_PROTOCOL pshreRAM = NULL;4 q1 B( i( P0 `+ V
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: I8 V  B# ?- t8 Y3 R; I
6 U: y0 T% `8 l+ N' H+ }        while(1)7 ~6 Q' E- Y2 J) F" S( L; t# g. m: C4 o
        {  z. b: E9 |6 t# E3 q/ z& f; t  Q
                read_MSG_buffer(pshreRAM);
  p6 O) k. f( v( a* z        }                , F6 [. s) C6 A, l
}+ u  H$ |' V- J1 w" f, ~
; V  k( y3 z4 ]) c8 I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% W$ S( n. V1 F2 i5 h" X: p( E, C, x
{3 V0 {- x7 O* O; r2 E# E
        RX_MSG_PROTOCOL buf;
, T# k( S; R: \+ @; y! K        
! N! n2 e- T( T) Q        buf.a = pshreRAM->a;
# v( V3 l: x0 G1 R7 ]' K5 W% L        buf.b = pshreRAM->b;, w! W9 }& Y  |2 b! L* f) _/ R
        buf.packet_cout = pshreRAM->packet_cout;0 T7 a( s4 X0 `: v- B# ]& w
        1 j, E* m) o+ v
        if(buf.packet_cout != count_copy): ?1 ]. ]3 A5 T& M5 J* Y
        {' i9 @' c3 n* |- e+ S5 ], v1 B0 ~" ]  @
                printf("a is %d\n", buf.a);4 \  g* M2 K, P& m3 l$ ?& a$ I/ R
                printf("b is %d\n", buf.b);
1 U' f5 u/ s) P# i                printf("count is %d\n", buf.packet_cout);
' o& c0 ?& ]% e+ b                count_copy = buf.packet_cout;4 ?9 m3 ^& k  d/ W: P
        }# T8 |$ r" q* o7 w8 A
        else
7 t" n+ @) w& J6 s* q        {+ Q! [" W, D% a/ s7 U
                printf("No effective message!");
- h. A; a8 X  a8 t( t6 m        }0 i# B9 u) N( S+ t' O5 Z. k
}
2 z* }; Q$ V7 d4 T5 e5 k# T; o' Y) Q/ y' k8 T* ?# F  f$ x
# S$ g/ ]( q* X( U# ?% I
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 n* n7 ?' T8 e  [* ^使用下面代码,对内存使用了mmap函数后:
6 W/ Q! h2 G# s8 b3 S: t4 [#include <stdio.h>* f+ \( E  c  z# o1 @8 L
#include <unistd.h>" `5 l1 `7 W7 x
#include <sys/mman.h>
) _: A& h7 [5 e#include <sys/types.h>$ o. U2 ?; {7 O: s1 N9 A! o- F7 \
#include <fcntl.h>5 d% u  d3 r6 P) \) w9 C
; k( _+ E9 J9 Z  E
#define SHAER_RAM_BASE_ADDR    (0x80000000)
, E9 B/ U. j2 U8 `#define SHAER_RAM_SIZE         (0x20000)   
* t" Z0 k/ L0 Q) K& _- o( g( @8 @& }/ Y- X
typedef struct6 K' F# n: w9 R- f: W( W2 l8 i
{2 J4 z8 X$ W" ~8 @8 K) G$ O+ b
        unsigned int a;
; n1 e; z7 {3 C$ L( ?- I        unsigned int b;
! x4 j- N0 u2 J' U9 ~  E$ o0 H        unsigned int packet_cout;
+ s3 u0 s5 }' j" V5 ]9 W  G}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 S% _2 r! P+ o/ W- i
- Q) c  l/ ^. |8 @- ?% ~7 h' S9 {7 v
void read_MSG_buffer(int *baseaddr);3 P2 c- L. s# p6 f; J
unsigned int count_copy = 0;
; R/ ]6 i: i% i1 @* f' w; G5 I7 ]
9 Q8 E2 ?* V) ]: g# vint main()/ K" x8 a& C0 @7 p; B, }) k2 K
{7 ]* }2 k, W5 D0 L8 [9 \" z0 c
        int fd;3 k, x, Q  M$ k4 [2 ~
        int *mem = NULL;
+ g0 B- O* N/ p$ i! o: I& x2 B, I+ b1 z, }3 Y$ M
        if((fd = open("/dev/mem", O_RDWR)) <0)
$ ]6 M& H, W. L  m        {
- H( h2 L: D  B  u4 t7 D                perror("open error");1 n9 c/ B5 |) l8 ]' d) Y9 U
                return -1;
6 ^' C+ |4 e% e1 U6 F        }9 C% [6 ~4 |# P& R6 @+ |8 N8 b6 d
        ; r$ g2 O5 W' q$ W/ N* Y7 u' G$ A
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 ^9 e- {/ E' Z: Q
! K0 ]* ^  {4 b4 x        while(1)8 O& v$ A  {  G# y+ H( @
        {* {& N# B0 Z; S( I0 j
                read_MSG_buffer(mem);% z9 W  s: t6 ~# \5 Q
        }                2 y) M. S5 J6 K
}9 u7 c* X# x# c

; u" g! i; d4 n2 ^+ s6 p+ u0 o: vvoid read_MSG_buffer(int *baseaddr)9 T; K$ B& _7 k% G! k$ N
{9 B, Q' T3 n6 C
        pRX_MSG_PROTOCOL pshreRAM = NULL;) V2 p0 b% g+ S. j7 f
  ~. R* s( _0 b, p" L
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, R8 @$ k  w- n& r
- H, J( H( Q8 P1 F5 P! P' J! X! K        if(pshreRAM->packet_cout != count_copy)
7 a+ s3 ~0 ?' Q. ^        {
8 b: K+ V" ^- X                printf("a is %d\n", pshreRAM->a);
5 t/ R( j7 ^9 `7 a/ N                printf("b is %d\n", pshreRAM->b);
* p4 W1 I2 d6 C! i                printf("count is %d\n", pshreRAM->packet_cout);: B: s9 z$ x7 J( ]+ @( v! o
                count_copy = pshreRAM->packet_cout;
7 m; T, p9 I6 [; N$ H" O7 d        }
! s, Y4 [8 o7 o: U& _( P        else6 h* h; `' R, \
        {( a! w9 A1 K8 z1 `$ N1 i
                printf("No effective message!\n");9 n9 h; V/ B; U
        }
; v( K( X5 F( @  I}8 o2 E, P! Z. s! i! z8 i

  \; e1 @2 t" ?* l! J; e没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 d9 K* @7 {3 F2 \7 |) _

& }9 S9 A1 l# ^# ]. v6 \: t+ w8 [  R6 b7 X5 R' v, n

. o$ V) }1 ]' H4 G. G9 |8 s! ]& K$ w- Q0 a. a7 c( [3 k$ F





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