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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 e9 N  L! l' u
/ F; L  w7 J9 J' E4 C+ }( V/ a8 zOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' S9 E/ \! L$ \& {( d! Y3 R& |
#include <unistd.h>
5 A8 K# g3 z- {' f; }) f7 y( p#include <sys/mman.h>( \( f9 Z& S! _9 {
#include <sys/types.h>% o9 S3 N1 E% e. c! l# H
#include <fcntl.h>
  ]6 |" T: C9 f" K- X, o' o) `  t" @; Z; E7 l) X5 i
#define SHAER_RAM_BASE_ADDR    (0x80000000)   9 r3 F/ W2 t' ?

& u* u( @5 c% Gtypedef struct
' H' D3 ?8 A- U0 v& Y' _" E{( j5 v, Q; k4 L# j6 K+ H; ~
        unsigned int a;
& H; ?2 A# ]/ X/ C        unsigned int b;
1 V6 |. f: l1 i8 f        unsigned int packet_cout;
. O3 M8 K9 o, s, i}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 h0 |$ {2 ^. M9 `4 N( v9 e' B$ V) w$ h4 |$ S& G. R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( V1 Y: N$ q6 R" t9 ~& O
unsigned int count_copy = 0;
  Y- O. m& F) b/ D; W9 @( n8 n

! J  X4 p: d4 e) Xint main(), G: y6 Y3 m% m8 h" h! k# u+ i
{: C  F. B, @' R# z& G
        pRX_MSG_PROTOCOL pshreRAM = NULL;& U7 j( {' e, X0 C2 q' h! K5 B
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 U/ I5 `. S6 W) N  M! G. e! b: a
' K+ C( B6 A% t9 M
        while(1)& {) M+ }4 k; h1 A- Y) b$ }
        {6 N  \2 C# U/ f- B  r5 l6 l+ f
                read_MSG_buffer(pshreRAM);9 B+ [- ~3 s* d  \$ }6 d
        }                . @3 A; j$ `; y2 g$ e
}8 P- }+ b( K2 H0 ^7 u1 G+ I
6 s) {: f7 r- f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
  ^) S& A9 F0 q/ I{
5 N" W; N6 B3 o& _7 a        RX_MSG_PROTOCOL buf;
$ u" o: t- N1 I2 o) _8 O5 }' r        " o, ~4 T( `3 W# s
        buf.a = pshreRAM->a;
; P# q. h' ^: g+ v7 _. f        buf.b = pshreRAM->b;) q1 l; Q: ]  A$ e: k6 P: T
        buf.packet_cout = pshreRAM->packet_cout;
1 H8 [5 u+ u+ l        : {6 n% _$ `2 w6 \' U
        if(buf.packet_cout != count_copy)
0 y, Y' |$ |8 e( U) k* K% W        {1 @6 Q% e8 C9 p' F0 H, f% \4 z% ?. z
                printf("a is %d\n", buf.a);
! ^- o4 T" n4 W$ t5 a' a                printf("b is %d\n", buf.b);) _. z, Z* j* q
                printf("count is %d\n", buf.packet_cout);2 w# M7 g' M% X' _5 w  ~1 ]
                count_copy = buf.packet_cout;
! N& w8 J& K+ ]# x0 K# x7 z  X        }. N# N$ ]( f( H. c2 h7 D! s* e
        else
9 ~1 j1 e  r* l8 V; ?. x        {
, r* b: B( R8 F4 o2 {                printf("No effective message!");( z- \1 p1 h; N; E% A% i4 G: y  ~) Q
        }) C9 U( s# W& `' g- U
}
( K* T. z( ^1 \" m( G! x$ H
, ~- l# c" D2 t* w" B3 A: h
4 |+ y5 l& Z3 q: s" Y# i) x/ U但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 _) T4 r3 O$ s0 Q9 D8 z+ t
使用下面代码,对内存使用了mmap函数后:
% z& U! [( E$ K7 {$ m9 B. [. T#include <stdio.h>' r: k  w5 M! H" s+ y* W" W
#include <unistd.h>
( }; w, F0 }" T1 s) d: Z#include <sys/mman.h>
5 K! m1 x9 n4 I& O$ m# v#include <sys/types.h>
2 x0 h  C! s/ ^$ z+ J" o4 q" v" _$ {#include <fcntl.h>
* s8 _9 e. V6 _" f4 i; I8 A$ S) g
5 @" c$ ^, V$ `9 l7 O5 }" v#define SHAER_RAM_BASE_ADDR    (0x80000000)9 B$ _5 r# ]5 x+ ^- _
#define SHAER_RAM_SIZE         (0x20000)   % l0 t9 s. N" Y' U4 o

" ^+ ^6 Z0 I: I! N! @& {1 ]: S6 rtypedef struct
  |  A& k  X1 V; t. M# N+ ]{: ~" A( p4 [# H% F
        unsigned int a;) @6 l+ ]3 S( ?
        unsigned int b;1 [: e' `9 d+ B0 c) e8 Q
        unsigned int packet_cout;* z+ P* L$ n2 `% Y' R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 Q" `$ W! E2 N; j5 j

  b6 p  |, v7 u5 t3 u: y3 Kvoid read_MSG_buffer(int *baseaddr);1 j5 ?4 Y! W2 X1 n
unsigned int count_copy = 0;
! L- M. P. [' ~$ P
& z! N& j; R/ _/ g  W5 W( v& Tint main()
' L2 R# Q) r4 A$ R{4 h! u. X1 j: @( g! T! y7 T
        int fd;
5 \# d( A& h* n: L        int *mem = NULL;
3 X- x. N' b. c- ?2 b  S* a; _4 }. H; M* Q0 A) O' o
        if((fd = open("/dev/mem", O_RDWR)) <0)
! _! k" d0 D* ~$ I" j; t6 Z- {        {) N' ]. R: a3 ]$ U+ `
                perror("open error");6 C8 O7 Y- [  }, X4 @
                return -1;6 Y/ C7 Y5 Q1 F# {
        }
, `! |5 l' b# X4 w$ e, c/ N! e+ X1 }- C        
+ A0 M; ~9 h8 Y1 S  E) `        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ p) b# l* f/ j0 p7 V0 }9 n
3 Z* X: b' J% c; N) B! G* Z2 J
        while(1)% O! }3 a* s2 d( g5 m+ w7 n+ T1 Z
        {
) V4 ?" F3 [$ D                read_MSG_buffer(mem);
" _& M! b4 Y# u' ]/ l        }                , n) j% x1 K3 `8 q+ h* C. L
}; A6 ^+ S* z2 L9 V+ d

  W0 _1 b) e/ n/ k3 gvoid read_MSG_buffer(int *baseaddr)/ j: L+ a* n9 e* F
{+ z2 a8 U+ }8 J" X2 J! w- d$ p
        pRX_MSG_PROTOCOL pshreRAM = NULL;
, t/ V4 l. v: O/ H; Z2 L1 F1 n/ g
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 k/ J0 J% {6 K4 o3 Q
4 O7 @: O& d8 }  f. ^5 R& ^* h, p. z        if(pshreRAM->packet_cout != count_copy)
! r( Z3 f; G5 \: g% S4 j  V4 Q, V9 E+ Y        {
& ]: U: D2 _* G/ P( D                printf("a is %d\n", pshreRAM->a);
* V+ K' e1 y8 m' G& _" {                printf("b is %d\n", pshreRAM->b);
; U  A+ P3 L& c8 a, b( M                printf("count is %d\n", pshreRAM->packet_cout);2 c6 Z9 _, R2 x0 ^
                count_copy = pshreRAM->packet_cout;
8 l" c& a1 {& \& a        }/ F  L, b! M  s8 k; V
        else/ c) x' j7 G  `3 \" @
        {
; c/ V4 J9 G( @# [                printf("No effective message!\n");$ s- u7 G9 F/ Q6 Q* I/ S
        }
0 u1 e3 ~( _0 {  Y! f}
2 w1 s' t9 g  l! W0 F9 M) T$ n; k9 D6 B/ G. w( ~2 O' Y& ^
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% G& x8 U4 q* j1 l% G! t
0 y' `; ?: B  i! @, |

! e1 x2 C3 G1 s$ K; O2 T- s$ W" ^8 x; ?0 F1 d
! e% I  C$ x$ u- [3 u" X! M( `; x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-5 09:09 , Processed in 0.043953 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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