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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 U/ C& }' t+ J& J" k
  k- w' c6 e* p! A( H1 ^- UOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 [2 d# `  P: h( ^: g4 _: s
#include <unistd.h>* `5 k4 s3 ?6 n1 d( t
#include <sys/mman.h>
8 m4 q. ?1 V5 d" n# _3 D#include <sys/types.h>( P' f$ C* Q, i2 c; }6 g, h
#include <fcntl.h>
, C/ X& O2 I: D& K* c$ H" v
& z2 W3 {& w& @5 |+ V$ b#define SHAER_RAM_BASE_ADDR    (0x80000000)   ) I+ i, Y& ?  [8 z
# a2 V  J$ X7 j  w0 N" i
typedef struct" o+ P+ E' c6 U4 S" ?: U# q
{
7 j8 h& w# I9 u1 O# y; `" Z; n        unsigned int a;0 A& `4 W# c2 `; r/ I
        unsigned int b;( n1 M- q$ ~; }, Z9 m3 f# T
        unsigned int packet_cout;& ]8 ^& M7 H0 n7 t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ B" c7 Y: L1 ?9 _
, Q" y4 p) B8 P0 D  [void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" `) b3 e9 P6 u5 R, Uunsigned int count_copy = 0;6 p6 Y* K$ d8 q0 h) G% J$ e

' e! X! }# z" ^/ x" z1 G/ H6 T3 k
( g0 ~7 K% m) m5 F9 J/ O( G  Lint main()
9 a3 {* U2 v) N0 q; l5 p4 O. Q8 _- n& s{
0 |! _4 j  G. ^4 j; t        pRX_MSG_PROTOCOL pshreRAM = NULL;8 h7 Q) V% l& x! K2 N" C) z
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ W6 n. s' G. o; L
% H0 z9 \! C* c8 r- |        while(1)
6 ]2 i" L% D, r- ]7 N: g6 N. B        {7 h' ~- E* e! O' Q9 r
                read_MSG_buffer(pshreRAM);, a  U3 e$ t5 G1 s; P4 J
        }                5 o2 W% {* x$ x! b7 _5 U) s
}% ^" H' g! A0 h- c) _# h8 V

; @' A) h- g8 i& \7 i+ G2 V  _2 Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 S& o$ l: c- F4 a
{
- C4 e5 o, r+ ]- q/ J+ @        RX_MSG_PROTOCOL buf;, n" B/ ~) D* @! l8 o
        
# `. ~6 k9 j) Q' n) c        buf.a = pshreRAM->a;
8 y2 @: R4 e# z. `' v- ~. e) W        buf.b = pshreRAM->b;" r; o2 @! c! Q: Z9 Q# m2 @5 q
        buf.packet_cout = pshreRAM->packet_cout;
+ i  z/ Y& n# M          Y! Q, n3 t3 z5 c
        if(buf.packet_cout != count_copy)4 u4 X# {$ ~9 M3 P) H  M0 C
        {4 m; y. y2 u4 C  }9 p1 u+ u' x
                printf("a is %d\n", buf.a);1 z! k) |1 F0 E9 x3 E
                printf("b is %d\n", buf.b);
1 `) ^2 D6 U: V' U9 C                printf("count is %d\n", buf.packet_cout);) w. s1 |  e7 m" W# \
                count_copy = buf.packet_cout;
$ }9 Z( a: c  c        }
* B( i( a' g& }, Q) r; g        else
( _4 X* }2 T0 b2 Z9 c3 S        {' S& ~; x4 g$ Y
                printf("No effective message!");3 w4 u  V2 K7 @5 I
        }
4 Q( x( _4 E$ j4 [* J+ z}5 w. |! @8 T: @) W
4 K9 `* j3 J+ {$ P& Q) l

0 Z( U) E- e* W/ F! l7 ]; _但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。. M* c! l, `( _6 @
使用下面代码,对内存使用了mmap函数后:
2 R+ F: r# W* v+ w4 l6 |#include <stdio.h>
2 t; ^4 }% `" o# N2 X3 x8 B; S#include <unistd.h>2 e8 D2 }  R; S- z! I8 X$ O
#include <sys/mman.h>
% b" b, }5 h+ g' ^% i, B#include <sys/types.h>2 `) q* v( a$ E
#include <fcntl.h>/ E' y# j$ E6 f. E- r
& g. h: Z5 r$ N" L
#define SHAER_RAM_BASE_ADDR    (0x80000000)
# d& g1 `! K" s#define SHAER_RAM_SIZE         (0x20000)   
9 y7 L. D5 R/ x% ]3 J5 b: o
9 ~& d% y# D+ l' Y: m9 ftypedef struct4 r, L1 U8 g4 Q" i
{! s/ G1 ], M  ?  o' J
        unsigned int a;
6 l7 O% W" q  ?        unsigned int b;$ H/ |; j$ y* C! a
        unsigned int packet_cout;% e' _2 k& d: r0 L( G, z, a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. Y2 _. V: i* p+ M( E+ ?7 x
2 _. t' o  h( @' k+ x  `void read_MSG_buffer(int *baseaddr);
9 Y5 R4 I7 N5 @0 C* D+ {* V+ r* S; u8 xunsigned int count_copy = 0;
3 w5 C6 X9 h9 J5 x. O! @) U2 C8 D: ^/ }7 m4 I
int main()4 R, C# _1 ?8 u3 ^
{! c& C6 z; p; V- B$ O
        int fd;
2 N  P  a1 ]. Y- \        int *mem = NULL;4 T* Q: [4 t- y' M

  {" F3 p7 ?1 g0 w5 C5 V% j        if((fd = open("/dev/mem", O_RDWR)) <0)
4 ?( ?* j' I. c; X7 s) g- Q        {
, G' p) I9 @9 \% k                perror("open error");
9 U8 r8 Q5 \% U$ B) W- s8 }% n" g                return -1;
  U$ c, m$ |6 H5 \% |: C' g        }( P5 p7 i9 e1 t' r
        
" _! g6 t. Q5 N% u        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);% G; ?, }7 E5 _, M& W% }3 s
0 ~5 m7 h  x1 ~' d5 x/ F
        while(1); r4 i% K, e, s# n9 f& z
        {
4 R$ n9 m/ s, V1 C0 w& _8 `) ]                read_MSG_buffer(mem);- N: Z" R6 v- ]# W% v
        }                7 c* Z3 T# w; k6 E
}
  t. |0 D& O! ?4 A9 Z$ B* W- U- _- d, ^5 l% z
void read_MSG_buffer(int *baseaddr)
  m& N, c1 r  N3 q) A{0 B3 Z% W, o! I" a
        pRX_MSG_PROTOCOL pshreRAM = NULL;& L; `' b8 e, w, W; m2 }
" C% G7 ]( s0 J- d
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 g4 F) }# R  F; r) A; f7 h  d/ i  h3 _+ H8 i/ r' E4 P
        if(pshreRAM->packet_cout != count_copy)
, M# A! U1 D( P) O) V# ?        {
5 W  p8 r3 h! ^- k% [$ ^                printf("a is %d\n", pshreRAM->a);
3 M" O+ v4 O' [/ v) n0 L! n% e                printf("b is %d\n", pshreRAM->b);6 E/ L- J2 z" M$ S$ |1 Z
                printf("count is %d\n", pshreRAM->packet_cout);0 ?  h& ]8 @7 s% e$ b4 p4 z
                count_copy = pshreRAM->packet_cout;
; x4 p  P8 D# ~, n        }
+ S; |* ]2 s& A) J' t        else* i  Q! ?$ N/ j
        {; a- q# Z# T7 T! ^; K8 F
                printf("No effective message!\n");9 J; o* ?( B7 R2 K: k7 Q1 O& a
        }
& F3 O6 `4 ^1 V}
4 U0 \5 E( S7 X0 T1 n; T% v+ B
  }6 v4 P& c. N+ P( T2 |没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& ]+ m* M2 K7 l
6 G7 V3 \' q7 a+ [) }2 R3 p" V& g8 M6 G8 S

  I# o+ f$ Y/ |% F
, m% G- ~6 ], w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-20 11:30 , Processed in 0.039712 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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