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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + ]9 [5 S  }& j2 S! O2 R- W

) c  B2 E0 R  O6 _' BOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 u! t' V6 `* m; U" D, ^8 [) a#include <unistd.h>$ T% p# C6 A. x- u) |+ R
#include <sys/mman.h>  H9 `! u6 w( s6 A' ~3 }( M
#include <sys/types.h>
& u0 |9 k' k, s% x#include <fcntl.h>
) {* ?2 b5 x' k
4 N6 ]. E9 Y9 I# G! \8 i; Z- A9 H#define SHAER_RAM_BASE_ADDR    (0x80000000)   
# v& y2 X  X4 }. l  _
5 W5 ?- E5 e% ^- Ntypedef struct) ~+ r( n8 s! f+ l# u
{
$ F. N) X( T. L; U# r7 o$ L        unsigned int a;
. S9 b6 [! x2 W6 f, y+ _        unsigned int b;
# w  s/ v6 ~* p8 M9 p; t6 o' \        unsigned int packet_cout;
4 ~) n: Y# }2 @7 H. x2 ]9 k% R5 h}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: y* n' i. q) {7 L+ R- \7 m& ]4 g7 D* l9 x7 L3 J+ [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 G( `( c. C% R7 Wunsigned int count_copy = 0;
) _+ E4 p7 L! {$ k% f9 w% j% f, n9 Q* Z+ ]% W$ H. U1 Y! H2 \, R) Z
; o5 c) D( S& Z* U
int main()% e5 r* J$ H8 j2 D7 P9 t% h
{& z) J" O5 H# i
        pRX_MSG_PROTOCOL pshreRAM = NULL;7 c! \( ^) E3 o9 x
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* l* O# D( N: r" Z
6 O$ t* H/ z) ?7 G  b        while(1)' E' i4 Q* j/ d, \
        {/ K' ~- S) N: R$ R2 {* ]
                read_MSG_buffer(pshreRAM);% P$ T* @* x% ^0 v
        }                : b+ r% t* {/ i3 |7 A$ m
}" [  Q1 `, j8 d2 z$ P% [6 M" n

( ?+ m% \/ e' a2 k* J; rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" P4 h, h6 |  e: _{& P( _, W1 m0 E6 _0 X
        RX_MSG_PROTOCOL buf;* ~# S' t8 c1 @# q  {0 o& a
        ! K: W% D2 w7 E6 M5 r: Z
        buf.a = pshreRAM->a;
5 h9 G0 j( t, D        buf.b = pshreRAM->b;
% H- }( R) m4 ^, n        buf.packet_cout = pshreRAM->packet_cout;
9 O$ {! H" F' Z7 U        
0 o, [; B2 n& c; z& D        if(buf.packet_cout != count_copy)
( }2 j) O5 t) C3 ~8 J4 s        {
% z* Y7 Z4 [/ V& j4 U                printf("a is %d\n", buf.a);) X* d$ L, C! V0 e6 X
                printf("b is %d\n", buf.b);
% L+ }1 R* E. o- R' H                printf("count is %d\n", buf.packet_cout);5 A6 N' f" @  L, t7 q5 a( ~2 M
                count_copy = buf.packet_cout;5 u8 l% ~" f, J0 k
        }% z! `& d0 u. m' j: M
        else
$ _, l% l- l* A2 F( g        {
- B; `/ h, ?6 d: \% G) b4 o( F6 m                printf("No effective message!");
8 n3 j; B. s/ P3 \8 r' d        }
! v. ?: w4 |" F2 f. Z; m}1 D% g# K! n  i. d, D, ^+ m4 @( ?
. c3 w. P# A8 ~. [/ c$ m0 A
3 B! d, H$ b1 K  G2 N0 d0 X
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) T1 }; ~( z( v+ c( @
使用下面代码,对内存使用了mmap函数后:
$ q+ h& g4 p, s% w( M/ S7 q#include <stdio.h>" U3 h+ f8 H, @6 q$ u
#include <unistd.h>
0 j$ B1 N! P& c0 b2 E. m! H#include <sys/mman.h>7 t; x' D( M$ P# Y4 F
#include <sys/types.h>1 I8 M( A/ B4 ?% W. @
#include <fcntl.h>
: e4 z0 p& {# X, O( q6 Q6 h- [( \4 l" y$ }
#define SHAER_RAM_BASE_ADDR    (0x80000000)* G$ H/ M% p9 }: I7 f
#define SHAER_RAM_SIZE         (0x20000)   ( N! Q2 o' f, M0 F
6 Q3 F. u# H0 H& `/ P, \; T! K0 J. X
typedef struct
2 ?* z& y9 }( D# y4 b# w2 Z% Z{$ L7 e2 ~  V# o& {9 P. f3 S
        unsigned int a;
; S8 m+ T; ^' ^9 [        unsigned int b;0 Z3 b: L0 M7 x$ r: q! u
        unsigned int packet_cout;
7 \  z6 S( U& y5 Q( N6 M  t2 a}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 L. d/ {; r7 U& E/ T9 L

) O& |3 g$ F  |# [' lvoid read_MSG_buffer(int *baseaddr);
" r; F* l2 ]3 U* c3 B$ W. `. junsigned int count_copy = 0;& r9 l( d" e. F$ Q  k

* r$ \) \& N7 L  p' {7 s# [$ Q9 bint main()! f2 x! j/ J9 U( P" E
{
! K; G; t5 p/ ^7 _0 _0 x- \0 E+ N        int fd;! N. V, R  s& I: n
        int *mem = NULL;
; d& x% c. A7 B, _+ Q7 J) z* l  Y5 n! u: |) w
        if((fd = open("/dev/mem", O_RDWR)) <0)$ ?* Y! v+ [  Z6 r
        {  E- c+ @, @3 s
                perror("open error");
$ m0 s, d: M, P6 K0 Q- G" b, _$ v# _                return -1;! G" \9 d9 B6 ]; ^3 J6 Z+ ^
        }( l# ?+ i1 n7 h" Z
        
( h) E8 T" s2 F$ Y2 _& D8 |        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);9 ~, q: h) E: A

  S$ y! s5 @$ s/ R8 b4 S4 D        while(1)
( g3 K6 O8 Q2 Z2 W, |4 H$ v, t: P' g        {# }( c5 C  ^" B9 _
                read_MSG_buffer(mem);
% D% ~* G, r, H# M8 P, Y, i* t' ~        }                . A0 u- _' f* r3 P) s4 t1 s
}& ]! l' s2 K9 ]# O0 g# I7 H: g

& V5 N7 t- K8 l1 w4 u- B  Avoid read_MSG_buffer(int *baseaddr)
8 @9 K& A8 ?* F. _, J$ R' g{0 t! n5 u) C  U: X6 }
        pRX_MSG_PROTOCOL pshreRAM = NULL;
% I" \: Y) F$ s; E# Q2 p* C- T& Y5 m) a: b9 ^7 ~9 r, w2 ]
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( |( M" |7 q. K% B# g" S6 o. t
" [. |& w& H" e, {( j        if(pshreRAM->packet_cout != count_copy)
) B$ E& V7 @  V; o        {
& {9 Y0 j. }7 a- }- @; v  v                printf("a is %d\n", pshreRAM->a);
& Q* t% `3 c( f, b1 i; x. B* o0 i                printf("b is %d\n", pshreRAM->b);
+ v; U$ Q" S% H                printf("count is %d\n", pshreRAM->packet_cout);" {. F9 Z9 b  M) R# E6 h% K
                count_copy = pshreRAM->packet_cout;% V  ^) E7 P) X& R
        }
0 s+ \6 ?& Y& v        else
+ D6 Y% u+ T; D6 ^2 K# _        {
% ?; P: U+ g% c2 ^                printf("No effective message!\n");+ t* S! Y$ F" _5 G
        }6 r' Q/ G0 P9 o* J1 @4 n" n5 r
}! u$ `0 G1 M2 H
# a( s0 d$ b. r3 Q2 q. B# m! ^
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! w7 p7 _/ Z( X0 y- A: m, M6 {: Q7 w
; p3 v; J, H& e5 Z2 ~: H
  a6 U1 {. D; j% z& D
; [2 W! M" m# p, S4 V( b# R
/ q0 j- q" V1 x, m" Z- Q/ u7 V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-5 12:50 , Processed in 0.044090 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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