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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # ]3 M  I" V0 F6 `$ p+ t5 H

! L( g  m+ Z. A9 P: x  _OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ p/ x# I2 |% f+ s#include <unistd.h>
9 E2 B) ^+ q2 K+ j4 V- M#include <sys/mman.h>- b2 s% K7 |5 z$ K% ^% ~
#include <sys/types.h>/ U0 f; @% q5 A. k1 k! @4 N
#include <fcntl.h>' h( J6 D# ?$ D

4 N3 F: p7 T) ^- b% U) S#define SHAER_RAM_BASE_ADDR    (0x80000000)   
- g+ p6 N% [; Z+ v# E
0 S- k0 m5 z8 T2 j# dtypedef struct, C- G* u' y# H5 p/ _
{
3 k" W( N+ i6 L/ l* W2 ]% z" h% Z        unsigned int a;
( W! B! o" s! E* t1 u& I        unsigned int b;
) ^5 V% F( C" Y+ C        unsigned int packet_cout;4 J5 i, |" o. ]; R% B4 y7 D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 d; c+ P6 A3 L% I  D! C$ w- m5 q6 }& m7 @2 l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 G6 y" h, {# e7 e+ [+ l0 G
unsigned int count_copy = 0;
: h# ^" ?  l, \/ P8 w" N3 e; l# V' e2 S, z9 ]  t) X
* q/ y6 a$ x+ F, x! J5 ?1 _# D( s6 y
int main()! l1 }' f$ G) n- z3 C1 [
{
4 F2 X3 ~- B+ a% E; S( x        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 U7 t  u: C3 l, V, F; ]$ H        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- m1 {# y1 v8 P" P- w. s* Y# T0 F) T6 \; d
        while(1)
7 s" o; [( g" M9 w" F0 ]        {
3 T' Q1 g" K4 ?8 e  x7 l  `                read_MSG_buffer(pshreRAM);/ Z& V: I. [0 X2 u' k
        }                - d% i. z2 H9 L
}
1 y" ~7 p8 }* l' z/ s; H' \
5 f! }/ R4 i, X% W- |( xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 @3 K9 R7 U9 u- R1 n$ m
{
2 I, M2 h- w+ z8 |+ i3 K1 N: V' K        RX_MSG_PROTOCOL buf;. |' d* U. Q* I6 E5 Q
        / Z7 s7 z1 S; i8 @' f7 L
        buf.a = pshreRAM->a;  B; K+ n5 Q3 L1 @
        buf.b = pshreRAM->b;
; ?. G) X. @- ^% y" B        buf.packet_cout = pshreRAM->packet_cout;
2 H$ M1 }! J; ?+ p        8 [6 f! x& |6 ]. u$ L. M# k
        if(buf.packet_cout != count_copy)9 [7 L1 K/ N2 d2 i' x. K
        {$ {3 I- m$ ^5 `
                printf("a is %d\n", buf.a);" H! T, D" ^6 e  R& m
                printf("b is %d\n", buf.b);) H: S/ v1 r, O. G1 M; U3 R
                printf("count is %d\n", buf.packet_cout);
7 O8 Q2 T3 Q0 |* `. T                count_copy = buf.packet_cout;
2 `+ l: o* a5 Z( [4 ~        }; G* w' w! i8 [" K  v8 x
        else
4 r* x  n* ?; B7 n, c- f+ B4 G& d        {
% |  U/ R/ J! Y6 Z& o+ B                printf("No effective message!");% T2 l! L+ j2 t& H
        }3 R3 H  T+ Q  J# J# [' \
}& ^% E2 v. f- a9 G' ?

4 q/ v/ l& ]' H, [
) j) H, o# S- W  W# R8 X' s但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ L9 D2 E% m( u# |. \9 z
使用下面代码,对内存使用了mmap函数后:5 j) R2 J9 S& u! p) v- {
#include <stdio.h>1 R$ A3 r0 _5 {1 {5 p' K9 U8 s
#include <unistd.h>) h* e1 I5 }2 s) ?" e# O! d
#include <sys/mman.h>
% G3 W8 F) `! f1 {4 r0 w#include <sys/types.h>$ Q; d2 r0 j9 W2 a8 z
#include <fcntl.h>
. M- S3 A# ]( P& ^1 {* C* t& }0 B, x
#define SHAER_RAM_BASE_ADDR    (0x80000000)3 f& W# {, F4 i8 k+ [/ _
#define SHAER_RAM_SIZE         (0x20000)   
* }% o# j7 r. R8 |3 \" q) i  F4 q# p. M
typedef struct% J7 k& `( x7 E% @
{
* e! P8 N9 L% M        unsigned int a;
! K! W" ?" p. ~. @% P7 l0 e! x        unsigned int b;" ]( [$ m  p0 w3 _7 _
        unsigned int packet_cout;# k" ^2 A& {3 L+ j! X5 e6 m* v3 [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ X" R9 l) D. s" C
6 i4 n  ~# }  a& I0 W4 e  _* Rvoid read_MSG_buffer(int *baseaddr);
1 i1 D3 r; c/ [2 Dunsigned int count_copy = 0;
! T2 y# s6 w, G5 P
/ G2 S7 ?  j& e2 l: D5 Rint main(); ]6 q! s5 I. C* Y. e- U+ m
{
8 [% V7 l+ x( l( d; l8 Z        int fd;. O# a! E* _8 z6 m3 d3 z
        int *mem = NULL;/ }8 @; j; j8 i) e! D1 e
/ y1 t3 ^/ [' f  ~3 T
        if((fd = open("/dev/mem", O_RDWR)) <0)5 x: A; N' c/ d& k8 E; }
        {* w4 g3 b  G  d, n& q) K+ S
                perror("open error");
% z0 [2 ]/ h2 p7 F! d                return -1;$ r& V. a: Q9 \1 b8 ]
        }3 k, y2 ~+ U- Z/ W- i4 t$ _1 F
          _/ k- ^# G- r5 U
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' b0 x4 s- n  w; t

  f( ^+ ~: Q/ u1 d4 P        while(1)
9 p: v3 T( M3 T: [) E+ T        {
( {/ N7 J' E* c, `' b+ q                read_MSG_buffer(mem);
7 M: T+ i, ~$ z! v" j        }                / z! Z8 G7 x# Q3 _' {
}) w& E# \  h# J( F

0 R: K* m/ s2 U( E* ivoid read_MSG_buffer(int *baseaddr)
$ U( N2 l0 \6 z1 G% O. U% t* r9 A{: [+ e' O3 w3 H3 L  }0 a
        pRX_MSG_PROTOCOL pshreRAM = NULL;! ~. b. ^4 K5 |1 v% G: b( u6 x
+ |( q) \8 C- N6 G
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, ?2 n2 Q& B' G6 j
5 c  x/ h3 \: N2 r! \) i
        if(pshreRAM->packet_cout != count_copy)
9 ^+ T( c1 t2 \7 Z1 J        {! y3 f8 ?; O1 l' S% }
                printf("a is %d\n", pshreRAM->a);
2 Q: v( {+ X" B# b' n( I" Z$ s                printf("b is %d\n", pshreRAM->b);
/ z$ l7 }4 b& \6 b' a% x. v                printf("count is %d\n", pshreRAM->packet_cout);- c- c! }! \. u1 B3 N$ ?$ r
                count_copy = pshreRAM->packet_cout;, n3 w5 S/ A! b/ Z3 n# t  i# R" a
        }* [: }9 T* r9 k5 f& F9 T
        else3 L" g3 J0 }8 [: ]6 ^* ]1 X
        {
& o- v1 C( B  W9 b3 r; z% A                printf("No effective message!\n");+ |; `4 h3 x* p
        }
" r8 o$ H8 n9 f; l/ `' r) L' w}/ `" r; C  G) o$ y8 P. W: q" {
& N: K% C' K& r8 U9 U  `% p) |
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. \/ k8 i5 `* C1 D3 a& j: m
, i% }$ ]+ j9 Y9 ?
: R& e: S1 @/ S& U' C. b2 |+ G# {
$ a  V/ L' k* E* C5 W/ e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-25 07:22 , Processed in 0.043706 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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