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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: T; q) K" q* U$ S/ `2 s
6 {6 [; r( J) t( g4 B* mOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) l" R8 o2 Z, a0 S/ W3 L1 f
#include <unistd.h>
# R- w0 g& I1 M" S/ C3 f; W#include <sys/mman.h>
$ H& G! _- E8 M( C3 w#include <sys/types.h>, P9 \+ C- k9 T$ h
#include <fcntl.h>; Y) ^1 f6 s& A; s5 A7 l! ~
+ w! X- \" L0 t! T( q
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
; F7 _" \+ p; Q% R  l& N0 o3 @- K* g0 L" E3 m3 I2 ~6 o# }/ i
typedef struct
  Q2 c4 X% ~6 }{- I, V+ ^# m+ _0 T- ^& I$ M
        unsigned int a;% S& T" |" }: |8 t7 H
        unsigned int b;: B# ], E. p( o/ T3 @% W
        unsigned int packet_cout;! b3 V# u. U; V/ x, m- Z3 L7 Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( A0 F3 g$ P/ h% d! W+ Z4 R/ l9 i7 V) G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 ~6 Y9 p- I/ v5 I6 d% j" ?2 `
unsigned int count_copy = 0;
( d% G* I1 d. B% y0 _- n4 v4 E. ~' G4 [$ @* |9 P

) x, a  ]( J* fint main()) p7 `0 O5 x. m* M( M; I  Y. r& ]$ v3 e
{- J% g3 d2 i' j" G* L. u2 W/ d% t# K
        pRX_MSG_PROTOCOL pshreRAM = NULL;
" D( S4 @; C! W        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( X0 d; o/ H4 c0 f- r' O+ S. Q. W) }' @
        while(1)
% u& |6 [' ~, B1 f        {
* s0 g; s5 ?# K                read_MSG_buffer(pshreRAM);3 F' }/ J. E/ L6 `% j  ~% J
        }                & |+ R6 E0 F- z  A) g8 r
}, v# k9 O' F9 A0 g- f5 e9 h# m6 ~

( x8 [* ~" [6 Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)3 G/ d' ?- G5 N& L# L6 o
{9 {" ?- ]) D  H5 P) @8 g
        RX_MSG_PROTOCOL buf;
5 Y. G0 g$ V: O* `& A        
! r( S; g6 g6 F. m        buf.a = pshreRAM->a;
1 ~4 Z2 W' {& H% e& I        buf.b = pshreRAM->b;  t2 R, D! D$ w: Y
        buf.packet_cout = pshreRAM->packet_cout;
3 M' `  b1 ^) T        
! k# w# O% g% O0 p- Q        if(buf.packet_cout != count_copy)
: T) x* [) J" N1 P        {
* @: Q6 p+ O) l% M& v; G                printf("a is %d\n", buf.a);
- W* S; f6 b% c7 Q+ S, g                printf("b is %d\n", buf.b);
6 K! |6 I/ s- l" N% [# o$ N; z3 S' t2 ^                printf("count is %d\n", buf.packet_cout);8 c$ F, G$ w1 q2 E
                count_copy = buf.packet_cout;& m4 N! Q( w& w! S
        }
, ^, E4 _5 x- N* ?        else
, n; ]1 @/ u/ O* v        {
) G+ ~+ U" j6 r                printf("No effective message!");* {6 }3 D# `3 ]1 u8 `, L
        }2 P2 s# Y- `1 c2 k8 w. G5 E
}
1 W: X9 S8 ^- l  u
+ J- E+ R& N$ h% b4 `; E
# r8 ~# q3 g8 q* d9 G1 q" n但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 r2 Y% ^' X# \" z# a使用下面代码,对内存使用了mmap函数后:
/ w& B* O2 R7 j" m) I# x: W; \1 m1 D! m#include <stdio.h>% g2 ~/ x6 x. p9 ~' o
#include <unistd.h>% G/ I. T/ m3 i$ ?& M$ r
#include <sys/mman.h>& D; `) z- u6 ?7 i' b( U/ ^
#include <sys/types.h>
$ V! k7 Z9 e: N' \1 {#include <fcntl.h>8 k  Z% {/ D0 n; g9 o: h
  ^6 p% [* B! ~$ R8 d8 k
#define SHAER_RAM_BASE_ADDR    (0x80000000)+ \7 o' P9 r3 {! I" I6 d" F
#define SHAER_RAM_SIZE         (0x20000)   
1 ^7 ^7 {  y( ]& p: i: Z: K! x% f$ D
typedef struct
+ v; r7 M8 h0 K3 i6 ]9 a' R  N9 D{
; d4 `* q  n  X- `( c% ~        unsigned int a;
$ U+ T; x4 v* h        unsigned int b;6 S; F1 o# J. s" n" }  c2 Z
        unsigned int packet_cout;
4 I. w, P9 S* {, K}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& c' w  f0 o: z  ~4 q
( N; u, m" U/ Q3 h7 _% }
void read_MSG_buffer(int *baseaddr);, B& |7 Z- n* k# ]
unsigned int count_copy = 0;
, a. e+ F6 q3 \- ^4 v
( a1 v* b) D/ G0 P  Aint main()
. s2 j4 a: I/ C) N{
8 Z; d2 X( O0 M% p        int fd;
1 i+ }* {& \$ ]6 l9 e; a        int *mem = NULL;
7 W! ]! f) o% N2 ]
8 G7 O& G/ W6 Q        if((fd = open("/dev/mem", O_RDWR)) <0)$ h7 o; d  b# B! L" c$ v$ }
        {
2 }3 [2 n+ z+ N4 V, j2 P- g, ]                perror("open error");  |* T% _$ `2 g& v5 x) b
                return -1;
+ r% w$ j/ i6 a: j2 v! S4 L  r( a        }% F7 J6 |# s! [4 d5 O
        ( M0 k, T- _% |6 y
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: @, x9 O! R4 ~( |2 D) m' C5 ^  g& L7 L, e5 Z( P5 M& j4 ~2 L
        while(1)
9 [& n! I9 m' O$ q/ g; [        {
% @7 I3 r) W% ~5 ?( c9 X7 w                read_MSG_buffer(mem);
& n8 r' u, i1 c/ A/ a        }                1 i# F2 u" k- }( H8 T
}
8 I* w5 z- H; {" d, _
: O/ {/ C7 `( [void read_MSG_buffer(int *baseaddr)  }  r" J8 V& J9 c3 q  Y
{. [8 e: b. L+ Z+ Z
        pRX_MSG_PROTOCOL pshreRAM = NULL;% t2 O, q  v$ E% H0 i

- r& D5 l6 H/ m$ D2 k  N        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% {& \8 D* B2 x% c/ A0 L3 W* B6 S4 @# c# ^) V
        if(pshreRAM->packet_cout != count_copy)
3 H) s7 c5 E3 ]        {
, j" X9 b9 R' \9 k5 B                printf("a is %d\n", pshreRAM->a);, h* U7 y- t% R5 X& c) L
                printf("b is %d\n", pshreRAM->b);  [: |9 B9 B2 C! c6 Q
                printf("count is %d\n", pshreRAM->packet_cout);; ]% ~6 e9 V) N6 h2 M
                count_copy = pshreRAM->packet_cout;
* H& Q0 [+ x3 h; f+ }: f        }
: M$ D* l! X* T4 }( P        else5 ?' P. Z2 y) w% \  R$ E: j0 R
        {
+ r+ f! j; [, [2 _% p  ?                printf("No effective message!\n");
( Y/ v0 |' m/ ^$ F        }
& R9 i5 V' Q+ u7 Q$ q. F}) a$ `( C  _1 _. Z2 N1 [/ b
" D( b* y/ d' t9 a
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 f2 _8 }4 d2 B+ O5 a3 e# X

( j6 j7 d2 J  t4 X( s' r/ k
& F* V, |" {" k- U  m
* @- x& o8 |/ q3 f
9 G% ]2 d8 i& g/ G8 W% F  W; S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-16 19:07 , Processed in 0.043066 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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