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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , ?9 f9 _& r. s' Z+ b: o7 W/ B

: w/ E  [. y2 F3 q( X9 vOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; r3 L; M: {9 z7 j  [' S* T#include <unistd.h># a0 E# g2 \- G% C) \7 W6 A8 A, T
#include <sys/mman.h>8 p: q* b, o; _7 C+ R3 X! @
#include <sys/types.h>2 C6 v# Y0 t  u
#include <fcntl.h>/ M5 z: [& G0 i  G
- n/ g  T. |1 i7 V. t
#define SHAER_RAM_BASE_ADDR    (0x80000000)   + W8 Q( U3 R8 z7 H

. o* S# S! [( Htypedef struct, Y1 b3 s& Z) B& z' ]/ X9 L
{; \! O8 S( f3 e& r& d$ h
        unsigned int a;7 D! ?* D+ e# Q  b( O/ }# k% X
        unsigned int b;" W, C6 C/ d) Q- m* H
        unsigned int packet_cout;
6 |" L1 ^1 Y  D3 J0 i+ {5 F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, G) X7 W2 ~. v+ V, V: f
3 s  B: q) a+ W8 ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 S4 Q8 U; ?& \1 r2 k' k4 P& m2 S6 @
unsigned int count_copy = 0;
; i$ |( N" j7 a$ v, x
  }9 K- E: u+ b$ b/ f) u- @2 R% J/ z5 \& H6 ^+ _9 y- }
int main()
: @. L# c) C2 j/ T% W  B. L9 i{
3 _, m; h% C" S; x* p1 G0 w+ P) B        pRX_MSG_PROTOCOL pshreRAM = NULL;
! G( q4 h! m: m* C3 g7 @7 n        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# I/ G' U6 R) G* Q. v+ C, ~
% {% n( }) m# Y        while(1)
1 N: \/ I# T/ [8 j" b        {
' E; \1 g, H1 H3 `7 w                read_MSG_buffer(pshreRAM);
! z% m- i& z/ B4 ?  M) T        }               
* s1 Z2 {5 b- U* O$ _( p}) c, k0 i5 _1 W2 Z3 J% U. I& U
1 @# L. ^+ z$ u& w6 J0 D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 H) ^: U! _/ V5 _" ?; y{! Z1 u! ^9 u  G5 g4 b
        RX_MSG_PROTOCOL buf;
, n* C2 n/ |. k2 p+ o; I          ?) S  h" a" i( u) K) W+ |
        buf.a = pshreRAM->a;
- ~% U: S. J6 E9 e        buf.b = pshreRAM->b;0 k% z/ M; K$ p7 |: m
        buf.packet_cout = pshreRAM->packet_cout;( T" ]. M: R" r7 |
        
8 a! V, K! a& K0 F% ~4 T0 o+ Q0 J        if(buf.packet_cout != count_copy)
* P5 m; C& v3 ^0 q, J. y6 h        {1 o4 u& _- T8 h# j' B! L. i6 ]! N7 S
                printf("a is %d\n", buf.a);3 V9 T3 C& _; B3 t+ ?- g
                printf("b is %d\n", buf.b);4 @$ K; G# k# d
                printf("count is %d\n", buf.packet_cout);
" o- I8 v0 d% w, o: `) l0 s                count_copy = buf.packet_cout;* _2 G7 {( F! p6 e2 X
        }: g! ]/ p% ^- L3 s& q* o. a, ?
        else
2 D' Z! J2 V$ F8 ?  o3 u( P        {; x$ G6 j, P3 a& H: u1 r) T
                printf("No effective message!");4 h# I2 G: b9 }# a3 O
        }
  K9 ]& n5 j3 `  a) U4 h0 A}9 r$ Y( {+ X1 q
9 [. p4 Z0 ~( ?1 z4 ?* c+ G

+ S" y# I9 A. a7 g' ]) L但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ j5 G. U, F9 G使用下面代码,对内存使用了mmap函数后:
/ `6 H) l3 L! _) c2 I( S/ ~* H& p#include <stdio.h>
0 ^" [: y* \& e  m1 j# l0 }#include <unistd.h>7 h- }( ~, B. {2 n( M
#include <sys/mman.h>0 z( g. ^5 _0 ]7 x( d9 F
#include <sys/types.h>
) w2 f( X1 P* l4 }& ~: ?0 x#include <fcntl.h>
* R% T1 u) t- {: r
3 T, S9 p  |, O( U5 Y$ q" U7 B#define SHAER_RAM_BASE_ADDR    (0x80000000)
% x$ z+ N+ n( T$ Z/ q#define SHAER_RAM_SIZE         (0x20000)   ) a3 L$ o% n* i  G$ F" M
& X" i5 i6 c% P$ R
typedef struct
1 T' b7 I4 @# X' U! ~3 P{9 u7 a; h7 J" M7 e  T
        unsigned int a;% s) y8 x! |9 C# V
        unsigned int b;+ ?. w; G& I2 U) F
        unsigned int packet_cout;
( C3 i7 E0 ?5 R& M* V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; }  L5 E) ]* P8 D
, M( m$ e$ E; L& w& y% R; d( u' Evoid read_MSG_buffer(int *baseaddr);
) t. Q  Y# G" _# y6 y# ~unsigned int count_copy = 0;2 o' w3 [7 ?) }: F- m8 }* Z
8 F) Q# k; M# R+ Y# Z; Y6 p( o4 ?+ b
int main()1 A# Q" {. t1 W9 c3 Q4 \$ S
{
" Q6 F) C/ }  Q" X$ j6 o        int fd;
) z: X1 n0 Q6 m; s        int *mem = NULL;) x# u% P* ?1 \# j4 C6 S
- k" ?  d# q) k1 v6 `1 W
        if((fd = open("/dev/mem", O_RDWR)) <0)
& {/ P, K! {* @        {, K8 p* \9 D) m1 }
                perror("open error");; _5 X* k' ~  G3 a0 y
                return -1;
1 e& C/ P/ f/ z, I+ v1 M        }8 c1 {' o# V6 j2 H
        
( h- _3 \# A% l& |( k        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);7 F8 Y3 [: j. c2 M# S' N+ A
# u: S( R2 L1 M: @$ c
        while(1)
$ w, s7 f+ g0 B8 k7 G        {: d* m6 C- ^1 @3 Y! d! @
                read_MSG_buffer(mem);& e  |, b9 t3 J, R6 i* T/ K
        }                & u( R3 M7 v/ g: ?5 [* \2 O
}
7 V( G8 R7 d" C( v5 H  X- j/ ]6 r$ P; g% F+ f3 P
void read_MSG_buffer(int *baseaddr)
2 W9 Y6 ]5 P& W3 X2 F$ Z/ |{
- r4 w' F& W  C6 z1 q$ p        pRX_MSG_PROTOCOL pshreRAM = NULL;6 p* w! k: {4 J; [# ?
, K& r; x) S' a
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. K% |8 v; o8 y, U% D( z! q0 X1 z: U  v+ R
        if(pshreRAM->packet_cout != count_copy)
+ t; Z+ `9 N' i- g7 S$ i        {
2 q+ }& `3 p/ {1 u3 ~                printf("a is %d\n", pshreRAM->a);. Q1 t7 r4 s. S3 e! o
                printf("b is %d\n", pshreRAM->b);3 B4 F- }% `8 L. C9 K
                printf("count is %d\n", pshreRAM->packet_cout);% T/ U$ t& P5 V, d; i
                count_copy = pshreRAM->packet_cout;. V! Z+ t; c0 Z' Z( m
        }+ _* j, n$ u% z
        else0 t6 v' m4 M. E. C
        {5 H+ G$ Q$ I+ W3 S
                printf("No effective message!\n");. q5 v- D4 `4 @! R$ _, [- S
        }5 m0 }9 a* U# `  W% c, }% a
}
# Q7 ?4 P( d* {: G: C1 C4 V$ @+ ?' {5 H
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; ^5 M6 ]( o! W
$ V. u+ F5 g0 I3 s8 `) }9 l" B( W2 o- q4 ]9 {: M
7 c2 U' L" g) N$ P/ t* O4 x1 x  }- W! F
6 M2 ~. b0 H+ b& _2 x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-10 03:02 , Processed in 0.045101 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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