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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 \$ k+ @; B1 K  U) p1 i; H5 O$ G$ F* P% r; \; L$ i1 H
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>" o! z7 ]; S2 r( ?$ I
#include <unistd.h>" X2 Z& f" b. \: f+ s5 o
#include <sys/mman.h>% c- z0 l  Y& u! D5 S( B* M
#include <sys/types.h>( T7 }0 v9 A1 c+ K) n% j2 Y+ e
#include <fcntl.h>
9 t1 ~5 a, d! q0 Q+ N2 c# L3 H* n
#define SHAER_RAM_BASE_ADDR    (0x80000000)   & ]( h. k7 w* j2 ~" }1 D$ l

( `4 m8 W. \& ^7 {% xtypedef struct
0 t' _/ L3 }1 S1 g{
* U3 f6 P3 p! \8 H' I) j8 Y        unsigned int a;" m5 y: A8 k2 r; x- a2 U7 `6 v
        unsigned int b;- w* J1 ~1 m9 _: M) X
        unsigned int packet_cout;
& Q6 P" V, Q9 z7 A% z0 N0 z: f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 W+ `# g0 C4 Y/ p& f) }" j

5 ]7 {1 H& ]- R' Yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);: |+ R6 K7 |. ^& a3 j# K
unsigned int count_copy = 0;
; x2 c) H8 q0 T. K; i1 k1 d  a* ?+ }: T4 |9 S
5 |& \. i) I+ r8 t# v& U6 H
int main(): Q! P# t; T% v, g  q  W
{* y8 t2 b  O; t" F& W2 u
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 n8 {5 n0 B2 Y* V
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ ]9 @" N: W  J. S% k" B1 q! U& c; \4 M. M2 R8 n# n
        while(1), n4 |8 _* C$ D- X1 Z1 ]1 S: N
        {
& H: h5 l2 @7 X7 B" t% B# I  N                read_MSG_buffer(pshreRAM);, G3 |7 c$ p; S" _
        }                & X: Y# b& j- G( @' z8 p
}
0 a9 l  X1 J8 J. ~4 c+ s0 s% }# n/ |0 O& o& n" ]1 V2 [7 Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 e" Q. [5 h. I8 N+ |7 y( I{6 |# i# u8 ~" ^& b* o+ D& b% X/ ?
        RX_MSG_PROTOCOL buf;2 [. ~* |- U' K# P0 @' h0 s. e
        
( m% `! j: a, `( A- k4 p1 j        buf.a = pshreRAM->a;) X8 Y1 }5 d3 L: M2 h
        buf.b = pshreRAM->b;  Z2 a# O. U# n& b3 G. Z0 T
        buf.packet_cout = pshreRAM->packet_cout;
: W/ r- A0 }: n/ ]$ V/ t        0 o" }0 v& z. m* t9 c1 x
        if(buf.packet_cout != count_copy)
7 _- j! U4 k6 e8 v$ ?        {! u" ]4 q4 u  R
                printf("a is %d\n", buf.a);
: h& T) x4 i. m# q( x: @0 N                printf("b is %d\n", buf.b);
# e3 }4 @4 x# @: i- p# o                printf("count is %d\n", buf.packet_cout);
; _. [$ P$ B6 |& J+ J0 o                count_copy = buf.packet_cout;5 R+ q. V3 }) G7 ^" G! r: ~3 ?7 o
        }
* Z' p# K- [  Z2 A+ J, t        else! u: z0 s$ J% [. ]2 y
        {& N, _& X# s, _' R3 f% [9 K! R
                printf("No effective message!");  {: ]6 ^7 I8 b: w: T
        }! ?* D4 S. |+ O: l" G$ ?" k/ a
}; y7 i7 @% z5 ~+ u9 H7 m
" M- b, W! d+ L1 c" V4 a7 u$ ~. {

& z4 ~8 B5 t7 R但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% T7 P" C+ S, g+ f/ W& Q! v, b
使用下面代码,对内存使用了mmap函数后:( ^. A. C3 J5 y7 h4 _9 x" g+ P) z  I
#include <stdio.h>9 n! D6 X' g, @/ W( Q7 u
#include <unistd.h>
; F  J+ X* c" F+ R2 V) p#include <sys/mman.h>: o. p& O% R2 I1 p4 Q: c3 I
#include <sys/types.h>
' G/ v$ D' s- W% G* f! a: Z0 o0 m#include <fcntl.h>
( }# G" _% P5 l8 h- O$ t* b0 d6 |: K" \# S- \8 m: p
#define SHAER_RAM_BASE_ADDR    (0x80000000), p) w8 t% B9 T0 N
#define SHAER_RAM_SIZE         (0x20000)   
. F, V4 `6 ^  r0 w, K9 `) M( o* {# q
typedef struct4 K) [8 x3 X9 h
{
* h& W- Q5 j3 @5 s        unsigned int a;- k: S- s0 b9 l6 B* _
        unsigned int b;
8 G% s1 K0 O6 L& u. t  \        unsigned int packet_cout;( y! l+ b& B/ L; C7 i$ @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 |$ `. F/ L. U. u3 M% w+ S0 k: i0 W6 L! v- m. V- [
void read_MSG_buffer(int *baseaddr);
5 N2 x, [# g1 ?0 T  K/ }: vunsigned int count_copy = 0;
  }% G; A% f# Y5 `9 F; Q
; D% A) @) N3 H( f6 Y; J# t, Sint main()
/ ^% m4 `& Z+ X% L$ }9 p+ |5 `{
6 ^& s# Z3 ^; q7 z; B. n: {6 B9 [% S& ?        int fd;
8 m! |% r% x4 z, q3 U0 ~        int *mem = NULL;# N, w/ f7 ~4 b* K
$ C* w/ J. `, j$ [
        if((fd = open("/dev/mem", O_RDWR)) <0)4 ]# J  R# C- k$ l1 ^
        {/ L$ q, h  C7 B
                perror("open error");1 L0 V- \- r, b; q: t" e
                return -1;" H! B6 z# q3 D! }4 R
        }: i3 @8 e* c" g; f
        & X3 s" I. C) k3 P
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 D+ x/ b% u) S; f2 K! k% [% r& s5 c8 Y7 l
        while(1)' m8 R  f8 A2 i; x) m. H
        {) ^' n1 B( D3 W* t0 S4 H
                read_MSG_buffer(mem);5 |& D2 @% N! r/ f
        }                / E+ h. f( f8 x% D& z: i
}- w, u6 k0 [4 k: O; A" P
' ]! R) n3 |1 A# Y7 ?' x
void read_MSG_buffer(int *baseaddr): r9 O  c$ \# _& @7 z2 f) a- b
{2 ?, ]3 b  p. p- s, b
        pRX_MSG_PROTOCOL pshreRAM = NULL;0 U2 g" z6 U1 v' H
' K; l2 z( h6 b- s! ~! q
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ q# L1 \  E+ E3 [

+ O4 ^! \0 P# R        if(pshreRAM->packet_cout != count_copy)1 c. T8 Z* ~! R8 e
        {: Z, K3 ], D' Q' F
                printf("a is %d\n", pshreRAM->a);' F+ l/ {1 l) A2 n; P* l
                printf("b is %d\n", pshreRAM->b);+ X0 j) R& m: o- C  X; G
                printf("count is %d\n", pshreRAM->packet_cout);6 I( w! \) t1 x% ?9 [( ]# M! |$ t
                count_copy = pshreRAM->packet_cout;0 s' k& g. T: [6 l$ {' D
        }
. ~- R5 P2 V# J        else
  g/ z0 p( ~. E. {& |( f        {1 o8 H3 D: _' G0 C
                printf("No effective message!\n");& [, ~% t9 l  {& o6 j
        }& d; f3 J  a  r: C9 h; y
}5 M7 C7 v, I2 @9 M. ?

* @: y# t8 y, E0 w3 \! r没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 R" W6 H; N) Q7 Y: `; q7 O' ~+ }! I3 n% X8 T' C" _/ W# z

  @! X3 a& v$ z5 }/ K
  w1 I5 n6 p3 K- f
, H9 ^+ ]$ [9 E3 q7 x$ [2 ?# r
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 06:20 , Processed in 0.048210 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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