嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % U* c/ b" J# _+ H! k
& s3 e+ i! A6 {( D) E7 N) O, }
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ W, F5 u6 H3 h( t) E  S- m#include <unistd.h>% L2 q2 Z2 T8 m2 P+ K1 ]3 ]: I
#include <sys/mman.h>
( m& F; c) y8 p# j' p#include <sys/types.h>
. v3 t2 B% z. a5 ]$ B* X#include <fcntl.h>
( h+ |4 R0 S% v  J
9 M2 F& L* C; ^4 l3 l% u' a#define SHAER_RAM_BASE_ADDR    (0x80000000)   
+ R0 N8 v: I+ j
6 G7 Q2 ^% C6 q) c! xtypedef struct
3 B/ v  {  i4 p9 H0 z/ K{
9 m; ?7 Y8 |, \" ~5 k        unsigned int a;
* `1 S( N& Z; q. i8 W        unsigned int b;
2 z% A( K& ?* T, ]3 e4 Y( [- ~1 G0 V        unsigned int packet_cout;
- P* }+ \; Y- S3 m- ]}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; c) U* I/ w, c  j4 h/ {
- w- d1 i6 g6 Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);/ g' f1 U6 ?7 K: e4 E
unsigned int count_copy = 0;; P1 Q) c1 o: |

1 K! h+ q( I; u2 Z3 N: p* `( I( f
/ `8 d+ h, C0 Vint main(). J3 B) v  M% e
{
, @" S0 c/ O; q0 U7 A1 V# j6 ?; T        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ _/ H1 O8 ]+ K& M1 T3 q+ a        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ O! P' w( ~! u% \, s* w" `# u; w* z1 Z$ {; b: ^+ s& t
        while(1)* ^( V8 f- i5 A$ n( l, L
        {
4 }' L  E3 W. o1 i- A& T7 V  \                read_MSG_buffer(pshreRAM);
3 @  }; c5 n, ]        }                # Q. o5 F2 C1 \
}
' B& f3 ^1 Z$ y  ~
4 x* N3 z. z" p; wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM): n$ q5 w- d" p$ Z* n& I
{0 l9 R1 i: D& x9 A! q' U* {
        RX_MSG_PROTOCOL buf;2 X, s( `5 Y# {9 _" H
        7 N1 w9 B! v$ m6 q
        buf.a = pshreRAM->a;
2 P3 D1 t9 r' v( c  a/ q/ c! A& `        buf.b = pshreRAM->b;
8 m2 @1 l7 {. ~        buf.packet_cout = pshreRAM->packet_cout;
' h2 i$ |, o1 C/ k* {        
. g0 b8 ]  g+ x2 R' L        if(buf.packet_cout != count_copy)7 k' {1 p7 n# N$ P0 a) h, O+ K
        {
9 @4 h" j* @( r4 H1 j1 n                printf("a is %d\n", buf.a);2 i* }& m3 k# H
                printf("b is %d\n", buf.b);
. d  c% P: H2 Z8 x" n6 l                printf("count is %d\n", buf.packet_cout);
" R- q  l% ]4 k                count_copy = buf.packet_cout;" P6 i' G) p( l4 [# X0 E7 \0 M
        }1 a$ _. ^" F5 B# t& G9 H3 {2 S
        else
( \0 W. z) |7 X  k        {
9 x, G4 _! w9 p! F" d                printf("No effective message!");
8 Q4 U! r; Y/ [/ e, v( d; P7 M5 h        }
/ U: R& ]! G% f* Q}0 m3 _9 R% j# w5 s. o. r
& [. R) q( @8 @5 B( Y

: u6 X; Y8 d$ p$ x7 }但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。  _& H' H' O8 d3 _" r' i
使用下面代码,对内存使用了mmap函数后:3 L: y* [, E) N5 C0 q" P
#include <stdio.h>0 h0 L2 P& o$ K2 u( W7 {% E
#include <unistd.h>$ P8 s' S4 f, I$ G% N, D
#include <sys/mman.h>/ ^. y) E4 P2 W& v) v( h
#include <sys/types.h>3 p0 K4 S* |3 K$ t  g* O3 H. a
#include <fcntl.h>
- a% h$ z  y2 k; o3 {1 m/ ?! L
#define SHAER_RAM_BASE_ADDR    (0x80000000)
- \5 w" j& Q- T% X# b#define SHAER_RAM_SIZE         (0x20000)   
& O+ @( y5 t' D0 e# J9 H. h! a2 T1 O8 Q2 e
typedef struct0 F- T7 U4 L' S0 ~* G
{; r) t! m5 @: N- Q7 H( B
        unsigned int a;
( D3 ~+ P5 i$ w        unsigned int b;' W# Z( Y* x8 X# `
        unsigned int packet_cout;- C* G( b$ @3 [) y5 L% T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; A3 q) W+ s1 Y: Y+ K5 }) r0 {0 v' m# [3 T& k: ~; s$ d
void read_MSG_buffer(int *baseaddr);
& j0 T+ X: R; F2 R' tunsigned int count_copy = 0;
) J& E- K9 D" b* o  p) P' b" }1 ~6 J1 T* _2 k# \4 c& D
int main()% W3 U; [- a: E" P2 D3 N) L
{
$ ^. E8 S6 W) q# y' ?( \* [        int fd;
  {/ f" z. A! n' X        int *mem = NULL;  g6 o+ V$ {0 X5 C  ~
7 z5 l8 P# @% T0 |1 l# P
        if((fd = open("/dev/mem", O_RDWR)) <0)! @4 N, _6 N6 A$ d) k4 X/ {4 R
        {
0 J: k! I6 q7 m1 s; u( x4 g! \                perror("open error");
/ r5 m7 C$ [+ i, J9 X: P6 L                return -1;2 z; G/ T. Q+ e8 Q# M- `. }% d
        }
  f$ B" u, A: R        
+ J/ G8 W! }6 k1 g        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 i' Z( O% M4 e3 w
+ g8 z' g8 F/ g1 h) n; T7 x
        while(1)# [& j$ P$ S2 E8 V
        {6 a( }1 K5 z: }3 g' H
                read_MSG_buffer(mem);
9 G: g4 }0 J$ t5 O        }               
) x3 R% Z( e1 X6 ~6 ]; B' A}
7 j, |8 Y( Z8 s- A/ f8 E' j+ @7 l( U8 b5 T2 S* j
void read_MSG_buffer(int *baseaddr)( j6 C8 ^' m0 }$ S% ^' P
{7 d4 ^9 G0 H. e& [, W
        pRX_MSG_PROTOCOL pshreRAM = NULL;% H$ q' R; D! U# y5 W
7 S% g8 b  T6 j/ Q4 i
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- r+ ^7 |6 Z; t% E6 T3 ~. j

1 K$ Q  u; ^- @  w        if(pshreRAM->packet_cout != count_copy)( z* s* k0 u+ u6 X) q1 m
        {1 I8 s, W3 w0 U  F) A/ N4 a
                printf("a is %d\n", pshreRAM->a);) C. R9 W+ B+ c7 z. P& U
                printf("b is %d\n", pshreRAM->b);6 j$ ~3 B3 @( T7 l
                printf("count is %d\n", pshreRAM->packet_cout);
7 i2 d6 r5 K' t3 L' D" @                count_copy = pshreRAM->packet_cout;
7 t  X# t2 S  j        }/ C# R- }$ O0 O* c' q: {
        else! E- d% O6 y  z; Z5 J: T
        {' C$ M5 K: ]$ _! L5 b
                printf("No effective message!\n");6 h5 U  y3 X" c' \4 l  L
        }
+ N; x, z7 d. i7 q6 f" a}
. L8 d) e: i7 d! B1 W. O
% d/ J+ q! r3 `$ L, \2 I, ^没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! F4 @' c, L/ F5 t1 t% U3 e) c3 O8 D7 I* M- a

' M' P# c# P# U) w, I( u
+ U- P$ [/ h8 n2 Z1 \$ M; Z, t3 z. L  B! U- |/ Y% w





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