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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% @- A5 H& M1 C+ h& q
, G) p0 A0 n0 Q* ~( o# @# IOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 J; c; J' r6 n+ N, N- F#include <unistd.h>, X. k7 |& m0 W+ V# }
#include <sys/mman.h>( z+ z8 X( t* a+ s* s, ~
#include <sys/types.h>
' P% L2 v9 u1 F/ D4 g#include <fcntl.h>
6 i4 [) ^+ i# `) @1 F! B4 H5 ~
$ ]6 {( s7 _* ~. j" C' z#define SHAER_RAM_BASE_ADDR    (0x80000000)   : P% h) {( z. U5 Z) k

+ W: C0 E2 M$ y/ \: C6 Z4 ctypedef struct
+ a3 k; _( t- g+ d{
5 G' Y+ \9 d8 X+ l) A8 w        unsigned int a;7 @1 m. j+ @/ i
        unsigned int b;
5 a, I8 N: i2 z        unsigned int packet_cout;
9 v0 |% }/ ?2 Q" T- `; i$ F' k1 H4 _}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 a7 {; }$ o. H2 k
4 v& Y, I6 f5 O, M+ _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& T" u: A$ x* a3 [8 ^' f" a% munsigned int count_copy = 0;
& h1 {+ r, @" j/ F. V$ ~
+ I. M9 n& `, d; H" U+ ^. _, ]1 _7 M9 ]4 y% i+ L. N
int main()
1 i  J% E& E$ u% b( A9 k{
& {, a8 E5 G+ [! U        pRX_MSG_PROTOCOL pshreRAM = NULL;  T* M- x2 d+ l, _3 p
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# Z: R; x2 i0 w2 z' e; w; m' T& Q- |6 X
5 J) }- x; a0 R' H- E  l) C* j        while(1)" T$ I3 D( H$ K( P% B& y$ R$ _
        {
/ Q+ H: g; H. H; a                read_MSG_buffer(pshreRAM);
: c; ^6 {& |! f/ _        }                2 f# a  M; W0 B; j3 y4 h# I- y
}
; c* a/ N4 n, K* w- {2 `- h7 L  M8 L' K/ k% ~. I  N$ L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* D" [# S' @% Z0 g{
! M& @) u5 e  B2 k0 M# L2 I, _        RX_MSG_PROTOCOL buf;/ v; b9 g% J4 R7 S6 ~
        
% l$ k# E4 ^% s5 Z7 O( e7 R        buf.a = pshreRAM->a;7 a! ^% u8 O( M4 i
        buf.b = pshreRAM->b;; S! p; ]3 m6 o& ?0 m1 i: |" J
        buf.packet_cout = pshreRAM->packet_cout;
% Q; S( E0 S2 ]/ B+ l        # s. g( c5 @* C  L. T
        if(buf.packet_cout != count_copy)
# Y% o# d( e5 L& w+ \        {
8 z; r# `: a/ M  _+ s/ j+ X                printf("a is %d\n", buf.a);: F# N5 j1 c4 Q0 v6 e' x$ i
                printf("b is %d\n", buf.b);
, c0 r+ n; D$ f2 w. D5 h  V% J                printf("count is %d\n", buf.packet_cout);
3 ^5 q: u' ?, A  T2 D0 `                count_copy = buf.packet_cout;
/ O1 [$ c& e. z& b" N        }
  L* r; `' ~, Z) Y! M/ w4 G& e, ^        else
! f0 R0 f/ q& G& K' B6 u  p: ^        {8 l4 X& `& j8 d
                printf("No effective message!");
+ z7 i0 p1 v/ j& W        }8 n2 e/ |& a) Y* B
}2 l  w3 A" B$ M( m

% o7 y/ l6 n/ d1 j: J, d- B* O9 h5 J# R) i* o
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ p+ e9 N$ w! r0 _) j; z4 h2 H使用下面代码,对内存使用了mmap函数后:
, ]) s5 i$ Z. B( `- A. H+ f+ f#include <stdio.h>9 S! a; @6 h. ]* S' _8 M
#include <unistd.h>, R, K8 h: p  y
#include <sys/mman.h>& `- L. ^$ Y7 \9 k
#include <sys/types.h>% z! I  c7 o* i+ S9 }% h
#include <fcntl.h>4 N! O1 ^  J& G* y: _: Z
' [" d5 _7 n6 ~+ }( h
#define SHAER_RAM_BASE_ADDR    (0x80000000)' |+ E8 z( ^: }- V+ y
#define SHAER_RAM_SIZE         (0x20000)   ; v2 ^5 d) F/ t! t

7 Y8 d1 z& E) k% v# ztypedef struct
* K! @; l/ \  E9 A4 y* q! x{1 r7 l7 [& _- E* |# v7 m
        unsigned int a;
9 ?% L3 H( |' R4 c6 Z        unsigned int b;
, Q( w  R- R2 O% G# k) ?2 ?        unsigned int packet_cout;1 t. A7 f5 x8 @& _0 V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 @5 C( i  e1 _; Z1 ?0 `# {8 x8 V2 C7 ^6 n+ [, n
void read_MSG_buffer(int *baseaddr);
& q) s8 b% P8 c8 u( Qunsigned int count_copy = 0;
$ s7 }2 {* i) _- |' z- R4 h9 n* z' \
int main()) A" g' _# v+ ]% V
{
# \( u% F6 J* n. s/ k" g; ]) c4 c        int fd;
* n: L- i/ \' D% M5 _, v! o0 _. F        int *mem = NULL;: x) O" H/ U/ ?
3 g( P- m/ O( Q0 P8 P; H
        if((fd = open("/dev/mem", O_RDWR)) <0)
7 g% R, S% B" H  ?        {! c- S/ O9 P5 e7 ?+ O0 g
                perror("open error");$ u' \5 p) e' |7 R6 G1 {
                return -1;( L. X/ `$ {9 P% M, M' x
        }
$ O  w% k  z$ n. \        
4 G+ x' ^0 e8 h        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ X& R% D2 P$ t+ {

" ?9 i$ y, R6 N$ B, C        while(1)3 K$ D1 i6 g' G1 F1 f
        {" h+ B: e' X9 ?, P' o( m- L3 [$ r4 {
                read_MSG_buffer(mem);: R$ B- L* E4 J3 J& f& ^
        }               
/ j( k: W) ^4 D) u}! k" ]0 ~# o+ L1 H% `/ d

' @* w/ S" K1 z" V" yvoid read_MSG_buffer(int *baseaddr)" ^# R0 X7 o, {) J( N* d, M
{
7 O" u; d: |& I! |, B. _* t3 C        pRX_MSG_PROTOCOL pshreRAM = NULL;. x) {1 e) x" b. y, J

: j8 R: @, a7 T8 U. y# [        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;" m' C3 L/ k% H6 t, U
8 E# T8 Y9 C" W& @" {8 d
        if(pshreRAM->packet_cout != count_copy)
+ @/ J. j5 `; B: [        {
- x3 T! Y" I9 \& \& E                printf("a is %d\n", pshreRAM->a);3 c  \5 F+ G6 ?4 s$ C
                printf("b is %d\n", pshreRAM->b);
4 I# r2 P$ z  P8 `5 j5 G                printf("count is %d\n", pshreRAM->packet_cout);
& R( X9 ]1 X- T6 L. s                count_copy = pshreRAM->packet_cout;
4 g2 @6 i1 Z+ t        }
* P( Y$ z0 ]& n( L) c        else
7 l4 g$ G8 J) G3 X0 L        {
/ m6 n  |9 i7 n2 `4 K                printf("No effective message!\n");
& c; ]2 \; L! H1 w        }
6 G0 N2 ~, l/ A! p) B: M; n}
0 y8 z3 H3 \, P' f0 C6 p9 I8 ]3 K2 L# _5 E1 z/ B
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, N# O/ `( B" _/ _! [
: g6 x# F( e5 {, |- k: W$ l
' r5 F; Y- n# |& `. ~, D3 i

6 [/ y/ U* ?* _6 d
8 T7 b0 p6 c8 D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-18 13:18 , Processed in 0.039404 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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