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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : d, l, }4 k2 r3 _" P3 ]( r0 d

7 B& o4 D0 ]* M8 b8 |8 AOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* b- Y" t8 O/ f7 p7 X) T#include <unistd.h>8 v7 _5 [- N( a+ n
#include <sys/mman.h>
+ f0 H2 l, ]& J3 [; a* V7 m% s1 ~#include <sys/types.h>4 u$ V' ^% L! p; L% ~9 b- ^
#include <fcntl.h>. t- V6 e% ]2 M  f! H8 b

- n2 N/ O) D& W' O% K#define SHAER_RAM_BASE_ADDR    (0x80000000)   5 r) N! n2 k& u8 U0 r  n3 R

+ e8 m" ~7 W& F1 S& g7 |2 utypedef struct5 \2 |( m7 f. v' _; b
{
( H. N. b" f  a1 N        unsigned int a;' O0 V( s1 z3 N1 x
        unsigned int b;# g! }; J! q3 K+ ]$ r5 u
        unsigned int packet_cout;" E5 i- u; S+ z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- c- m! z$ e' D9 C/ \; R! A5 c; G' F1 j: x; L+ E  A8 z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);7 A# @5 ?* W+ K; z
unsigned int count_copy = 0;1 V9 t1 A0 V3 l3 K9 G6 L% u1 _
0 z3 C* J/ c) o1 v& A
, K4 \  ~" k, B% u
int main()7 {# D8 H. c) E- z  K1 N- t
{
# a' b8 Q: h; Q# V% m        pRX_MSG_PROTOCOL pshreRAM = NULL;# {6 [1 w, O% N/ f3 W! e# ]
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ I2 P' Z3 V& o( a8 Z9 R

, k  _, P$ @) h  ]) k        while(1)- T" L, A1 S( q! t$ n. C
        {$ J/ O- }5 v  b; y% o
                read_MSG_buffer(pshreRAM);
- m" x: x/ |+ L+ t: K, u        }               
# w  L- D2 N2 n$ }& |( N}
* B& {, S* Q6 r* V
' U( m' f. f0 K& ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% ^2 T  p9 X: u' d
{
8 r0 _) w, @$ H. D        RX_MSG_PROTOCOL buf;
2 }+ h' J% m* E/ _" d8 m* S        / e/ R! W, p/ g3 d
        buf.a = pshreRAM->a;
- e4 s' F3 f0 W) H" O0 b8 \        buf.b = pshreRAM->b;0 i* n  C- t8 v9 S! _
        buf.packet_cout = pshreRAM->packet_cout;
7 A! p& @0 t, ?7 Q- C        
4 c# C$ R; l1 M+ P$ a        if(buf.packet_cout != count_copy)
. ?! R" v) T% V+ {: x2 E        {/ M  z7 [1 n- X5 S4 {1 ]
                printf("a is %d\n", buf.a);
( C. D4 Y" C9 M                printf("b is %d\n", buf.b);. z# ^4 \0 }5 O5 p& L- b) ]5 {
                printf("count is %d\n", buf.packet_cout);1 R, k$ p$ I3 d1 Z2 l& m
                count_copy = buf.packet_cout;
9 @1 G" |( u- `$ N' I9 B        }
$ R' D/ D+ J# r# Y        else
# F$ b6 V6 s% i0 N7 E        {
- m, ~2 g# }$ x" S0 t$ {# ^! J                printf("No effective message!");8 ~" K- E0 Y( R, b3 ?0 T( B
        }: z8 ]9 g5 V, G( M/ z5 G6 M1 S. L
}
0 _8 F8 g9 T3 s; P* u4 F4 E) _  b+ Q3 \* i3 U& C

) f  x% P/ p0 `5 ~2 y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  o% ?3 ~8 N! K' _使用下面代码,对内存使用了mmap函数后:2 V. p6 g+ I: a, y8 r) a) M# Y
#include <stdio.h>! h  V6 R. K9 k- a; D  e: j
#include <unistd.h>
9 y- x1 v, ?/ F#include <sys/mman.h>
+ ]# A! L* {) J' @#include <sys/types.h>  l2 S! v% v1 b7 U, N
#include <fcntl.h>
/ @' H7 \6 L  q( O/ |+ J" s0 X! J/ a$ p8 S& ?$ }: O) _  l* {
#define SHAER_RAM_BASE_ADDR    (0x80000000)% e" @# u6 U1 r% O
#define SHAER_RAM_SIZE         (0x20000)   % H+ g7 k6 w/ O7 P2 E

: G: U6 t5 D* P# X2 c" x/ ~typedef struct
/ ]2 J9 c$ b9 J2 d% ?# I! ~{% }! i0 y( i1 A8 F2 ^1 g- a
        unsigned int a;8 S) j  {+ o* [3 {) `
        unsigned int b;
7 n, s: p9 [$ J2 Y        unsigned int packet_cout;% m- A- B, E7 g* R- }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  ~$ u$ `+ {0 f; M; ?

! e+ s% R2 O( h+ Q# Tvoid read_MSG_buffer(int *baseaddr);( z' ^- w% Y; E+ q5 ^8 D( ~
unsigned int count_copy = 0;
+ M# {! v: x  a! A; r$ i  P) c  i. B( z, @
int main()
. ^3 q2 ]) v7 i& _: A3 M4 L{
" h" S! y: A- q. u* s3 k        int fd;
. X: o# b6 r0 T5 E        int *mem = NULL;
$ n& w# l& @# c/ o
5 K, P% w( C) @1 ]! e" i8 }: @7 ^        if((fd = open("/dev/mem", O_RDWR)) <0)
8 d- a  Y. T7 S- H+ h- m        {
- \1 g% l2 G5 c; I                perror("open error");
% \6 V" O/ t% H                return -1;" U+ y5 ]$ e) l8 w1 }1 k! t; _
        }
1 [& v) `, E7 ^" Z        
, R7 ~9 |& l. o0 l: e& K7 L        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, w4 W3 }) i5 `4 X3 W
+ i- y: T1 e5 A        while(1)4 L; \- l) t: {: q
        {
: L9 F5 L# i& ]* j# {* y                read_MSG_buffer(mem);  W% U$ `- V( ]' C" Y
        }                8 E' r5 T/ ?  }! H. i, v
}1 ?8 e* B& N2 q: c1 I2 {8 T  L* f9 i2 o
& \  s6 C) z2 l# N6 D
void read_MSG_buffer(int *baseaddr). K2 Y" Z: ]% a$ z1 b
{" f+ W5 G4 }1 N3 W: A0 K
        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 E' X0 s2 a2 n6 q* W! m% U
% C- U( {& c8 i8 n0 c3 r0 ^" U- C        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, @7 _) P$ H$ T

. b# a6 E" u' A        if(pshreRAM->packet_cout != count_copy)3 |9 z+ j. @5 t/ m! O
        {
# g6 @/ T* {! d% S# \) z0 {8 S                printf("a is %d\n", pshreRAM->a);( g  {3 z! I( v6 T3 q
                printf("b is %d\n", pshreRAM->b);
% a8 }; o. w/ N9 O7 R* A! k0 j                printf("count is %d\n", pshreRAM->packet_cout);
& u1 f2 q9 b2 T1 Z7 z2 O% z                count_copy = pshreRAM->packet_cout;
4 d( N( G* L' m, q$ i        }
/ a+ e- P' b! x        else9 z+ ~7 z' ~$ l' ^4 R
        {& \6 e3 D" N6 E6 N) I
                printf("No effective message!\n");
4 n* |% K* f0 P        }5 o6 e" c  k& P( r% \  K, o9 {2 F
}
. ~& S0 M/ z2 {9 M2 K% O( K2 \1 C- d/ f" h1 H/ A: @
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& d; _' H) U' h6 z

! B9 F( ?+ H" n& \. U
. v4 s3 @& K, r2 S
! x7 t- p# t  |0 h7 `- r0 z! e7 y1 m: g% t+ k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-2 09:20 , Processed in 0.059087 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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