嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' X5 S/ w) t6 ^8 k

" u$ K( R: Q" S, AOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ r  h! F/ g2 Q! y% Z# c/ Y  v#include <unistd.h>
; M2 \9 o" u4 V: \- p. m. ?; P1 L: Q#include <sys/mman.h>
2 V8 h* T0 e, m, I( E#include <sys/types.h>
0 t1 {1 |! j/ w% E1 y% g#include <fcntl.h>
5 S. C" `7 j  y% s# o* n( E5 M4 K. p$ O8 Z* y
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
4 f7 P7 u9 Q; R. u& Z/ v; ^* ^
, g/ V  B9 X' x% x" ~typedef struct6 C) z- @0 N$ E: |& @
{0 ]% X! s7 B! F8 x1 L( N
        unsigned int a;
, K& a! ^4 _5 @' F( b  K/ O( {! N        unsigned int b;6 y+ c4 W& z( Z' ]9 l2 |7 h. o
        unsigned int packet_cout;
, D0 i% X( \. b6 A* P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' l$ @; ~9 T6 _+ @& a( s- L) |/ g; W2 a( r5 P' p& O% e6 I4 {- R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. d( J3 ~; J: Dunsigned int count_copy = 0;
3 l8 {: D( _+ }8 [% s: u+ S" q; v" M; E1 Q! H
3 B8 H) R0 m4 Z1 O; E5 {
int main()
- ^4 ^$ G3 e% `( p1 h" w* q{1 G/ b% ]% O; b/ b/ |, y
        pRX_MSG_PROTOCOL pshreRAM = NULL;
  w7 p' K3 r# f0 H& \. ^        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 \8 t# v1 @- o* N# f% P( X2 m
. }$ F9 `" ~- c( Z* u
        while(1)& M3 T# P$ ]; n
        {
8 \- u* ?7 F) ~* R3 ~2 q' i. P/ @$ T                read_MSG_buffer(pshreRAM);& l5 P* n' x4 O; ?5 }4 d- P& A- g
        }               
4 [( ]  u0 x% W# U}
; {% X8 K  g9 m+ z6 |+ h! N$ c" d% O3 D: h5 S! l, J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), u4 j6 f: e2 k# J% I4 b
{
1 u0 D$ b: o4 I( K/ C4 C1 n        RX_MSG_PROTOCOL buf;
5 n) x/ B5 X: _& o        $ w% m9 N! `' m
        buf.a = pshreRAM->a;
4 b' [6 \6 ]# g& H        buf.b = pshreRAM->b;
6 q$ ]/ u  T& F- m        buf.packet_cout = pshreRAM->packet_cout;  ^" r6 ^" S3 {
        - r. M* j- b- P1 k1 M- o  |$ e% x
        if(buf.packet_cout != count_copy)
; Y. `; E) A' E0 U7 [% O! T2 a# ^- r        {# E5 y+ X( j& Y' o2 w
                printf("a is %d\n", buf.a);
- ?, l; R; V- W                printf("b is %d\n", buf.b);' {) [/ Z3 H' p9 t7 K  m
                printf("count is %d\n", buf.packet_cout);
1 t. r& d  _, j% A% ~( Z- u                count_copy = buf.packet_cout;! b& j0 K" [' N8 B; C9 L
        }& @) _9 B) K. O% B7 d% F
        else' S6 y  G& k6 b9 G! E! }7 [6 K
        {
; l* w6 K0 k  S; g- `' B                printf("No effective message!");# B5 Y" X# d- x$ |7 |
        }
* o- Y5 F, z. `6 F" x}
) w& b  g. V+ e4 ]* w' J5 l2 ?( `0 ?- {9 |

, a- I+ ?# z  I# a- ^. {7 ~$ a2 C但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 e5 B6 C6 i$ O3 Y2 @
使用下面代码,对内存使用了mmap函数后:0 K1 b8 k% s5 B
#include <stdio.h>2 Q0 @1 E/ C. X% j
#include <unistd.h>/ N+ Y: S" z. b
#include <sys/mman.h>
3 D  F; ^5 K5 p' t#include <sys/types.h>0 }: J& A) G( C$ R
#include <fcntl.h>$ m# P7 ]+ G. p1 Q! @
- o3 n4 ?- C& q! ]- c! u* h  B
#define SHAER_RAM_BASE_ADDR    (0x80000000)
: f7 K/ T: ^: P. {* ?+ z3 f#define SHAER_RAM_SIZE         (0x20000)   
) t% Y3 V6 C  X7 Z5 k( y% M" X
+ \3 p' b" X( X/ T& Qtypedef struct
" l/ R! p+ r( b2 e* B5 g{
) d1 H  `4 t! d! A4 o# d        unsigned int a;
2 e6 N4 E4 S' E% j% a        unsigned int b;
, X# r# I- H7 ]! N9 x0 D0 k1 h3 h        unsigned int packet_cout;& Z* ]6 N  M: t6 t4 ^. z3 z$ |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& b' o1 P& l4 {, l+ F( N% j) Y# a
- t: j' E9 }* A( a8 p9 r. Cvoid read_MSG_buffer(int *baseaddr);- s0 L* r8 o& t
unsigned int count_copy = 0;6 \6 E3 c) O/ @& x
7 F/ L4 i$ N4 o' M- A8 V9 z* v( w3 q& P) W
int main()+ A( Y7 g0 |4 I! f2 ]5 b; ]8 }
{6 e4 D% N* g, @$ |6 Z
        int fd;$ C- B: T$ ~' L& n4 w
        int *mem = NULL;/ ^9 Y) M$ |; x8 F
: w4 {  _8 G! j6 |2 Y) v+ v3 m% o- I
        if((fd = open("/dev/mem", O_RDWR)) <0)
; `; Z& i7 q+ @5 \8 w$ A4 Y        {" G% B$ X5 c& P$ N6 m1 l
                perror("open error");
' k4 F0 A; f5 {- @6 X2 [                return -1;! q4 u$ M4 T( a. F! d
        }3 {4 R6 f3 f: m) v/ t  h' v
        
5 M/ H% D- B6 n        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 G( M0 ~; u1 ^; P
4 X9 {" r9 n) l  Q. u        while(1)
7 X. \% l6 B$ O$ x; f        {; B4 V7 W. }" r0 r$ |& B
                read_MSG_buffer(mem);5 \  _+ y4 {7 u
        }                $ P$ f5 R% c: w' \
}) ]1 x2 S9 U( O3 _0 z  a7 p

+ Y3 m% `* }' _8 e: ~2 rvoid read_MSG_buffer(int *baseaddr)
% f. o$ d0 O8 G, R{
! X( L9 C+ v" I0 \5 [        pRX_MSG_PROTOCOL pshreRAM = NULL;9 [! N/ x; C/ |7 o
" O: a% _" z  F6 V' N' n- w
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! }$ B: L1 E2 Q. y7 b  H4 d
$ i4 N- S0 A- x
        if(pshreRAM->packet_cout != count_copy)6 ^! n" s5 O# X* E3 b  o7 g& V
        {+ Q5 |! r! k5 w1 o
                printf("a is %d\n", pshreRAM->a);
  t6 y: L" g2 E                printf("b is %d\n", pshreRAM->b);
2 s; V* B7 T; K4 H1 k                printf("count is %d\n", pshreRAM->packet_cout);- @' s+ w3 g7 r0 m
                count_copy = pshreRAM->packet_cout;3 T0 z1 K, k9 y: v3 L
        }1 S$ \% P  r, c% j8 `3 {
        else* w0 a2 x- T$ J: I$ q9 p4 `
        {- O. G& w+ B+ o
                printf("No effective message!\n");
+ `2 M* R" z8 O% i9 a) E        }
( g1 F6 q  I9 t1 e. e" E}' y$ k- e6 b) I4 V" E
( [: E1 ^) s8 @3 K3 N
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& X8 |0 ~2 x& ^  M  R5 G

* X0 W9 V- i+ ~0 T6 L% O
, c' o# h1 E( _, Z% f3 P
8 |: {% b0 Y9 P: Z4 P
. o' [% q. s; n/ V- S




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