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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * v' i1 h" K8 J( R6 A5 B
5 g. Y, Q# z7 r6 W" g( H0 }
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' G: o  H# |: H  }: Q7 p
#include <unistd.h>8 @4 P# Q2 }* j- b" G! ?
#include <sys/mman.h>
7 `/ T) ^) l8 g2 w! A& A+ E# C! G#include <sys/types.h>7 O- _. {! [+ c4 x/ `
#include <fcntl.h>
- f0 P( L* {7 c& x9 h% _
, {, ?9 e# Q: `! ]; ]3 [#define SHAER_RAM_BASE_ADDR    (0x80000000)   
+ T5 U1 U2 p- G4 M2 ^
4 ~. v. p" y, U# {7 o) @& W, Etypedef struct# R+ `, r" m8 x4 t6 J1 h
{
# z: I, _6 R. G6 {! W& H( L        unsigned int a;! V9 p, G& d1 F  M8 t
        unsigned int b;
6 \8 O; q+ h8 ~- c        unsigned int packet_cout;& \5 o  i; X# f* m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 q, K; w, e: ^$ H. D7 z0 V1 J0 H4 X% n! ]( }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 ]  d1 S+ _1 e$ M, a6 ^9 ounsigned int count_copy = 0;
" }% f" [; J& V* K2 Y
8 N2 `6 d* y4 k0 y0 ^- C. O! h1 V* w. b1 y1 B# q
int main()4 d, [/ V9 Z! P/ R4 M
{
' H7 ^# Y, p0 s  h$ X4 S* u! F( A9 i2 _        pRX_MSG_PROTOCOL pshreRAM = NULL;6 R, M+ R  c2 |( d+ ~
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 ~! x, t* K5 ~) x8 B% {, y

! ~4 T1 K9 e0 ~        while(1)
% _: a4 M( a5 H; S  M0 W        {- J$ ?3 u9 J* l0 h' x
                read_MSG_buffer(pshreRAM);/ n7 ^1 U2 _' E# \5 P: q% o
        }                / O- {# K: _- P0 i& b5 {5 x, F
}
( q. G& x5 B7 }3 D. m4 E9 t4 s3 N8 O/ V7 k3 c1 `! z3 N0 a# d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* k* u( v7 L# G! t* f6 \{1 x6 y2 R, U/ I, x1 j; W
        RX_MSG_PROTOCOL buf;
+ W. @, G6 m3 [' l1 A! d1 B        
6 k( u6 u9 p; Z6 V- ^) P$ X9 D1 g        buf.a = pshreRAM->a;
. G2 F* h6 z2 \        buf.b = pshreRAM->b;& l# g4 z9 c1 j$ Z0 v4 w. G% Z
        buf.packet_cout = pshreRAM->packet_cout;3 P* S( C; i) q9 s- R+ M
        
4 T8 T5 _+ m0 W# }' |4 L3 X; M        if(buf.packet_cout != count_copy)
- h- ], W, G# b( \        {# Q. n2 m0 C) S& Q7 e) i" h
                printf("a is %d\n", buf.a);9 u) c/ Q& G0 U" B; }9 i! l
                printf("b is %d\n", buf.b);/ K* v3 D0 b$ T8 @2 k  k6 k
                printf("count is %d\n", buf.packet_cout);
0 F1 b1 l5 I6 a- J& J                count_copy = buf.packet_cout;
: ~. K( l+ z  e4 `/ E, R4 U        }
4 a' S2 A2 b! C& G% ?        else2 C* M8 l. f  _8 G8 i0 [
        {4 E+ g+ B; ?) V: {
                printf("No effective message!");
# ]: M; _0 O! }* V; ~        }( C4 a5 Y( Y' @  f
}
7 t" V4 z' j/ E8 w1 F  n6 d
: w7 _6 P3 r% N3 t; Z
7 l. G' x) |1 }( o- R% f4 s  L0 B但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& Z8 h# G$ D, G$ o
使用下面代码,对内存使用了mmap函数后:/ s0 i9 ~* U" u; }$ O
#include <stdio.h>
; _, o. t# }: i, _: t; G#include <unistd.h>. z* @; W1 n9 x' H$ X% F
#include <sys/mman.h>
' i. Q% d$ A% O' v0 S#include <sys/types.h>; b" q1 s0 d6 I4 Q, z. y
#include <fcntl.h>
* N6 U% i1 v7 ]* D1 X0 f& r; w( h  A/ |& `' J5 Y! G6 Z  L; I; ]
#define SHAER_RAM_BASE_ADDR    (0x80000000)& n. R! D  q- G$ E+ r! i
#define SHAER_RAM_SIZE         (0x20000)   8 q/ Y3 T7 ^3 b% D
: E: a0 m4 A/ X
typedef struct+ N6 ?- h* E1 ~" _. ^( o
{1 p( L- G2 P% m: }( ?2 V: Q2 N
        unsigned int a;! ^& I0 p' f/ C9 H
        unsigned int b;6 ~4 t4 z: f) j( ^( h
        unsigned int packet_cout;
# R1 d: I7 k8 c9 t2 T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& h' M, x6 {7 R4 y5 w4 ]' G( Q' C  R. Q3 J; H/ f, f! D- C4 l
void read_MSG_buffer(int *baseaddr);$ M9 ^% P. V6 f& u, W
unsigned int count_copy = 0;
: U% ?1 [% a) V, @% a/ @1 N2 i) E/ J, K# w) K6 c' ^9 B! K" R
int main(), r2 ^% I3 q7 e& K( @
{: Q/ a) K  W, ?& n! f! A2 X
        int fd;& F8 q' s/ P$ i+ v$ _! l6 M6 L/ b
        int *mem = NULL;' V( `- }! K5 Q) b& H
8 a/ S* t/ X' S: _! y, H" [
        if((fd = open("/dev/mem", O_RDWR)) <0), u# D! P0 @* n9 O9 a1 z
        {9 W8 [  n7 m" A: e3 d# s& W
                perror("open error");, ]* D- P) A% \
                return -1;
6 b. `+ Y  D. r7 L! P        }
, |& G- ^" X$ {; h        
& K/ i: h: M. e9 W' p4 u4 m- z: f" f        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 q! |* d9 p5 E9 z; E" |/ M. Q
* a; z& j7 G3 N- m        while(1)
# c5 v# |- Y* E/ a        {
" Y' o. K& ]3 B  E4 G                read_MSG_buffer(mem);
% {+ m* P9 ]3 ^        }                $ `) }2 T' a# J: Y7 Q
}
( Y$ ^. S( Z: \% v  I; W# ], v
' E/ C" d5 f1 u. l5 Y* wvoid read_MSG_buffer(int *baseaddr)
" }* u5 c0 P9 p* }" Q9 d{* V7 i7 K  \' Z$ e5 T) O
        pRX_MSG_PROTOCOL pshreRAM = NULL;
. `$ E3 F( G# _# h' J- S3 f' `8 ]
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 Y5 ^, Q- A; R& I
2 O, C' w7 _9 t2 B+ y
        if(pshreRAM->packet_cout != count_copy)7 d; G$ q4 D$ R- k1 d. q, g( ^3 i
        {
* W, k0 v" M# V& ?( x2 ?                printf("a is %d\n", pshreRAM->a);
% z# p' i% v4 u                printf("b is %d\n", pshreRAM->b);% M4 |+ i' v/ T. c9 A
                printf("count is %d\n", pshreRAM->packet_cout);
1 r- V2 I! k" r! H& G' m, |                count_copy = pshreRAM->packet_cout;
* w8 z5 G1 h2 o; \        }
1 f# m  P, p+ I2 F        else
1 K+ E5 `. ^( Z* s8 U        {
2 y2 t; G# H# B1 ~) q                printf("No effective message!\n");: d& ]1 \6 j+ t4 x- y* {6 S
        }
- X0 r) o" \' X9 j) r; C  u3 E# |6 `}% y! r2 G) t# }1 c7 c. Z7 _4 F

0 _, g0 r; T: J) \9 p0 L6 A* ^& I没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; q: c( i& c2 y2 [' u/ F8 s( n" u5 n/ }' \6 ^7 g. R' U" d

7 f1 M' l7 `( P3 R$ U0 h
4 _! {4 ]! E* Z1 g9 W$ B7 p
1 C4 [$ {. f# Z9 @+ ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-26 09:24 , Processed in 0.039126 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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