嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 {' z& s9 J; t1 ~$ b/ b: B6 l( }6 F. C4 D  Q. F( l& o- r& t
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 {1 I5 G7 s5 w/ d" \$ g7 m#include <unistd.h>: i. T8 E3 J. U$ S  S
#include <sys/mman.h>
  u5 T+ Z' U! O3 S. s#include <sys/types.h>
0 N% }! U2 w" s+ J7 F0 q  N#include <fcntl.h>6 ?: A, T; M& i) H1 N. O  ?

' E( L6 c  q& V#define SHAER_RAM_BASE_ADDR    (0x80000000)   
! X8 o0 h/ A# f2 @* g' T! |* Y( r$ v6 A
typedef struct
! c; M4 Y8 J/ S+ M; j3 K, R! z8 M* H{
3 b1 q- L4 p9 C0 d9 U        unsigned int a;9 M8 S, P' X& w
        unsigned int b;
) m% {/ e* K) A, W        unsigned int packet_cout;
# d6 [3 `% j0 C7 l8 T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 V: @* l8 R* Y! x6 M7 E  z( `' }5 C3 b1 c  U8 \0 p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# V* u) _  Z9 S8 P/ A" B( sunsigned int count_copy = 0;
" t7 Y& b  R8 Y3 t( k; R  q) I" M) t: W8 c# R

; S8 W$ m" m1 N5 X+ Uint main()
% k" \9 Z# O/ I7 F" y{1 A/ m. J6 K' q
        pRX_MSG_PROTOCOL pshreRAM = NULL;  @; x4 _7 }$ c+ A+ N% h8 P
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 i0 E9 i$ ?* O3 J, m3 O) T: `9 t
* ?0 W. d1 p) D8 ?  q3 G# Z! f
        while(1)% M% z: T& h! S: {! y
        {
, c9 {2 e3 M) i                read_MSG_buffer(pshreRAM);( g- b  Y; I% s2 A/ T* K
        }                ! c( a5 X  a/ Z  q  J, R4 l1 x
}, ]  ]. ]! Z" r6 {3 H
; x' C9 e. p, E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) @# x- h/ x, K: O{
: Z9 p4 a. I6 j; t5 B        RX_MSG_PROTOCOL buf;
$ {9 ?: [0 g6 {( }& p        
" C6 W4 s7 z/ J# @0 [3 {+ _7 r        buf.a = pshreRAM->a;
4 [# R3 H4 e& S% D        buf.b = pshreRAM->b;3 o9 f6 ]' l2 E5 d# L% c/ y
        buf.packet_cout = pshreRAM->packet_cout;# |( H# M  }; \- F( Z
        
+ Y) ]) I1 Z* V! K9 Q( F% O        if(buf.packet_cout != count_copy)
3 e+ x. l  c5 e        {  R, A+ x6 q9 S- K" K+ W6 `/ N
                printf("a is %d\n", buf.a);3 `+ S4 Z% N# M; d6 H' k: L
                printf("b is %d\n", buf.b);4 f8 t7 I( H# f) N- q; |4 o1 w/ L$ J
                printf("count is %d\n", buf.packet_cout);
! _3 r/ h; }  b! Z                count_copy = buf.packet_cout;. a4 a7 o, M+ Z, k* g
        }
* E$ l1 M' e! x9 K        else0 C) X6 z, J0 ^
        {
: J+ ]. A' F' q! j3 c' ?+ n* U                printf("No effective message!");
! S+ [% e- G' L/ Z% \9 a" G8 N& O        }" g* y4 ~, q" x( x8 P3 P( w& E8 `
}  p/ v4 y( O, q5 N9 Z9 O$ r
# ?& a) e: _# m; O

  C3 m" k4 w2 k但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ M! D2 N3 R4 X0 T4 t使用下面代码,对内存使用了mmap函数后:
9 x: E. z: ~6 Y5 c' ^+ T- T#include <stdio.h># E" d8 r3 w4 S" R2 v6 r& k7 j
#include <unistd.h>
$ ^* v/ A, M: e, {#include <sys/mman.h>$ ]! |! g7 r2 q. O0 q* o5 I& D
#include <sys/types.h>
, L6 }2 J' q, m; [#include <fcntl.h>& G4 p+ f2 j9 O5 ?) p& h4 e5 y
, Z$ l# d& D# L# d3 o  @" V# C. M6 @' ]
#define SHAER_RAM_BASE_ADDR    (0x80000000)" C9 f& r9 N- V
#define SHAER_RAM_SIZE         (0x20000)   8 v( d8 O2 C  j* u  f2 c8 ~

: l) E6 c* l, wtypedef struct
7 b, C) S8 n9 H. q; U/ B{
$ I& w* f1 f  b; s! {        unsigned int a;
2 y: Q' E9 L5 R        unsigned int b;
$ [' I3 x5 A: k5 s1 b        unsigned int packet_cout;
8 {4 u3 B7 f3 J% {, n2 D3 q: I8 d}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. u( H) j1 s0 w" t2 @, ?

7 K  _7 W3 K" p. k* svoid read_MSG_buffer(int *baseaddr);
3 Z" k- m& H4 d( [: C8 Z# Munsigned int count_copy = 0;6 J4 h7 R* w' |0 O+ B6 ?) X; G+ c
" I. w7 \2 S* l9 l' h
int main()0 J2 t6 Q# ~4 i; D# W
{
$ W$ W- q# ^1 r( D2 g, c/ x        int fd;
- l" O5 I$ q- x  o        int *mem = NULL;4 ], l9 l$ j% M" E7 _( L: \4 F
5 _: f9 K% w8 ], h! T
        if((fd = open("/dev/mem", O_RDWR)) <0)" P5 r5 a* u% V9 ~" m
        {
# X: Q# R- }" @! U7 G                perror("open error");2 A' K+ u4 P0 e3 Z3 [
                return -1;. Q6 l: m9 [* k$ e) w# X
        }
& ?. s! a2 G# H  o1 `; n        0 r& n9 x( t+ F( Z% l
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; B7 J, n% a. o# c* q2 ^8 p! O

, e) \$ t* d7 h; U        while(1), Y. X* V2 `6 }
        {
: n1 f# I! V% |- Q' N1 s                read_MSG_buffer(mem);
2 N5 c1 x, p. C  q2 Y* E        }               
% \) x1 F* n1 h- m8 k# @3 n}
2 d3 R- h& ?+ [  [* O$ @1 ?; |/ m" E
: b6 f# w& v# m. d6 X3 ]void read_MSG_buffer(int *baseaddr)4 ~! b: E1 e- Z& p" t; c
{  G) D: q1 ^! x+ R6 L. U
        pRX_MSG_PROTOCOL pshreRAM = NULL;1 r3 h7 \7 B/ j( C

7 r% _) t2 g' A/ k        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 x5 X9 I& t2 r* A0 Y$ K1 p, b7 C. U6 ]. H
        if(pshreRAM->packet_cout != count_copy)
. [4 ?/ W6 [4 r; {2 k, p$ x        {! }- X. n0 x3 @9 _8 F
                printf("a is %d\n", pshreRAM->a);
) D8 M* t8 i- B* A+ R5 r                printf("b is %d\n", pshreRAM->b);
% q! [  @7 _5 U8 i8 e5 Q                printf("count is %d\n", pshreRAM->packet_cout);  R  A# v/ E* v0 `# s+ k6 Y
                count_copy = pshreRAM->packet_cout;
: L. m3 V) h, m) s) I! u5 f# ?        }
2 m& o1 [& G. i" P1 A* {        else7 f2 z& J: U: I0 E5 r
        {
, @- V/ j; \. m, f4 @                printf("No effective message!\n");& o! s# W4 S) F+ V) H. d
        }" D8 D  p6 W7 h/ j" J; Z
}% _$ r9 E- ^: X; w6 S8 C

, i" A+ G- C- h7 {" }/ w  \  ^6 ~没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( s0 ^" s6 ^9 ]3 ^, e
' L' Q" L; {  D( n

0 M# i0 m8 d' {. r4 k% K7 o1 M4 K" ^) x" F$ a, o7 \: S
& V' U$ |" g) E' a# D" b( A2 F. R





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