嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 E2 `3 Q: `* @7 ]* q$ Q) n2 w# D
* f$ L# u$ ?) v( V; g, ]
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 c3 X- f& B  V8 b7 r
#include <unistd.h>. ]/ r5 P; C) s" o$ r" t2 @2 A
#include <sys/mman.h>
1 j% c" a1 c7 V% m9 D#include <sys/types.h># J9 i/ w5 A: o3 U& K
#include <fcntl.h>
# c- i. _8 g- W  p: A  w# m
7 X  u; s! s, l& M" N#define SHAER_RAM_BASE_ADDR    (0x80000000)   ) A. a/ W' Y$ V* Y
% D4 {' m$ I3 J1 S9 M3 ?
typedef struct* O3 ?# O0 o. D  |
{
' B0 G6 x2 u! g  D. d        unsigned int a;
3 w& i; u0 U2 B" _# W        unsigned int b;% q8 Z9 p( w! ?8 S
        unsigned int packet_cout;, _$ ^4 F8 t2 c+ l- ^  B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" Y& h- i4 G  j. O7 b/ n1 B/ r
0 d! x% f" s5 M* ], S+ Yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 o- v+ L0 @. N4 b) M
unsigned int count_copy = 0;: ~" I' ]6 B1 c$ M

5 X, n7 ^0 ]4 A  ?% F6 R4 D+ Z, O7 r7 L% H5 B! x) p  d
int main()
! {  y  I) H1 b9 }9 z{
" {  f$ Y; s1 W/ r        pRX_MSG_PROTOCOL pshreRAM = NULL;/ p  |  D. c' v$ X& H' a
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 E( t7 Z* A( F: Z& z, L6 O6 W- y7 y6 @& F+ v' M
        while(1)
0 R  t' K- m: y( b; O        {
! j% |* Q9 V8 t# r                read_MSG_buffer(pshreRAM);+ B/ Y/ _/ _6 {" c1 k) d
        }                4 |1 I+ `1 O( Y% S, ^, m
}
- K: \  _3 R6 O+ e1 x6 J1 u' V& q* F* L5 u6 }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM): u, l2 G/ }' _" ~: I
{
, }# e5 N$ S* j( d( k        RX_MSG_PROTOCOL buf;* ^' [* `! {( L0 t0 x" Z5 ~, N2 b
        
( e7 f) B) {) [' V8 g6 w        buf.a = pshreRAM->a;7 I* x! p& ]6 L$ ]1 Y4 ]
        buf.b = pshreRAM->b;) n; n0 u5 B  B; \, G( y8 y7 K9 d
        buf.packet_cout = pshreRAM->packet_cout;
) o# X  C, M+ c  X& I5 T1 j" C        ! K" z" q1 }, {- V# G, b; d
        if(buf.packet_cout != count_copy)8 |& X+ V# l9 }# z/ X+ i
        {2 M  k2 j7 g8 R1 V
                printf("a is %d\n", buf.a);
" S3 c$ K% |+ l                printf("b is %d\n", buf.b);
) ~- n/ C- u- `% X% O                printf("count is %d\n", buf.packet_cout);
9 g9 {4 J! ]9 {' r  ]) J                count_copy = buf.packet_cout;
& t3 B) o/ _8 |( P' g8 _3 l. q        }2 b" a! p- Z: I9 O% @* X/ W; e
        else
% L' A1 `& d9 I6 U+ u  p        {; A3 ~! P" w; I6 {7 o
                printf("No effective message!");; H5 a; |# ^* l* T$ `
        }; ?; G9 l: q6 n  |+ O, Z
}
3 W2 f' \6 u7 y, I5 [. y  m5 o
; C% q+ E% ~( s
; H! o& Z# K  |+ c: @# C2 P但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) V! a7 K7 G  g/ ?$ H- G使用下面代码,对内存使用了mmap函数后:0 y' u' K! {- Q) t; v
#include <stdio.h>
9 r. y% q! f2 `6 a) q5 v#include <unistd.h>6 e& o6 u7 M* R& g7 v7 s3 [6 }
#include <sys/mman.h>
( a" c0 u, b& a  I- ]7 x3 L0 O#include <sys/types.h>5 v& @: t3 {( c; i' ~3 n, |$ Z% }
#include <fcntl.h>% f8 U& V, R! E2 h* I% _

+ O  C3 p3 \4 U( o2 }+ E# i#define SHAER_RAM_BASE_ADDR    (0x80000000)
" ]* h4 U1 ^  j) i9 u4 t#define SHAER_RAM_SIZE         (0x20000)   - |1 F1 z! P- D5 g6 B, U

' _+ v3 O4 P* R$ q+ b3 X5 h3 Mtypedef struct3 S- d" R( {/ H& R( `0 b
{6 H1 I4 q+ b6 q. O- u) M( K
        unsigned int a;
/ l+ e0 X$ H/ ^4 b7 a; g2 [        unsigned int b;
" J* Y9 T: D+ L  y2 F5 V        unsigned int packet_cout;4 k7 w" E! s. W. @" t% [+ g  q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 R* n/ T( N# H, Y; h! \- J$ ?& o( n' a
void read_MSG_buffer(int *baseaddr);
/ |+ n% O) X' G6 `% t4 V6 I% munsigned int count_copy = 0;
$ D7 y4 d+ r. z/ G) n4 c( d+ y6 e
int main()4 o/ t& P$ B# R9 Q
{) n! x$ p6 n4 k9 I3 S! X; e, e
        int fd;
5 ^- `) L: B' X0 }# F! `7 J( l        int *mem = NULL;/ q6 y5 L7 g8 _. y7 \% v

. O3 W2 \9 g6 A+ ?) T        if((fd = open("/dev/mem", O_RDWR)) <0)7 x& C2 M0 ^5 D
        {' S6 p4 u3 ~# X! f$ y
                perror("open error");
( a# d, s( M. m; H                return -1;
9 V, f  j/ U& n, T0 H- g. ?) B        }
2 c- e* @0 W$ _5 Z2 h9 r# y        
0 M  ~' d" j4 \# r1 p- o3 @: ^        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ W) ?' q& x6 E/ ]2 X4 S( U
8 d1 n2 b4 I: b# v4 F        while(1)% v$ O% o8 Q  E1 R" Q$ y
        {
# {4 y$ v" A4 Q4 w7 s0 U                read_MSG_buffer(mem);' V! p( T+ i: l: D# x# q4 w  ~
        }                5 b% n9 |4 g2 g( u7 w' z! M
}
* b) I' D+ g: I& ~5 ?1 r: g2 Z9 D( U( D7 O9 \. ^8 {: J
void read_MSG_buffer(int *baseaddr)
, h8 c$ l1 s- N9 B/ O{+ }& e' [" ^4 {% O
        pRX_MSG_PROTOCOL pshreRAM = NULL;& Q, J) w! ~; }

9 Q# \, }7 g# s# H0 d* i" W        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: g; `6 J# z6 ~* ^& c( P* O% g5 z
9 J3 @0 v1 K4 s- K
        if(pshreRAM->packet_cout != count_copy)8 r# |2 [% r. A
        {' l0 F9 d) C$ r7 R1 e, M, n" n, k
                printf("a is %d\n", pshreRAM->a);  K' c, j6 f5 a+ c3 k  o
                printf("b is %d\n", pshreRAM->b);
# Y0 b5 }8 p4 y3 }+ l                printf("count is %d\n", pshreRAM->packet_cout);* z/ G- L1 Z" ~& T" F- V0 U# e0 d
                count_copy = pshreRAM->packet_cout;
! `% R1 q" N4 o+ k; J        }
0 q1 Z3 R9 Z* S        else
4 d3 ~6 B2 U4 \: Q7 l        {5 y& O& Q% q& {/ n! w
                printf("No effective message!\n");1 j/ I+ x( n! Z0 S8 u
        }5 K$ \: t# [: Z2 D
}
6 W& H1 |8 h  j: o/ }: ?/ Z" }$ G3 y/ W& c( z! Z; y  D4 v
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???# ]  F# M8 s2 ]* @$ @9 d
, A, U5 G- O& q- V% {
1 C7 @7 k' K3 W

! b# w8 ^( I7 j( _: w  i% x) t  d+ P6 D1 N+ `, k1 i





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