OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5294|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ P% f& [2 j" T6 I' e+ J$ g
' d, B% P! U0 K" e( n& o2 xOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>" P/ j8 Q3 s' O/ q/ P  l8 u
#include <unistd.h>
# e, s. L2 \: b! R9 a#include <sys/mman.h>
4 g7 I4 b& F8 ~+ W5 J$ q#include <sys/types.h>2 ^; a0 `+ F5 s% T
#include <fcntl.h>
1 s! }% _( q+ ^% V* H/ [" l, S; B3 ?1 K% a, C7 I8 P5 o
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ( G& A/ N8 |  Q" G1 ?4 K

; [8 t/ |# c' N- V# A) qtypedef struct
0 W9 a. r! W/ L* h3 h7 O{
, r7 Z2 R7 j- S) ~; `        unsigned int a;
7 i" s; y$ J& l. [" @+ h        unsigned int b;) {: s; y1 K/ X& x: n, R
        unsigned int packet_cout;
; n+ \# x8 ?" P( G( `3 R7 ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' O  e( ^" I% ?0 U: V
$ I+ D( ]9 O6 t* u0 ^, i! V$ f! Svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ s9 N3 i0 C, _0 w! uunsigned int count_copy = 0;5 t# ^. e% b4 I  i4 M
& X( u/ M$ ?- r  G; C# e* A% }

9 T4 r: L# e& S) H$ }! ?4 K$ Sint main()
6 k% \# l$ F7 A6 C: Q{4 q8 I' y6 b; j' r4 L7 \5 X' f$ r
        pRX_MSG_PROTOCOL pshreRAM = NULL;# |! N3 p4 S! l7 @7 f/ Q
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' y. A' x1 E' c, g8 c

1 s$ A( G. l: l3 J1 a- z( a2 i        while(1)
- ^0 g& Z8 J& }' g! `4 a        {! B/ o* j' D7 N8 Y0 u5 {  K
                read_MSG_buffer(pshreRAM);
: P. I6 |/ ^" n1 ?1 H4 x        }               
9 c/ I7 c% }0 t0 _}- N/ l6 R  w* x* ]+ R: i

) z  |+ k9 S0 o( ?$ ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ e8 X" S9 o% l4 n. ~5 S
{2 d# r0 z# k: F8 m8 H
        RX_MSG_PROTOCOL buf;
' }* T  L) w  L1 i5 E0 z        
' K- u' H. ]4 L" W1 Y& n+ m        buf.a = pshreRAM->a;
: V1 J& X# ^) X4 C" I$ G        buf.b = pshreRAM->b;" E% I- y2 _8 z3 V, s* P: t
        buf.packet_cout = pshreRAM->packet_cout;3 F( q, e. w6 L. O. m
        - ^$ Q0 o& M7 q7 Z, E4 h4 @
        if(buf.packet_cout != count_copy)8 k0 |. f+ G# v" U! h# t4 m% U
        {: _9 x' n7 T9 \$ Y" Z! D! ?
                printf("a is %d\n", buf.a);5 j( F# {% \* w1 t8 V
                printf("b is %d\n", buf.b);
; E4 t3 V+ D2 p                printf("count is %d\n", buf.packet_cout);
1 J$ Y: z4 e2 M                count_copy = buf.packet_cout;: E" N: ?4 X" R7 X# m
        }" T2 f6 p5 }/ V& `  E7 d
        else
6 E1 |4 S' |6 T9 p        {
2 \* r" t5 a: |" j2 b! I& k1 k                printf("No effective message!");
0 u7 g/ B0 O; x5 U7 E1 c        }  f1 D2 G( F# r
}
; N$ Q! q0 M( s; S1 l6 ?  }6 }* S; `# Y2 H
3 a( i) K; K4 U3 B& F. V
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ H  N6 `3 {* m! W1 D, Z1 P- ?
使用下面代码,对内存使用了mmap函数后:- h6 E' m" `6 d- J7 h
#include <stdio.h>
2 P- C. W. u  q0 a0 W$ m/ o#include <unistd.h>
# w# ?9 s& f4 c" H5 {' c1 u#include <sys/mman.h>3 w; d, _# P' w9 y; I
#include <sys/types.h>
5 z0 C. \* g% V5 l0 U" F, n& ?0 w#include <fcntl.h>
0 N$ Z- B4 d4 x
% ]7 ]) _2 U2 e, R, n1 ]#define SHAER_RAM_BASE_ADDR    (0x80000000)7 |* {8 b$ }: b8 B% P* d/ h
#define SHAER_RAM_SIZE         (0x20000)   5 R5 i7 ]4 V/ R6 D2 O$ @1 z

3 s# q' }  E7 O" |& ctypedef struct
' g3 }+ U* N6 K6 s. }7 P" c) M9 d* g$ c{
" L1 r6 V2 ^4 N( [4 i  |1 |, j        unsigned int a;+ R. M2 p# n0 d' i0 x3 h, m; v
        unsigned int b;
6 M* U0 ~4 P- c- H+ k        unsigned int packet_cout;
, A% }/ ~. {* q' f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 r7 [6 q0 Z# t4 {" v6 d

% N9 [% T+ s7 ~* z5 mvoid read_MSG_buffer(int *baseaddr);
0 R( N1 a& G% j2 J8 {8 z% junsigned int count_copy = 0;
' {0 P7 d& c7 x: |5 @6 \/ V9 Z- T/ {: v1 q  n, w; V! p
int main()
2 s, T, U. l( L( X{# V0 M" A7 L5 n9 |' \
        int fd;
* }& ?% o+ F7 B: D* m2 k4 Y4 ^. Z        int *mem = NULL;3 C- L: Q6 j7 K9 j
' a# `, @( J$ I2 N
        if((fd = open("/dev/mem", O_RDWR)) <0)
: o( l, \6 i. x        {
) I( {+ ?" l/ v6 u- Y                perror("open error");
3 `0 k/ o1 P6 e* ~8 \* m                return -1;
2 h  j! e& c) k3 o1 A& O# h# T* o  B: ?        }
% f( ]7 z0 h* o: h; F3 G        ) M0 T3 g+ s, g5 x4 B& C' q6 w2 W
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 k! f! ^! Q2 |- M& t4 v7 _. y; E+ ^- m& h  R
        while(1)% ~- M. k, ]% d/ t! E
        {
1 [) ?  I) [; x, S- r                read_MSG_buffer(mem);
! h) X; s5 W& ~+ c  q: V8 I# ]        }               
$ u0 ~' r( j/ b; ^9 L, L) F* F}
  U7 |% i4 l  E5 |4 |8 P. h; C9 C$ E' |0 e9 Z
void read_MSG_buffer(int *baseaddr)
7 ~+ l1 T: d4 |- a5 T( b8 m{
& y: S9 g/ y) Z3 z, w( ]: {( t        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ l6 _- D0 q9 j  Q, \2 f5 Z" ?! Z' N$ e9 W, _" |
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ j3 s' s1 F( J# X* D) l& w  N9 d

0 m: H# ]* m, r9 U) p% c  L        if(pshreRAM->packet_cout != count_copy)
: G' v6 R% S. y9 w' b        {; Q9 I1 l! \0 w+ s6 y0 C+ |
                printf("a is %d\n", pshreRAM->a);
/ Q; U) [! ]0 L- c6 ^  m$ r% _                printf("b is %d\n", pshreRAM->b);
) j6 w9 e# Q7 [$ g# B                printf("count is %d\n", pshreRAM->packet_cout);
' N- C( f9 X1 ]* V8 P                count_copy = pshreRAM->packet_cout;. I2 Z8 l8 S4 a8 }
        }5 V" u# N: x# ?* X( J
        else/ X0 h: p" V: Z7 m  }, O
        {( Z+ W! E) c/ d/ Q+ b: Z) a
                printf("No effective message!\n");, d3 _4 q6 A) Q( H
        }: d. E0 b! e" P0 A+ S/ }
}
8 c1 u2 m3 f6 O
2 z9 }0 G& G/ G# o没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# k2 ~# Q  |! I$ i4 D9 J, p  s1 k) ~7 Q7 E7 W$ s. K  z
  p' }( [2 C0 r: r( T' R/ F0 L

& I8 k9 n' d9 X/ L* e3 ?( v8 w8 ?+ U3 R1 X+ X% Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-12-11 19:14 , Processed in 0.037201 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表