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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 ?5 e( T! R7 Z7 \

) H$ c2 |, t2 n; b; P3 nOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( Z3 Z8 q6 \9 u& |- B6 p3 h& _
#include <unistd.h>5 s+ N5 B0 F& C  C* O
#include <sys/mman.h>1 \- p! c% A+ {! u* ?
#include <sys/types.h>
  ~) k" J& h9 q- m% W0 S  B#include <fcntl.h>3 ?$ T9 j  O2 I: o$ `' v) ?7 D- a% O3 j

7 H$ f! j) @9 o#define SHAER_RAM_BASE_ADDR    (0x80000000)   
6 B& N6 n5 \$ O: b5 g, T" ]* p4 f* q% X. U* L
typedef struct
9 |9 M' y: s# m0 ^' K- i- X{/ \4 I  U8 s1 D* j3 O( Y
        unsigned int a;
. i9 c1 K' C5 e2 d1 f        unsigned int b;
' \- x: I  a1 s) h% @2 d        unsigned int packet_cout;$ W9 ]  b5 p( x6 I5 v( }9 n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ J2 F9 S- O" e6 W5 w/ a

& z7 H% j! W9 n" b8 ~2 b  t/ a  lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 G% Q4 u0 t' x* P( a
unsigned int count_copy = 0;' n. l7 S6 n  \: a& V% a% @2 Q

% a* b- A5 Q9 J+ }' G2 |1 C9 w: I* Q$ d2 P! c7 w9 X
int main(); ]' i! k/ Z9 }- y$ Z7 U5 P
{; B2 z" c* G; _, ~
        pRX_MSG_PROTOCOL pshreRAM = NULL;! W( M6 K+ N0 m, Y9 }
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- |2 _& k8 @* Y$ X7 @
4 N+ q+ @; U0 e6 b" ~0 S
        while(1)
! [0 c9 H! I' f5 A  y1 S# C        {# |* i! G# V& {& G5 E
                read_MSG_buffer(pshreRAM);4 R- Z4 i( _) ]6 I
        }                , ]8 D% ^. p; U3 e0 c1 ?! j
}; F0 D  G! {0 E9 Y7 e

4 X/ l5 e- j6 K4 {3 lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); V8 j& [& s% u7 @( q# W7 _: V. V
{0 S. I( v5 s4 d0 P  r; N9 D4 R2 \8 e
        RX_MSG_PROTOCOL buf;
. B$ Z" A# u$ S        
) A. d: {. h6 h7 w  C" E% j* N        buf.a = pshreRAM->a;
& N' ~! f8 K  J+ }        buf.b = pshreRAM->b;
# ?8 K/ m$ Z2 a' K3 N+ l& U$ J* A        buf.packet_cout = pshreRAM->packet_cout;
8 T$ j3 r+ I. W6 j        
2 j+ E2 k& y, v6 v% P+ Y        if(buf.packet_cout != count_copy)
. }2 J8 P4 n7 P2 t        {6 O, [; S1 `1 ]2 i
                printf("a is %d\n", buf.a);
& j( A6 z3 d1 r6 Q- b+ @0 L                printf("b is %d\n", buf.b);
- i7 t+ N0 x! Y' h7 Y                printf("count is %d\n", buf.packet_cout);; j- h0 V6 l6 i; c9 Q  ^
                count_copy = buf.packet_cout;
" I9 p0 D  s' O$ U8 d        }& Y, C  t6 j1 c0 [
        else) N0 A* R" {* ?( v( [0 ~3 i" ^
        {
8 E# T1 u! Q/ T# e3 C2 j- z, f                printf("No effective message!");
+ Q1 d% M1 U3 ]7 n        }+ W" n6 @" H) R( Z3 m7 k+ i
}
0 J3 c) ~. n8 O% G/ y) @- F& h; P0 e/ o( W# j2 G  S9 B

. B$ R; @- y7 m* O但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% K9 t4 H7 s  I5 q3 c! y使用下面代码,对内存使用了mmap函数后:2 ~8 C* L5 z8 g, U/ \) j
#include <stdio.h>1 m, L( y1 c) x& W4 ~
#include <unistd.h>; v, E6 h. X7 z
#include <sys/mman.h>
% g# _6 c+ L) G" L. n#include <sys/types.h>
% Q9 K7 B1 F3 I7 s( |2 m#include <fcntl.h>  g+ _: y" E6 _+ J: l5 j6 V. F
5 w  _4 |( Q8 {# B% D
#define SHAER_RAM_BASE_ADDR    (0x80000000)1 @  H8 q2 f1 O
#define SHAER_RAM_SIZE         (0x20000)   3 F) X' C; m: v
6 |# O( H3 b9 E! |0 K
typedef struct
8 I2 J9 C& u" e; j* b- s{
+ t9 P" N$ A. I% K) Q$ Z        unsigned int a;( p6 v0 U' r$ s6 Q( G
        unsigned int b;! B6 b. x! I0 {9 c% H+ ?0 q
        unsigned int packet_cout;
- j  v: y* [, P2 v& P0 L+ V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) [3 }9 R) D; Y2 f/ E
1 `! b; w/ _7 ~- _
void read_MSG_buffer(int *baseaddr);
& a- w! F# o5 h/ V5 a- \, x4 H' N$ dunsigned int count_copy = 0;
8 s" e$ n, S% X7 i/ j0 i" S# s. @# _6 D! p. a  _& V7 D( R
int main()
/ f, F* i$ O5 z' S& q) m# K{8 B( B7 P- ], C9 a/ }: Z4 k. N" z/ E
        int fd;, ~& c9 ?3 W, Z: d, N  L- E
        int *mem = NULL;
& n( J6 b+ u+ h$ [
- V5 \0 H$ Z8 m6 _        if((fd = open("/dev/mem", O_RDWR)) <0)
- A2 N0 T: o9 t% J" P1 D9 z        {
& h- s* J7 f# M5 K                perror("open error");
+ |9 y& {" U9 P7 D7 r$ V6 P                return -1;( w0 O3 _- k. ?) w* Q# C
        }
  Y9 x) v2 F) E" F% g$ G        ) K$ x$ H& v5 Y( ~- s- h
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% \2 q/ [( s; [. X: g% L) g. u. x, E0 S7 w$ B2 N' ?
        while(1): x; ~, t, {2 l* g* n( Q0 {2 i. ?
        {; ?: e4 r, J" g8 p& I' Y
                read_MSG_buffer(mem);
. Q% |+ c4 v! {# Z: H- b0 g: _        }                + @) R9 N% M& U, O% u
}: M. v8 |3 T& `

. ^1 T5 e* I. b1 G! H1 g, \. Dvoid read_MSG_buffer(int *baseaddr)' g* @+ o; V2 k, F# v
{
! A* l1 j8 D4 `/ l7 {        pRX_MSG_PROTOCOL pshreRAM = NULL;
. y! T' C" ^& L+ l' D# J; ~  U  i* e8 o. D; |) \+ b- v% X6 O
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: m/ q, @2 x- S2 S: F/ i& q
8 ?( _5 n/ I# V  I# w8 Y        if(pshreRAM->packet_cout != count_copy)# H8 X" [/ L0 R. z% ~2 a
        {
; }, Z3 Y' d9 r  T! [# W5 \                printf("a is %d\n", pshreRAM->a);. `8 _( l/ u& W5 m
                printf("b is %d\n", pshreRAM->b);4 s* t- c7 z3 Q! r8 j: ~  j
                printf("count is %d\n", pshreRAM->packet_cout);# E  y* M6 w" o8 w  R$ v8 ~9 y
                count_copy = pshreRAM->packet_cout;6 K. R6 y0 c, D9 J6 G
        }
9 K' B: i9 w7 W% U& q+ H8 g        else. a! Q; M/ v$ a1 P1 X
        {5 j; A4 z, x$ a+ s
                printf("No effective message!\n");3 D$ ?9 k' `. Z5 M) p# z( K" z
        }) X2 e+ l1 t) w8 B% I% R4 s
}* Q. K6 @+ I6 Z2 w8 n" F

6 ]. ?% o# I* U+ N. ~' d没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: _$ ~6 z9 g9 C/ C( ~* ?( k
+ B- P0 C' N" w4 b6 X4 }
8 @$ q% ~6 T. X+ S" [
5 m! T" b& C  w' Z- w- l' {& n" W( m: [1 G0 D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-18 05:21 , Processed in 0.038431 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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