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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " G6 @  `- M- b+ w8 L: g" m# `( q
: q  t& i' \/ ]$ F1 Y) u+ y! i& K1 n
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) j9 F/ X' _0 k) Q8 X4 M
#include <unistd.h>
% i' c6 w6 ?$ d0 R#include <sys/mman.h>  Y1 ?$ Y4 n- w; k7 U- [* u
#include <sys/types.h>
5 t4 E7 S/ V! O# H  @9 s#include <fcntl.h>" T) c; ^$ @& {: s) y/ m: F

) Z2 A$ S: m: d1 y, \#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 ^- S$ v7 |% D+ C. b3 ?. @
, ?% E- Y% ^3 y0 j8 Y. a4 t/ t$ ktypedef struct
6 B5 ~+ a  _* }  ?" g5 A2 H{
  \) I4 _. f( @: z        unsigned int a;
* |! W7 R( A/ T6 N: c7 c6 T        unsigned int b;
  @) Z$ I  Z+ h. c. ]        unsigned int packet_cout;9 r* E2 I$ i' k" p- S5 i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 r" M3 u4 \: i1 u6 b8 Q
0 \3 e8 }0 v) ]: ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! k0 c: n* `/ H& Y/ Junsigned int count_copy = 0;, S* w& g" _7 }& U0 U. ~; O
$ y" g* d4 j  n5 p- m$ D
0 r3 f' r9 I: k. L! D
int main()8 f* ]" V9 u/ ]6 U9 N: k8 A. \1 U
{
% ~3 A9 q0 R4 \; [+ K        pRX_MSG_PROTOCOL pshreRAM = NULL;, g* D2 i+ ]$ M( R( [) U6 H
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- @; J, Y6 F- l. g, k; X! D! v! X4 z$ Y
        while(1)4 C4 ^5 L+ [( C2 p8 F" m
        {# @, |2 Y# Y9 C9 z
                read_MSG_buffer(pshreRAM);
- K1 S3 \, ^0 P" F! x. t9 f        }               
* U/ g/ E* d1 T. K}
; O$ q& ^3 {2 h- c; I; c. @  Q& d* f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 o4 O( T' B! ?8 Y* `% X{
" {0 n2 F9 D& e        RX_MSG_PROTOCOL buf;7 c) z. B) A+ p1 z0 N, H8 c
        $ ~3 l5 I4 g+ Q/ Y. ~: u8 m
        buf.a = pshreRAM->a;' |& [2 q. _+ {' d: w( r2 t
        buf.b = pshreRAM->b;
9 \2 V# S4 ~6 Z. i. v+ Z        buf.packet_cout = pshreRAM->packet_cout;
) g) Z( M' B& a- S3 }- c: U        
1 W5 D$ l5 ]$ k$ A& |        if(buf.packet_cout != count_copy)( a. D2 r( ?6 t5 }
        {
" [7 [$ o6 L3 S7 o  n1 {                printf("a is %d\n", buf.a);1 u" i0 g. R; H4 S: X
                printf("b is %d\n", buf.b);, g: `+ W$ z& X6 I( Q8 H
                printf("count is %d\n", buf.packet_cout);3 J" Z- Y0 `# i
                count_copy = buf.packet_cout;
' |' ^+ l+ c' {% y; e  w        }
8 u* o1 H; Q  ^$ _/ V6 T# |, M        else
8 d, H* b# q: @$ I2 T9 x        {
3 D, v" G3 e, e1 F                printf("No effective message!");; o1 }" S" Y3 Q9 s
        }- }9 X2 \$ [$ E0 H/ l$ W
}- q  x% D0 ^( F3 O$ t

" ^. T' M& L  t9 k8 p
4 e0 U7 y2 ^; M* ~但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 U1 F/ O: q3 S使用下面代码,对内存使用了mmap函数后:
( u: m# G8 D4 U7 n- d#include <stdio.h>9 N% L) l% K; x3 F5 k: W
#include <unistd.h>
4 q! G# |  P" e# E7 O' j, ]( m#include <sys/mman.h>  U6 t$ K6 n5 ~- i
#include <sys/types.h>+ [# S% ?( @+ G" y! `. D
#include <fcntl.h>
, L) [4 D; y! D! y' p2 H5 ^. F/ t# {0 G3 x/ j& Y+ e
#define SHAER_RAM_BASE_ADDR    (0x80000000)
( k/ q$ \" @; E6 y5 K1 ?#define SHAER_RAM_SIZE         (0x20000)   % _. T2 U' m7 `8 W( b0 P0 G' q
2 F' b& |% ]3 j9 w
typedef struct
1 g$ i% H$ R5 d7 X( V, @; N1 g2 f{
  {. c( B% O$ {! U        unsigned int a;2 d) A& x0 c1 Q/ u5 N5 l& V
        unsigned int b;
1 N" S& Q2 s+ o# `5 f6 W2 }; T$ a  \9 ~        unsigned int packet_cout;
/ a. t" k/ L% q! F5 s/ n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 f& I" J6 \4 n; ]6 S6 v! M" q2 ]
: E) p( Y& ~) M( b  ?void read_MSG_buffer(int *baseaddr);
1 q7 l$ i; w/ O( tunsigned int count_copy = 0;
7 e% w  V' Y& u* t7 ]' @" v# H: k( ]3 ^4 t& G: F- o. g8 V
int main()2 Y1 \& ~! B) n" G
{" B1 Y/ d, V* B+ q; s
        int fd;
/ |: }; K  O' H# |- b        int *mem = NULL;. I$ E7 Q% H; P+ W. I! f' W

4 d* C  z0 n, O0 c        if((fd = open("/dev/mem", O_RDWR)) <0)0 n9 H4 G4 @- }- K: O. a
        {
3 x( H( z% |" Y- a- Z! v                perror("open error");
& @) F# B; c$ H2 T+ s                return -1;
) q( \& \- R. \: I) r6 M& X, O        }
8 Q% _5 y1 K) Z        0 ?3 R# A1 o3 ?
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 ?9 y3 q; W$ M3 g4 `. k0 s  \
7 G/ R  }9 e+ O* X# _/ I        while(1)
! V6 q" B" E, h        {- D; c5 c# Z$ @5 I: E5 T
                read_MSG_buffer(mem);
  k( h$ m( q* {  m        }                2 A5 H9 t7 l" h% w( A
}
5 d. F" L( C% |0 d
& i) p* Z9 ^$ y8 a" Vvoid read_MSG_buffer(int *baseaddr)" d! d0 Q2 \1 s9 B
{* ~3 y( F7 E3 u: V! q" q3 ?
        pRX_MSG_PROTOCOL pshreRAM = NULL;, y" S8 j" t  [+ b; O
6 `0 R9 N: ^; Q: f
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 O4 L* F, d& |  G

4 e9 C# m$ C8 s1 f        if(pshreRAM->packet_cout != count_copy)
. p7 v; \& v# x" S: K5 f        {
7 C- U* ]( z6 z# P$ v; A: k( w                printf("a is %d\n", pshreRAM->a);# M$ `2 G; Y( y5 n( F
                printf("b is %d\n", pshreRAM->b);, E! j0 I) t, i! @  A. S9 A) q
                printf("count is %d\n", pshreRAM->packet_cout);
  F1 P0 a8 {/ I3 {% g5 Z$ H                count_copy = pshreRAM->packet_cout;3 ~3 j" h6 ~" }2 y1 q% t
        }. G6 l0 b$ s  ^3 H2 O9 N; ?
        else
$ s, D6 R& k3 l* _) c. x8 d        {9 L  e' ?0 D$ M
                printf("No effective message!\n");! i, a3 C' K# X4 x1 u2 {* y1 n
        }
# l" a& s( M/ C* S( j}
' Z6 q$ d5 ], r; |+ Z
/ N: G& P7 ?, X( j没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, j! n/ ~  t3 a& F
# }( ^" @) D( G
) G5 ]& V) {" Z# e
0 k4 c  H; x' q6 a( `) e0 P% x
* K0 S+ p/ p# L% k$ ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-12 18:45 , Processed in 0.038587 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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