嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 R5 U" ^8 p: g% a/ |
0 F9 F! _- ?, z/ d; j1 T" MOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 S  t- W  |' I% n( u
#include <unistd.h>
* e& @- s$ d9 m  H+ S4 p#include <sys/mman.h>
0 E4 `' C* d+ S5 P, q9 \5 F1 W#include <sys/types.h>: V" u& a7 P% X& D* i1 R0 S
#include <fcntl.h>4 `- q" G! m( M& `

- j2 _# G/ \- o#define SHAER_RAM_BASE_ADDR    (0x80000000)   % D, _; v; Z/ F9 x
1 g( ]! v3 h0 [& r3 }
typedef struct
* m. l4 y" k# Y5 b{
- R' z7 H9 Y8 M$ ]0 O; e6 H8 n        unsigned int a;
; b8 j2 I" W& K' N. Y! S) c        unsigned int b;
, P* I1 F3 e+ C7 I        unsigned int packet_cout;
- k2 |) r9 m( B' A8 S7 }" R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. \& z# x+ ]( P8 K; J
  s; z7 A* `) u8 t& Z, }: t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& Z7 W* F  o- H6 r4 Z8 J0 j# N
unsigned int count_copy = 0;& k; J7 C/ n& `( ~
! o/ h" @% ~4 ]4 W8 y+ g

  e6 r7 x8 c8 H( [, R- _9 Eint main()  L& Z* f- O6 k: W2 s% @& h: I) I
{
3 u. u1 u0 q; |  W. R2 t- V. q        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 T/ R; J' u2 B' t: I        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ G9 X* H# [. u6 j7 ~5 ^
0 M. M  l/ S) H) e) X
        while(1)
% S& p/ Z2 E% v$ F" F/ c        {
! R# C. D% \5 b2 X8 Y7 h                read_MSG_buffer(pshreRAM);
- h! R1 F- h* r        }                * C8 [( |; U5 {  v5 \8 D
}
( S/ Y0 h# A3 x- q3 K
) A2 U$ c  q% ~2 avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
  Z( `- f: v" [0 l/ S% Z0 Y2 k{
# ]6 r3 I% [, R9 s5 R8 O; Z        RX_MSG_PROTOCOL buf;
9 u9 u8 W- }0 Y" `0 B        : `+ O1 \5 v2 A% }: z' }' Q
        buf.a = pshreRAM->a;
7 v" T( X% `* u$ r# j4 W; w, V' k        buf.b = pshreRAM->b;+ q5 Y: q2 X8 b/ A
        buf.packet_cout = pshreRAM->packet_cout;; G# [8 V  b+ a: b
        , b/ O# j8 A4 h
        if(buf.packet_cout != count_copy)8 C* B! k& O) i7 ^6 w6 D
        {
+ t$ ~/ _/ N2 B# N6 {0 {                printf("a is %d\n", buf.a);: F8 h4 @0 C1 G& G9 p$ z2 I
                printf("b is %d\n", buf.b);
9 f: P- P% O+ [$ A2 B1 G7 P                printf("count is %d\n", buf.packet_cout);- k4 r" w: |1 F# ?* T& G( a% ]9 ^
                count_copy = buf.packet_cout;6 I/ O& h: r, v
        }
# P! i9 D1 Z$ G6 h        else' s% ?8 p: v* }3 y! G& h4 i) V
        {
: X+ V5 N* a' c' u+ Y3 M                printf("No effective message!");
5 O" D2 @9 c, j- ^5 @+ r        }7 F5 `& V) S* H4 p7 O8 a- R2 O- k2 f
}
0 F9 T! [, @9 b, L% E# E3 g& z# I
& ], c9 [* T/ S! Y1 i7 i4 g3 i+ t: Z' i, Y! B
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 j( ?" v7 f" j4 s: j! f
使用下面代码,对内存使用了mmap函数后:
2 R! ?- h8 u. {% q7 m+ e9 b( N#include <stdio.h>
2 q! P% V- T- R5 R' G#include <unistd.h>8 n8 d9 \( A) o6 Z7 d
#include <sys/mman.h>
/ w% g& u8 l. S! i! w! B" i#include <sys/types.h>8 k  s% i1 A' R: s) p% `
#include <fcntl.h>
* H, N1 j- ?$ P; z
) \2 l8 d! N" Z8 B0 s#define SHAER_RAM_BASE_ADDR    (0x80000000)- P0 N1 d% X. T: h$ I9 \$ N( R
#define SHAER_RAM_SIZE         (0x20000)   
: Z  E1 U3 q# v% l+ B' L+ K9 h3 n; \5 x0 z' E& f4 }+ B
typedef struct
7 ^: s  ~/ N+ @3 q{
) d: k4 n0 H7 u1 K        unsigned int a;6 w% C6 w1 p+ f$ e: g1 G' |7 J- w
        unsigned int b;' ], V2 r" i- q; G
        unsigned int packet_cout;6 Y3 K6 D; r6 @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 ?; ]) r. n& Z$ \1 g2 ~

2 ]% G) c: I# l8 @' Dvoid read_MSG_buffer(int *baseaddr);
3 M, w# T" A5 {unsigned int count_copy = 0;0 `& I" b) x  n, o# P
7 G; G; y( Q' b2 }" Z
int main()
# V: d( t; E3 p+ @& q  q{
! U  w( X4 `3 l9 D- B& U4 |5 l        int fd;3 o* l: \$ x' O! `% O' g+ a
        int *mem = NULL;
# V( u' r! B% g. O: a9 c# B4 V' n' f( X/ W+ }
        if((fd = open("/dev/mem", O_RDWR)) <0)' G% B/ X# d9 N2 X( r+ E3 _
        {6 ^% _/ D' J, q5 W* B5 S
                perror("open error");0 P% v1 D4 z8 I
                return -1;
% T5 g, P* b: h2 t( P        }0 x1 N7 Y+ C- g8 K* r" z8 C: }' Z
        
# d& K2 q" I! d5 _! K$ K        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( X9 K9 _9 s# W
- G+ U" Q; N' S) B( I1 M/ Y0 c        while(1)
9 j/ b1 c: h3 J( l3 G# X0 B        {  ]4 i! J" z$ d2 p" o% t- D
                read_MSG_buffer(mem);
) u& S. d- o9 g  `        }               
7 o! d+ ]' H5 U( f}' e4 X' E6 t7 s5 E4 L
1 [" A7 j. K* q& S
void read_MSG_buffer(int *baseaddr). Y! p6 t' q$ E: g# Z
{: ^' Y2 m! ]( m$ v; ^5 T) Q! M
        pRX_MSG_PROTOCOL pshreRAM = NULL;
) r* _# ^# J0 c: o' U! Q, C* e. v- _: d2 F; p/ W
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# s9 r# i! G  r4 ?$ T  M

0 z$ |, P- D3 r  w+ w        if(pshreRAM->packet_cout != count_copy). y" Y; [* m; J$ w3 W& G) A/ L
        {
' S5 ]' r# K# f( b4 a6 Z. H" G9 `0 l/ z                printf("a is %d\n", pshreRAM->a);4 A6 j; G2 p9 D# \& S" d& E1 N  Z2 a
                printf("b is %d\n", pshreRAM->b);
4 ^+ o/ ^5 Z0 {                printf("count is %d\n", pshreRAM->packet_cout);, E7 M( T- H$ {: z; S, k
                count_copy = pshreRAM->packet_cout;
0 v1 ]' {+ J( Z+ V% A  R; ?+ v        }6 d& Y" Z& D7 l/ o
        else
+ }4 b# U9 U# X4 e' [  S; o* v        {, u6 C( W) x% G" Z+ D" H  F  J( x8 y
                printf("No effective message!\n");
5 R& s$ r# y' ~: r        }: t4 S4 ~2 B# r$ H$ O2 B" u
}1 H) w4 A" N& I1 [' U& w
6 l3 c" i1 C6 L& B+ f( t
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 B; [- O* V" y7 E9 G0 P, R$ ]7 x% m" M
6 Z/ G3 N1 `: `, k( E$ [$ ~: ?# n" d
+ ^) D8 m" e$ |, S7 V2 H) X
/ J+ u$ C! v: v& y+ \





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