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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑   P/ v& j+ L8 r# m- L8 V

9 f  F' h" p. F8 c' XOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) A3 s3 z. `! N& p( Z' P8 F4 a#include <unistd.h>
& k7 n, ^2 i5 ~4 |5 u% [#include <sys/mman.h>6 S# a/ `. Z7 H/ }9 V) g
#include <sys/types.h>
+ i& a4 s" e: S) k9 e- {; T" x#include <fcntl.h>8 P& o: ^# d1 o) [0 N5 h

9 n6 I% V1 ]3 O/ Z* f) Y#define SHAER_RAM_BASE_ADDR    (0x80000000)   5 h0 m# a( z7 r& t* N

3 F7 C6 I4 E! K* r/ M) f6 Btypedef struct! x) Q( |- }# C- t
{& H! Y2 f6 @! [% u3 \8 x
        unsigned int a;! b- ]5 }' z2 ^- A1 O. \
        unsigned int b;
0 \% K4 c0 N3 i3 x        unsigned int packet_cout;) K0 }8 b5 d' J' m8 H& k9 p1 x! \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, ]; w" F. v6 l* N3 v: C( j* a$ U  m, |; N  G  N) y2 ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) `+ B2 o! K$ \" p3 b/ \
unsigned int count_copy = 0;
9 I8 Y' [& f" i( r
* U  O7 G$ D3 k* w8 D" P+ f! ]) |
int main()
# T- ~' x' [0 T. M5 k{
* U( V8 x# k* l: ]8 U$ r( g& r        pRX_MSG_PROTOCOL pshreRAM = NULL;0 B- _7 b6 |: C7 x$ s
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 m1 o$ q5 o: `% U: X0 _- H" J9 }/ p# g
        while(1), _1 {7 s9 _  t/ a; U* X0 U
        {
+ a3 X0 s7 R, W- E1 ?6 I" }/ c, }                read_MSG_buffer(pshreRAM);$ o  p. ]- M+ M+ G  m7 J! u
        }               
  A8 E* u1 w/ y9 |* {, V6 f1 l}2 \5 L0 n; w- Q  l
: A5 r1 q+ L- c6 S4 g. D! d" n. v$ C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 l7 H  U+ k3 d# q
{
1 U+ P! E0 [+ i6 A. y: [        RX_MSG_PROTOCOL buf;
- W2 ]. j# s1 R1 J' z        
, `1 L# O* d: Y# R9 y0 k9 d. s% I        buf.a = pshreRAM->a;
1 \& k- r+ C1 N+ X, p- E+ g3 Y        buf.b = pshreRAM->b;5 K7 x! o8 v; y+ t
        buf.packet_cout = pshreRAM->packet_cout;; n* I! }6 k% j
        $ F5 `6 L5 m$ f  ]+ D
        if(buf.packet_cout != count_copy)8 M/ c# }+ K# v1 x
        {+ v4 r% Z: c2 p* b; m* G/ y
                printf("a is %d\n", buf.a);. I8 a. D' s  M5 R, o% t# t
                printf("b is %d\n", buf.b);
0 v4 L+ f9 H; Y                printf("count is %d\n", buf.packet_cout);
0 {% m7 b, D% Y1 N/ j. S8 u2 K, t                count_copy = buf.packet_cout;' O" e3 Q' `* l
        }3 l6 A4 f: B; E* _1 L. @) v
        else
4 ?, k, z" X- y) v        {
0 W: d& d. g- w( B: {: n                printf("No effective message!");
( E" a+ D9 n& I+ @& L: v        }
/ V$ E+ i  M9 m. b9 B}& Q3 o1 i* ^1 @% U

3 ^% G$ z1 B& l+ c
$ N) `1 F8 D! V' y3 I& J. j但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 D% U% C8 x; {% O; L使用下面代码,对内存使用了mmap函数后:
5 o: f! |; O7 y! s+ e#include <stdio.h>. m# i( M" z5 L) Q' j
#include <unistd.h>
; Y0 X% B" L0 |/ F8 a& K#include <sys/mman.h>
) X4 w6 U2 I" W$ o#include <sys/types.h>; l5 n% i' d! A$ D1 H0 c
#include <fcntl.h>
0 K+ t0 e6 h: f! A: [) I8 f; ^4 c' D9 J
% g0 L; m* Q7 |6 ?4 }* Z% K& w#define SHAER_RAM_BASE_ADDR    (0x80000000), E. I4 }! i/ S: ]$ E
#define SHAER_RAM_SIZE         (0x20000)   
: B1 l, S2 E. Z6 r# s4 \
6 _. o/ V2 A8 e7 J9 @# J" p! `typedef struct& A* c( r' G" C& b( [! ^5 n/ x7 v
{* ]8 g% `  A/ `+ p; u
        unsigned int a;+ \* G6 d. I6 P5 L6 C
        unsigned int b;
/ t4 m# }* ~+ ^) t3 G5 O" h2 K1 n        unsigned int packet_cout;
3 x! s- I3 D! B+ q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: I. I2 v: n7 I3 ~7 C% c- ]; F# @% c! s4 x
void read_MSG_buffer(int *baseaddr);9 B6 i: s+ ]0 O6 {
unsigned int count_copy = 0;
$ j$ Z0 l. m; s5 L7 p1 w: a8 C; z* m# o0 T* R. @
int main()/ f0 Y7 G' N8 ^& ~" ]
{* ?. f# R1 c/ x2 ]' n6 f7 j; a% w
        int fd;$ |" d/ g3 o4 z2 [" z
        int *mem = NULL;2 k$ V  |7 ?  F9 I1 L

3 `1 W% q: l5 |+ ]6 \% @        if((fd = open("/dev/mem", O_RDWR)) <0)
. r3 L  |) o, j& X% W2 a        {
: h# `8 z5 Q, ~1 Z" a( o- L                perror("open error");
. }2 ]: f5 {  V; r7 e6 ?8 R+ x  j8 p                return -1;# d  T1 j; X- x" ]
        }, E2 @) _1 _4 y( ~4 t' @/ z, s
        
: _4 `6 H* c( d+ H        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. v/ ~  C1 e: ^9 G3 T* p+ p/ m
# r9 _+ q: l% l0 t! H0 C9 v5 `        while(1)
2 P9 z' A3 U% B$ O/ _4 R        {+ W, t3 z; k7 v
                read_MSG_buffer(mem);  I! W4 }% v; x$ e+ N1 C
        }                8 Y+ i' \/ @# t3 W
}* X2 ?; `9 L  _6 {$ k! ~
  N! V0 _* E$ I) z8 d2 h
void read_MSG_buffer(int *baseaddr)
- A* m* \% \' l0 j$ S; n( P{
8 ]* n0 Q/ ?( F0 X* S        pRX_MSG_PROTOCOL pshreRAM = NULL;
* H, a, ?0 W( y" y3 v! b+ R9 I! v! U  V
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  J. ]: j8 ]7 H5 F+ g' S) D/ Z! [$ G2 h: G  U: S& a
        if(pshreRAM->packet_cout != count_copy)( w6 E* X1 A1 P
        {& a7 J. e  |! n+ r
                printf("a is %d\n", pshreRAM->a);
: t6 I. p0 H/ f7 q$ s                printf("b is %d\n", pshreRAM->b);
; `$ ~: M) v# }- O6 w' v                printf("count is %d\n", pshreRAM->packet_cout);
& N) p: G) S( W5 X                count_copy = pshreRAM->packet_cout;
( O# k7 R. v) p) }6 t  l. S        }: \) _1 z7 J! i! ~3 A( x" }
        else+ i; R$ ^. `$ R7 d% J# {
        {
' a1 E: [1 }! h4 x' j& G+ F                printf("No effective message!\n");
5 a& s5 Y+ s1 ^+ O        }/ I- |4 i) i: L' w) g
}
* V% U) _2 @' f0 s! {) K/ q& W- H3 m5 h7 F3 Y$ P
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) N0 c" T5 Y" q
! ~7 l# B3 d* k+ g' K
! l9 D) k7 a2 p( P! o* S
" m8 V2 I1 _+ b, N( x- A5 |7 j
/ n& m2 l1 m$ c, }' a4 }  N1 T$ L
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-3 07:13 , Processed in 0.043796 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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