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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# m$ s: D8 i2 k8 S; B0 C* h. D: m
4 E0 Z7 f# W& u- h# D0 E# kOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& u5 u8 r& G% u0 [
#include <unistd.h>5 Q0 c: d* x" i3 [: t7 r+ e* u( l7 I
#include <sys/mman.h>
1 ?7 M5 y$ I+ U; {0 V0 M: c#include <sys/types.h>
1 h$ e6 @' G( |3 C' y) }#include <fcntl.h>
, w% m9 U) p! ~: h" X6 w7 A
' ?4 S7 O  a6 D#define SHAER_RAM_BASE_ADDR    (0x80000000)   
/ l9 o$ S& a5 d$ A  A
5 ^* W. a/ }5 Dtypedef struct
! w# v" T; G5 r+ R" I  Y; a9 @{
! w9 ^5 L. _1 Z8 w        unsigned int a;
" x9 M& E4 C& ~2 P, U: Z" a8 j        unsigned int b;
6 C* n8 z' e8 n/ B1 M7 `        unsigned int packet_cout;/ ]9 H/ C9 r  d: ^( G; m+ {  b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ j+ f7 a0 }5 t* {, @  t# M6 F; ?8 e+ y$ G6 R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 @- ^- l/ j  M1 B# P4 Dunsigned int count_copy = 0;
" \# [7 F3 {* a* t5 \# d5 V9 h$ l+ |- t6 }2 O3 f

: D3 n+ `- s; Q+ z9 l3 Wint main()+ r1 m- \& {8 M4 o/ z
{' S% p1 f- K% g2 F
        pRX_MSG_PROTOCOL pshreRAM = NULL;
' X% K" {4 A# D        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 n& n: s' N1 C5 W! q
6 p* N' \' o7 g: Z4 y/ H        while(1)' E: t" X. V! u* \/ e7 }
        {8 Y% J5 @8 X! m3 I
                read_MSG_buffer(pshreRAM);% }4 u4 M" n, \. e2 d; p3 G+ _
        }               
5 l' u! ~. L9 f- @4 N4 L}
; |2 [! W$ j* }8 S/ u# f% ]  x& k  @% p& v* o4 P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* K! n4 u" z, d& ?{
; N9 [+ p+ C& C9 g        RX_MSG_PROTOCOL buf;8 A% b  d& _( Q7 u) F
        
* {" Y9 p" O5 a5 c- b2 T( H4 ~        buf.a = pshreRAM->a;
% W/ @" ~* X$ A$ p/ A        buf.b = pshreRAM->b;
7 I) A  J' L$ m) }- @8 J$ [( Q        buf.packet_cout = pshreRAM->packet_cout;
. y; N3 t- s& Z# Z7 {; ^, s& U9 m7 B        ) D3 \  }6 ?6 q/ ], w
        if(buf.packet_cout != count_copy)# J7 O: ~8 g3 d) X- _0 a* M. F/ k- b
        {
- l7 s" e' o! A                printf("a is %d\n", buf.a);8 m" H# P4 r; k1 A& I: G' _% b
                printf("b is %d\n", buf.b);
1 @% j2 |2 n4 A6 c                printf("count is %d\n", buf.packet_cout);
4 i, X7 _1 e  Z                count_copy = buf.packet_cout;' i5 S5 l1 B9 E5 P2 J0 y
        }% h" `. \' C# _1 o. s
        else1 {, [& c+ {9 M6 @
        {  G7 ?' s' Q* e8 W% o
                printf("No effective message!");
+ u4 d' v  Z* N; L) o        }
4 Z1 a- q" N' J4 ?- [! ?7 k* d- K}! h; K! l1 Q: n8 Y7 @; W

: d, L% U2 A4 y7 P! C& V8 l* c# F& X* a7 T
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。  U+ D/ m) `; U, z
使用下面代码,对内存使用了mmap函数后:$ ~+ a; ~2 \* O# {
#include <stdio.h>$ i- p& e5 N3 M5 W$ s. m! t
#include <unistd.h>
. f  F( Z- U4 x! T8 {9 |#include <sys/mman.h>
! @' O* a( ?# |#include <sys/types.h>% o1 M# K' M9 O& F+ L
#include <fcntl.h>' T" k% T' U% i9 o0 x  d* T. x$ _1 X

4 l6 J5 c# E/ Q$ C#define SHAER_RAM_BASE_ADDR    (0x80000000)& e6 s  C2 g( r7 O0 C) ?0 j* @
#define SHAER_RAM_SIZE         (0x20000)   
* P0 |+ I+ T- j1 e6 D4 @! ?
" K6 r) ?: S( K( xtypedef struct
9 \! X1 z- `, s{; k5 W# a: \+ {5 w
        unsigned int a;2 \8 L3 S) S7 N7 k
        unsigned int b;
- O9 }* q  x7 a" G        unsigned int packet_cout;
7 [# O) R$ c( ]' K- h+ k4 A2 {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ @. l4 F# F+ D7 d+ ^: |0 w2 O
1 D, s: r6 O9 P' {" D' v; D
void read_MSG_buffer(int *baseaddr);+ q0 e/ {% w7 f3 ?( f" t; `; M3 f
unsigned int count_copy = 0;) N/ J* V% {" z& l$ p' L  m8 e

, a+ j; e; `( {( Zint main()3 n, u& w7 t+ j: `8 q& i4 P
{  e; h5 }: l( n; o( e+ T3 d  `
        int fd;
. l/ p* i  a9 ?9 s        int *mem = NULL;' x% U5 G/ b1 T. o8 N) b% I5 n1 j
% d+ i: N5 C4 r8 A8 h4 f, }3 _
        if((fd = open("/dev/mem", O_RDWR)) <0)* W" x* Q* S# f) o, P8 @+ v0 a
        {
' T, y' y0 r% m- _$ ^0 i+ J                perror("open error");" x9 {5 s2 f. O8 b
                return -1;8 T$ m2 ~& i1 i6 O7 k: O/ O; [( i
        }
1 T& o. R0 g4 T$ I        
- g) B5 O8 x% e        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' K5 H5 a! H& U- y
  W/ ^1 p5 k4 P8 }* q        while(1)
- t) ^; f; [+ @7 v7 Q0 j        {3 e- @4 |* I6 e& P
                read_MSG_buffer(mem);, |+ A1 q. N, m7 M7 W6 q
        }               
; g, B/ N! r" A; u3 y" K( Q}
5 t- |4 ?0 a7 t$ W8 N4 B9 E8 m' }- \5 C
void read_MSG_buffer(int *baseaddr)
) U( Q# O* }! K) j/ j{
! R5 ]% t0 b9 |& `8 b        pRX_MSG_PROTOCOL pshreRAM = NULL;+ X! [/ i# R6 V. D; W

9 C) v% _: \' _' Q, h+ a" ^        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: m/ M  L) }4 ~3 N. K, K8 t& q$ l& x1 u# ?8 F- g1 X1 a
        if(pshreRAM->packet_cout != count_copy)  h) \) |) V1 f: r6 L
        {) h: Z' m- ^8 a% C8 R# E
                printf("a is %d\n", pshreRAM->a);
  @9 \; J# Z& N" }( n* y                printf("b is %d\n", pshreRAM->b);
, `# D" n4 O, s$ T% w* C* _                printf("count is %d\n", pshreRAM->packet_cout);/ n. _; V: v; U1 a
                count_copy = pshreRAM->packet_cout;0 V/ {6 A4 y" b- z* r: q
        }0 A* A* L( [8 q! Q/ u) U) a' u
        else
5 \) s( W! G5 h6 c2 N4 T        {
& D' j, P: \3 |  |                printf("No effective message!\n");7 @1 J) G. @# Q& O5 k$ n: ]
        }# m4 H3 `+ E) E4 g
}% d( `3 K0 J+ |: v" t# Q1 @/ s
% ~- g. K/ j- J9 j  k' e6 H
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???- x$ c* v  b6 j& Q& A5 R
* L: t. _3 i& G& h; y7 C
! C1 h, c2 U1 b

7 ^1 e# S2 Z) U( U) {+ W0 G! M$ h) M% [8 W5 N& W9 g) P/ o; a
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-8 05:23 , Processed in 0.039816 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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