嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 t  X% y: |7 G; I) z9 R4 H/ I. a
1 \) k' Z8 }6 }) WOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( I; e1 O: P+ h0 A1 n/ W) v- l$ D#include <unistd.h>
) O6 L+ @, S4 C1 W0 Y% S#include <sys/mman.h>. X0 c, \4 W& D+ X0 }
#include <sys/types.h>
/ ^" i8 s1 M# G$ |( H#include <fcntl.h>
! d% q) k& c4 p1 O
# o$ e2 @: u4 @( T. ~& [6 l#define SHAER_RAM_BASE_ADDR    (0x80000000)   
# [7 H  a, h( b! q: s5 J  y% E8 `9 ~8 s& }9 A  R0 t$ ?/ G: P
typedef struct- U: s% X; c) _" A
{+ B9 ^' C6 I4 M( ]$ V( ^( ~
        unsigned int a;6 {3 T- B3 H* T- [4 p; o) t7 C
        unsigned int b;0 u& h2 D  J9 P2 @. X
        unsigned int packet_cout;
2 t2 y7 Q% ?# l3 l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  R/ A- r9 e$ J6 s2 Z3 h* a
8 d" L, ^+ O+ avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 w# J( ?4 m4 j6 Y* @! J- ~3 z
unsigned int count_copy = 0;- N  {5 l2 n' o; i: p

7 J# `7 |$ y# b
3 L# _4 B2 l% `* _8 y- d& ]int main()
# |) s  I2 l1 z{
6 O6 b4 f- k! d$ u9 ~$ S) R        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 J- P+ P8 @* _& ~        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 O/ |6 |. d  E0 I

( n  n6 u2 w9 g+ E  {) R        while(1)3 ~! q9 [* o& |- a' r
        {4 L9 l; ?9 x2 u
                read_MSG_buffer(pshreRAM);
3 K6 l5 w! K/ R3 Q/ T& }        }               
+ ]4 ^. I2 {+ F% p% r" f0 i}3 k6 f7 k( j* ]; b+ d

- i  [7 `2 {& O( Y2 g3 @! bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# |/ Q! T; U8 J2 r% R3 W8 Y5 m{1 {7 F; ~7 c# N. U+ E% f' y
        RX_MSG_PROTOCOL buf;: ~- V& ~' l; v- ~" i
        ( M, N% Q( w$ p2 g
        buf.a = pshreRAM->a;8 M* x4 \8 Z1 e8 u  P5 q. L- c
        buf.b = pshreRAM->b;5 Y1 L; y6 W; |: P! I; C' k# Z" Y
        buf.packet_cout = pshreRAM->packet_cout;5 @% x6 v( n! S4 c* x
        , [5 H/ ?& x3 k0 P) C8 `+ [
        if(buf.packet_cout != count_copy)& z% t- O! x- b4 {
        {% u7 w. ~; g$ I3 K! w( H
                printf("a is %d\n", buf.a);
# q) z1 \4 ?- a% O$ ?                printf("b is %d\n", buf.b);3 Q( Q8 ]  y6 N
                printf("count is %d\n", buf.packet_cout);4 t0 n* c( @4 v+ |3 y
                count_copy = buf.packet_cout;5 L! U3 d4 f" Q7 H. Q0 J
        }8 B6 _% g: o* ?: ^2 J" M2 L
        else# s8 S, r+ c3 y0 l! p7 @( c
        {5 K. D( W! u/ l& T/ Q6 P
                printf("No effective message!");8 S" E, j) \5 j% b) }
        }3 c% @' @# x; C" C
}# o- O* f  T- }. _
- d5 [: \4 J3 E% K
: t- D& u" k7 M- I" v6 P$ w6 H8 |
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# W% q( `) O: u( a$ x' v; L
使用下面代码,对内存使用了mmap函数后:
" u$ x% @$ P  a' t* p( t#include <stdio.h>
& u* b7 n4 E: M2 u! v* v#include <unistd.h>
+ x4 D. p0 x" F* }. F0 V. I#include <sys/mman.h>
5 o4 X4 G2 v3 Y+ l+ m7 S#include <sys/types.h>) X) b0 A# g$ J! [, L' B% z; u+ Z
#include <fcntl.h>
# T& s  f$ u) i; l; l$ e: ]: T* x5 r& k
#define SHAER_RAM_BASE_ADDR    (0x80000000)* a( _7 w9 q2 h9 n# i! e3 u6 G
#define SHAER_RAM_SIZE         (0x20000)   0 L  H5 q: B' D- A& Q& \
% B5 ~* A; a1 Q" Y
typedef struct  \9 @/ j# x1 ~4 b7 @( G! f6 m5 B
{
% z5 o' i, w. t& L2 {* X        unsigned int a;) T. \/ i6 E3 l* T
        unsigned int b;7 f# }& n# r5 B! _3 H% Z
        unsigned int packet_cout;
- Z7 k5 r8 q) ^, D4 ~}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 v) P( F" K7 D7 P# a
: C6 v8 X+ Z8 U% ^void read_MSG_buffer(int *baseaddr);2 l$ w. `& M" I- A) I
unsigned int count_copy = 0;
2 {; Q, N: q8 r8 n: X2 z4 h4 J* y1 X# C7 a3 E; S8 T6 v
int main()
- v& \7 r* ^# M{' i& p. y2 {, j) D
        int fd;1 s! C: F" y  y5 j" P0 Q/ O4 R( r
        int *mem = NULL;
" L  H  L7 T/ e: j8 P. R
1 L+ y+ J) a! S; w        if((fd = open("/dev/mem", O_RDWR)) <0)6 O' m7 F8 i6 @$ c0 H- R" j; b
        {9 r7 N* `3 M% A3 }( x0 g
                perror("open error");
- q5 t! H0 |6 W; B                return -1;
; L+ Z1 C6 @9 z. n        }! g* X# D" J. @2 V1 ~# |8 a# ~
        
- S! ]$ M+ y' P        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; p8 Z" D2 H) h, J$ j6 ?

8 R' C5 L& ^/ w+ _& y: |6 V        while(1)
) f" ?- l6 S: ?  C- Q; s5 J( k        {8 S6 H: C' g3 O  b
                read_MSG_buffer(mem);
- i) G. m2 R; }( }* C        }               
! w' ^; W. l2 m}. L( F; ?+ K6 k" Z; l5 b2 n

7 ^$ _  ~: p0 {2 `* P# tvoid read_MSG_buffer(int *baseaddr)1 C3 k4 g" p  U- i6 L+ |
{) z4 U3 l+ D8 E7 I1 ^
        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 t- C5 U0 m' v( |# y7 n7 u9 }
; E9 w- @' O, W        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 u3 T2 Z. k' Y9 @) \1 m( |4 |% f, _- [" M, z/ u
        if(pshreRAM->packet_cout != count_copy)% |; l" f' u) O7 l  l$ |) h
        {4 j9 h& [3 X. B: u& o, f7 X
                printf("a is %d\n", pshreRAM->a);
: t! ]* V, ~0 }, Q! I                printf("b is %d\n", pshreRAM->b);' T- P" y- H( v9 N" q# A3 X
                printf("count is %d\n", pshreRAM->packet_cout);! I! d" N8 G- \) }$ o0 V5 `
                count_copy = pshreRAM->packet_cout;; T# n$ D5 |) ?2 o! n: |
        }, @2 T2 }) e; `9 x* B( N8 q' p
        else/ I$ ^( r2 g: v0 l: A8 c% L- C" J
        {  z7 c+ }# e8 W9 n9 ?
                printf("No effective message!\n");1 G6 z+ A* b# J9 l8 _( [
        }4 `- r; G; Z+ s: z
}3 Y# i/ u- k% a5 k0 Y

7 \& O+ X2 J' ]3 [* G1 I没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ F* Q& ~7 D8 _% n. M

8 E9 \& J$ P  Y) v# E
  |  D1 p" F2 d& ~6 \; j4 ]3 A; V% ^' r$ _  A/ m  `

0 R8 H& S" P; g! t




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