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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 ]/ |6 t/ L. u3 @  m% G3 A5 [1 p
0 O* F( J* x' g. v5 e) W& h4 Q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" Q( R" c- P. y' e#include <unistd.h>
: J! m0 d" A; ]9 b" ^% y2 l0 }#include <sys/mman.h>
) [8 M0 i- E5 Y/ t& ?6 Q#include <sys/types.h>( [3 P" L, H$ N7 t
#include <fcntl.h>
% a- u0 Y) `1 m/ i8 ~2 L+ Q) ~
2 s/ A0 w" A" |/ X( J#define SHAER_RAM_BASE_ADDR    (0x80000000)   : [* c# ^, n. V- Z
0 Q. j$ d, a) N. d2 Z
typedef struct
9 s$ G7 {$ T- V0 @/ d1 [* L) |! j{2 |) `- F5 I/ a5 E/ M
        unsigned int a;
! }1 Q) k" H9 j  k        unsigned int b;
( {" F3 Y. X, n+ {1 |; \        unsigned int packet_cout;
! k& ~) @: \3 I: C8 {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( c" Z  q  P9 C& E, C  y* g5 w8 I, Q; v5 g+ ?( H3 _' Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);2 K! Y8 P1 ?. c1 e7 f! m
unsigned int count_copy = 0;
2 z$ S6 y5 m. b! x$ Z) R# ?# G8 K4 t
; K# X1 r, C+ \3 V) s4 s7 g
( P7 R0 {% R; J9 m: R) @int main()
7 w- J0 J1 @1 y$ k{- m3 Q3 I. H& l+ @6 M, V
        pRX_MSG_PROTOCOL pshreRAM = NULL;! I! \/ k# e" ?* Z* j" w
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 [/ \  d9 b- B9 R  ]% k
5 O' m& z  q. n- v& }% ?' n
        while(1)
, I; h4 l5 s2 K7 B2 F        {+ j: j( ^* x7 b9 J; O0 a9 z: b
                read_MSG_buffer(pshreRAM);
) h5 j( Q: i, |* B: s( p+ @        }                ; ?3 C6 O: F( g' X4 X* |& e7 Q
}1 n1 F+ \$ E: I* M, J
1 A4 K6 k/ b( y; @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. u; _' p/ `" h) I0 E; \, ?$ J- b{$ E8 b1 {1 \/ d% q. F" k6 w8 m
        RX_MSG_PROTOCOL buf;
( J9 W1 O* ^/ m8 _( i        
, ?4 k$ C8 O0 g. X8 j- z: _        buf.a = pshreRAM->a;$ d" H# G2 N6 o- V7 v
        buf.b = pshreRAM->b;
, o/ @8 i4 n" }2 Z! Q. {' `        buf.packet_cout = pshreRAM->packet_cout;
# x4 [8 M$ p9 u. J( z        0 m0 d  G/ L& {
        if(buf.packet_cout != count_copy)
3 ?' \" y" _- W        {, i4 ?5 {; Z8 D6 k5 |
                printf("a is %d\n", buf.a);5 Z- G& g" R3 ]0 x, d1 f5 y3 V0 r
                printf("b is %d\n", buf.b);. f: L' o- T' K7 |( v/ E% |  J1 K. F
                printf("count is %d\n", buf.packet_cout);5 O7 y3 `3 Q; p$ U
                count_copy = buf.packet_cout;
& E% I% i& n6 W6 D0 Y# b2 V        }  t( V; z: J( t; i
        else
. j& W3 a) ~7 W, t  ~5 x( m        {( @6 I2 Z5 s" E9 v* B
                printf("No effective message!");" S# ]: y3 G# {2 e, z( N) e
        }
$ S6 N. b4 @* J% \9 l}
0 m" ^: ?8 ~: Y% U% {' l+ @. k7 u+ D

& Z6 e# L; W: @* w- I% K) X. |但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: F  a' Z) _' c
使用下面代码,对内存使用了mmap函数后:
5 L% M  I; p6 G: j* ]#include <stdio.h>
$ U9 R/ J& R9 T* z$ Q) F, j#include <unistd.h>* p2 {* H* M6 A# {8 k
#include <sys/mman.h>8 A" _4 n6 Y2 Z" k: Q: X
#include <sys/types.h>3 _( p- y% w* B
#include <fcntl.h>5 h3 ^+ o$ k3 z$ J
4 f& g' d1 h: {. Z1 l" v2 J
#define SHAER_RAM_BASE_ADDR    (0x80000000)% ^8 e5 G0 e) r' I3 Q- H
#define SHAER_RAM_SIZE         (0x20000)   6 W2 _  `8 |% V: a
) [' J3 ^: @9 Q' f8 a: h
typedef struct; x0 O6 \0 D# z8 `8 @
{
4 c5 D4 R6 i3 m! U9 Q! N1 n6 T" Q        unsigned int a;+ `6 \4 S$ @) y' Z! B
        unsigned int b;
9 Z' j2 v- P: D3 Z4 I8 G, N" t. B        unsigned int packet_cout;7 T" \2 s3 z! e% C% T( c. s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 b$ x3 V5 B+ E, C/ E1 D5 {
6 G; G# g' ~  {. B/ z& P- _% k2 |* X
void read_MSG_buffer(int *baseaddr);( @7 w# R- w/ `6 ?8 p
unsigned int count_copy = 0;( W, _: h6 e4 N7 ~- s  b
. y% U" H  l  f
int main()
' [8 T6 m( g8 v4 A{! z) \2 |2 w1 p' O) L$ @% Y6 `
        int fd;( |% \. y6 D: T
        int *mem = NULL;
- K# m5 n, L1 K! N; p' C  j+ i
/ r% c5 y" {8 \! W        if((fd = open("/dev/mem", O_RDWR)) <0)
- X4 P7 u4 ?" G/ Q9 e7 L# Y" X        {
# \$ H/ E/ E" Z( O6 S                perror("open error");! z9 i; o4 G. G/ P5 p
                return -1;
' M) Z. `1 ?; \& ~        }/ R( \, E2 L8 Q, \  t
        
: N, P3 _3 o) J" W3 I% }. x        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);* {/ r$ t2 y! P# a9 G- H
2 k2 Z$ d: ]1 b; I' I' X- u) V
        while(1)7 g: g) g" `1 p1 a
        {) B, i9 ^( f& R2 \/ Q
                read_MSG_buffer(mem);% v+ l, K, d" O# I
        }               
9 N" x3 F3 I% h! x, X4 R}
! x: _! H4 `) K. a, U# g3 r
  O( Z- a" e3 g5 v0 Ovoid read_MSG_buffer(int *baseaddr)) e) _; H- L/ l: s7 C& w( U. D
{5 t: o8 U+ g3 t
        pRX_MSG_PROTOCOL pshreRAM = NULL;
" e( s, @$ j7 G" H+ o9 V8 y8 E: N  C/ I: m, O4 J2 j" S
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, {6 k3 [8 [. w* G1 [' D
5 ?+ l8 g! I* O9 V        if(pshreRAM->packet_cout != count_copy)
  r1 e; J/ v( h  A( B        {
% [* I& F, J4 i; c7 _+ Q                printf("a is %d\n", pshreRAM->a);
* T* I" q6 |2 d0 s                printf("b is %d\n", pshreRAM->b);0 I2 ?( r8 M7 W- \
                printf("count is %d\n", pshreRAM->packet_cout);  n! y/ [4 }0 x
                count_copy = pshreRAM->packet_cout;: X! U' M9 x) V
        }5 c1 p  `. g; B: H2 {( H
        else6 Y( w5 F: ]. g# N# Z' {0 g* Y, N
        {$ O, B" ^7 W( f) F
                printf("No effective message!\n");
, V1 s5 W- ?* e% u9 g* m. Q        }
2 C9 F: s2 b3 k9 U}
' V$ p) Y$ k0 E6 R* n8 V1 W! Z& |
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???9 O) R' F" u' L2 P

( O3 v0 N7 a0 d/ y" Q  Y! Z5 q! `3 T$ T5 I$ o# h; }8 f
% `8 B4 i( F! b% i
7 [: a9 o: `$ G0 A, ?9 N/ Z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-15 15:14 , Processed in 0.045451 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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