OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 r' c6 J$ T5 ]7 n8 }$ S6 x
  _4 N4 l- v- KOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 b3 F9 P9 F, f9 \- U+ x#include <unistd.h>3 Q' Y$ V9 u: }& W% h0 k5 e
#include <sys/mman.h>
* r4 o9 K) ?0 |& D2 G/ I#include <sys/types.h>- \. ?: ?  O1 h; l6 _  Q
#include <fcntl.h>$ J* |0 v8 ~- s. G6 q
6 k+ p. v; y8 W/ \* y+ f% j
#define SHAER_RAM_BASE_ADDR    (0x80000000)   / |, g* W) \6 i: I

  b" U4 q& o7 n% ?typedef struct& b# v4 u, x. N  y2 G+ X
{
( ^4 G- {9 A' x+ g& a1 r2 z        unsigned int a;
5 b3 k/ f& U$ H, L+ Y        unsigned int b;# K! k, T2 z( @4 u/ ?/ i& ~
        unsigned int packet_cout;, l" [  I' V8 A7 M- d7 i- N) u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) _* r. y$ k$ U. e
$ @# _6 M4 y  s$ T5 e2 v$ x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" C& x/ G2 n7 \. Wunsigned int count_copy = 0;) S& Z9 _7 B- P

% U0 P' {2 ~; N' M2 o$ b% i) d
6 a( C9 _$ C; E- Dint main()
! P( q6 W7 R; K: E. q  @# q+ V{1 r7 u# }( r: ?% v* @* G( h
        pRX_MSG_PROTOCOL pshreRAM = NULL;6 A8 d1 D, E5 ?9 M
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 n. d% N+ r7 A. X

/ o& ?9 _6 |: k8 |        while(1)
  L9 }3 Q- o4 Y. J/ I! d        {
/ R& q0 P& ^) o, w2 h* b# B7 x6 N                read_MSG_buffer(pshreRAM);
* S5 e3 {% R; P* e/ ~        }               
/ |! ~5 Q( ?0 M/ M- V}
! n8 t, a& `5 F. z+ T
8 J% H, @; T1 I+ gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* J& d. t, H( l2 H2 e* h
{
- h. x+ u- ]7 n        RX_MSG_PROTOCOL buf;
; C7 S, |0 H; t! S        
  j% ?: i% A. w: d! u        buf.a = pshreRAM->a;
! ?( z' I3 K9 a/ ?        buf.b = pshreRAM->b;& o: G/ w( K  m/ I0 q) }
        buf.packet_cout = pshreRAM->packet_cout;0 s, ?$ m0 e6 T1 e; ^1 i8 I7 f
        & C9 l5 \; F5 O7 n
        if(buf.packet_cout != count_copy)
4 Q" l0 L9 z( F        {- O8 c  K! ]" s& s
                printf("a is %d\n", buf.a);
' y/ L5 V8 E( }# H                printf("b is %d\n", buf.b);
# A( n; F% C+ i5 \8 m                printf("count is %d\n", buf.packet_cout);
0 E& ^6 x5 u& C3 c# `" l                count_copy = buf.packet_cout;
" B( _* C- r( U' [" C+ ~2 v8 x        }
7 `8 z/ l9 z& W        else: k# f0 r: @: ?3 {1 W+ D
        {( H$ i& z  V' ]  m$ h4 m3 L6 v2 j
                printf("No effective message!");
( T/ K8 B" D. L; _/ M        }
5 ^3 B# Z; u8 D) e. Y2 V: N0 @! ^}9 @% A; q5 ]+ U  @  G2 D( [4 H7 I
# T. `  F) P9 w' i8 i6 c# ^; _' L
% R" q, v# T& ^! l! @4 s
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: Y, ^% N, R& O7 A: g# K& u使用下面代码,对内存使用了mmap函数后:
7 C) _* L0 ~& a' @+ E#include <stdio.h>
( `0 F' Q1 h( {1 E& m8 x5 g#include <unistd.h>( _$ `# R" `6 `/ C5 P% \
#include <sys/mman.h>
+ ^+ Q8 L3 ?/ O0 D; ~#include <sys/types.h>* C5 i  N* i9 X3 {1 u- w
#include <fcntl.h>) |  S( q5 `+ L1 D$ ^- W& b

9 B- p1 L& x+ _4 ?#define SHAER_RAM_BASE_ADDR    (0x80000000)
9 F9 f1 f6 K# I; C; W9 d6 F#define SHAER_RAM_SIZE         (0x20000)   
; a/ o/ ?2 g1 ~: o
1 n, f) N5 p3 |6 ~typedef struct5 X# T5 i  ?% M/ a' o: a
{* {3 B# y) f& Y' g* D% t
        unsigned int a;
: L( q$ w5 S  ~* L1 r        unsigned int b;+ @- Q2 b5 f- E) V" F  `5 x6 P
        unsigned int packet_cout;
4 y% f# [1 ?2 X* N" v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" A% ?5 X) j- F3 z
, y4 F; l" i* H$ c5 F* c
void read_MSG_buffer(int *baseaddr);: d/ ?4 d& Y2 k& S' ^% Z) A
unsigned int count_copy = 0;
( m) J4 G3 c) E; Q  o& h. V6 S! }6 q) l) X' |+ a
int main()
3 C5 a3 |4 c) n$ t  v. H{
  o2 |, z" E3 Q5 G1 o        int fd;; X- p2 d& a8 {0 r" G! V% A' k0 V
        int *mem = NULL;1 u9 y8 h9 \9 Q6 L8 r9 |
6 j, `# d; k# m6 [
        if((fd = open("/dev/mem", O_RDWR)) <0)+ f! t% s4 l9 X
        {
' p4 K4 a8 I9 e                perror("open error");
; _- \2 S8 M2 d* S$ [  @3 b! a                return -1;9 y3 e* J9 n& g
        }
0 w+ n! M- ?& r( m" z        
. @# \6 ~. X' M& t! ?        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 `+ z. J2 ?# x
3 r- J; z9 A& @! G0 k        while(1)
9 ~, ?3 Y0 W6 s6 N2 S        {
: u5 f2 h. Y( d3 a5 K* f/ H                read_MSG_buffer(mem);
: N5 n* s# \8 ]( w9 T        }               
8 q; j. y6 O; R9 V- {+ ]}
& U7 o) a1 p& G4 J  s
0 F8 a! G9 S6 Ivoid read_MSG_buffer(int *baseaddr)
: Q/ `: ]3 d9 \" u{
" g; p, \/ y+ o1 ]1 t3 x# X. A8 p3 d        pRX_MSG_PROTOCOL pshreRAM = NULL;" k0 F+ S& S  d
: |6 [9 d+ N2 o( [2 J
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 {* J0 i  [2 X" b) E/ l
) B% F) O( @; N* U
        if(pshreRAM->packet_cout != count_copy)
) j/ b5 [3 x; E        {
. t8 V; U. j' S, q& q/ w                printf("a is %d\n", pshreRAM->a);
. W! C5 h  D8 X! ]/ i1 s4 [                printf("b is %d\n", pshreRAM->b);  ]6 n' ~! W0 x) j1 H
                printf("count is %d\n", pshreRAM->packet_cout);4 t1 ^: m% a+ u1 H
                count_copy = pshreRAM->packet_cout;3 g& F  C0 H1 [- h
        }
! o# K$ m0 _1 [# L$ A/ `        else* [# v- O' v; K2 ?
        {
/ W* [0 p$ ?/ A: L4 ~$ T1 _3 a                printf("No effective message!\n");
. [  V9 M% A- z* H9 c2 S- y        }- P, j' u. o! o( }* v& u
}
1 C! ~5 p* L4 v4 f9 e+ {8 w3 V
" o* i0 Q' Z* T1 G6 W没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& o! Y3 t8 e" c3 P3 p

2 L. x* L. g( ?" W: N4 _# S( a

* x' r+ x# `. I4 e, k) s! n
6 S5 k5 @+ W% X
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-2-17 08:35 , Processed in 0.039028 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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