嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % G& O. o4 V9 t$ {6 I5 H
. }8 N4 @2 `5 P* U; g7 W" x
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% \: O" w1 v/ g( C6 U
#include <unistd.h>
9 M4 u8 t1 l# s+ y3 e2 i#include <sys/mman.h>
/ Q1 P* X0 |, c: u#include <sys/types.h>; m  m4 N' G( O0 {; n8 {1 k
#include <fcntl.h>& P9 `) o4 q: ~( c0 X

' s) d) }1 ^3 F1 C7 H- x#define SHAER_RAM_BASE_ADDR    (0x80000000)   
1 V" h" _- V/ w5 @  ]* ?2 M) R
& ^; T' S# }* A' R" ]% ]  B) ^typedef struct
/ Z  p7 H6 |/ ?: U8 a) X' u{' ~- R' R0 K6 P4 q2 e
        unsigned int a;: G8 {$ j8 x9 Z+ k4 ]! w$ |
        unsigned int b;/ z4 v/ M, T3 X: g% R
        unsigned int packet_cout;! U% D- K' m: H! r7 Z1 [$ T- r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ p, E1 |0 N+ ?; a5 F+ A" L; g4 U$ N/ R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& v* t! C7 Y9 e  G2 j
unsigned int count_copy = 0;: B- I3 c7 n+ Y- R$ Q/ o

6 C8 C1 U  F2 u' ^, k) {- _: |9 V% a" C! y3 `
int main()( n2 |1 A5 S/ x* A' x- b4 E) f
{0 s& z3 J, }* w2 S, _+ S- z
        pRX_MSG_PROTOCOL pshreRAM = NULL;
  q% w& |8 ^) F        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% E5 q  i$ K; n; c1 l1 R
* X+ N7 L$ M0 ]& ~
        while(1)
: W% b% w; K3 l+ \) Q        {
0 V! V) {, C  j0 Q                read_MSG_buffer(pshreRAM);
( d& P2 G+ s8 h1 [9 R        }                4 a. o3 c6 i# ]4 P4 j5 J/ {
}2 M7 J$ ]( F' c% u  Q

' W$ b* J' f  gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 c  v1 B- k8 j  U# }
{9 s3 B0 k7 K# o: B1 C
        RX_MSG_PROTOCOL buf;) V1 w, o$ B8 g& X
        
( {4 I* W4 o2 S$ [* j& z6 ]        buf.a = pshreRAM->a;: W; `: ^# X# P6 u
        buf.b = pshreRAM->b;
9 P2 E: I6 o, K- l0 ?        buf.packet_cout = pshreRAM->packet_cout;9 a. ?8 \8 V- k! l# R
        * `: M; I  I4 {$ f! x: |* |' \
        if(buf.packet_cout != count_copy)% x& Z6 M8 W# H! u" R4 A! f( t
        {
& r0 Z& v3 c9 B* U- F( m+ H                printf("a is %d\n", buf.a);( V8 T1 w% |9 U- M3 a; Z! h3 Y, J: O
                printf("b is %d\n", buf.b);$ T4 A4 k- M! U2 Q0 U
                printf("count is %d\n", buf.packet_cout);
# x0 v8 E- Q7 R- s                count_copy = buf.packet_cout;& Y' V) A% u* C2 M% ^& m
        }$ J. w3 q" r& O  |3 R1 n# [3 h: v
        else7 \; l, Z' G9 e5 o4 H/ b7 C
        {
! N7 z# ~1 D7 ^7 M5 J                printf("No effective message!");& N* x* w, U$ F  r' c% H# `* {
        }
1 t; O5 i5 H$ _: {2 h7 y! q}
% N6 q3 a: n! V2 r$ R9 [& ^' ]! i& _! ~" r

9 t' u) E- u# U. ]: i- {但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 F& x3 ^, V, o  i( V+ Q
使用下面代码,对内存使用了mmap函数后:
: C# s# z& k7 [5 n2 h- S8 }( m4 z#include <stdio.h>
" |6 {: l1 T* s2 ~" d2 v0 E+ C#include <unistd.h>
1 A% x/ e& H% U#include <sys/mman.h>) ^3 E) p9 K7 Z- `% e
#include <sys/types.h>
* @; S' Q, T8 N" R2 J8 d# t#include <fcntl.h>
9 N& }, A: z  N0 \2 g. @$ N4 Y7 f3 b" w
#define SHAER_RAM_BASE_ADDR    (0x80000000)
; T6 t9 \) Q& w; i8 _8 X#define SHAER_RAM_SIZE         (0x20000)   % c6 i; g8 l; z* X4 f% }+ K

& R, S) y6 |. T. i. b( N9 ktypedef struct
8 c. ?, t9 c7 {7 J. {! E! D' \- k{0 L: A6 b5 }; N6 T9 i' `
        unsigned int a;
! z5 f# A  M5 R$ v, q6 ~* o        unsigned int b;# [$ e& q* @6 F( l3 k. W/ r( J
        unsigned int packet_cout;/ R( A* U0 @$ U8 J- n$ m! Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 S$ n! D4 {- Y0 B/ S+ X9 F' s. r

  H1 u* X- p8 N8 ]void read_MSG_buffer(int *baseaddr);
5 c. K% }9 z3 {( ]unsigned int count_copy = 0;8 n2 k2 m" x: }3 \3 T- z

( C2 l4 [) Q8 H$ xint main()
" W: q: |, E) H+ M& K{2 O$ ?$ k3 ^5 n6 k& j
        int fd;+ D7 f7 j( w5 g+ _
        int *mem = NULL;- z, D$ G7 y( ^3 z: K; T5 F& C
- i8 \) G2 i) q, M6 B, s
        if((fd = open("/dev/mem", O_RDWR)) <0)6 F# a) Z9 l+ r" ?* F8 ^
        {
) g! ]4 Y1 T1 ?8 K: V/ Z$ H                perror("open error");
2 W; x. C' `0 \+ a+ {% ^                return -1;
; e. D! s) G. D* o6 L# c: x        }0 ^" I$ @% L; }* m% g
        , _4 V) o# r. j9 y# c( R. Q
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);7 t8 E5 P9 X- o" A

( @5 @/ `0 m2 Y$ f: C$ u. R# [0 n, y        while(1)
. s4 P7 G: n7 Q; _5 i; @% E: f        {5 C. x2 l1 n1 P' z* k$ ?
                read_MSG_buffer(mem);% z& V, L9 K! t
        }               
, K5 K: h3 ]3 G+ e6 F; Z# D0 T}
+ I: {7 L0 E0 Q1 z, v
. [3 `7 P# B* F# U) Qvoid read_MSG_buffer(int *baseaddr)
# M- M* l; q. p  K" f" X) t{
. C4 z% U5 W- T1 s& s3 n3 \9 w# [        pRX_MSG_PROTOCOL pshreRAM = NULL;
. i! ^0 G; ]5 n$ i; \6 S
* P) ]- B; d9 o4 k        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; l) M+ d: T: d6 {! r" p# t& A3 v/ F3 u
        if(pshreRAM->packet_cout != count_copy)6 B- Q1 k- k, l
        {
( e7 j8 A# }* n" q0 ^                printf("a is %d\n", pshreRAM->a);
9 R9 P& Z- T( k1 C4 O4 o% p# ~                printf("b is %d\n", pshreRAM->b);# h- `) {+ \8 \% F: l
                printf("count is %d\n", pshreRAM->packet_cout);4 n1 g; t& w% `1 V; G
                count_copy = pshreRAM->packet_cout;6 {, N1 b+ x0 B* u  s8 O/ J) w( K
        }
1 g+ [! u1 e+ i8 V        else/ T4 F. d+ g. D9 Q
        {1 i' J7 e3 l+ Q
                printf("No effective message!\n");1 F9 J1 M$ f' @  c3 `) N
        }
! y/ A* W. V" ?# o$ q}! ?* ^8 B6 u: V, Y8 _/ ^0 b
: d# d: T1 M* W6 i/ Z: Q% m$ J
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; K1 C( ^; l- D, ~

- Z' F6 L/ P. o. D2 q! |" z' A, F" V/ T+ @
" @  j: x  G5 }+ e( h) L
+ ]5 t0 I4 T1 @4 q8 C9 a





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