打印

内存映射机制 基础知识普及

[复制链接]
782|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的。如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使用汇编语言完成实际对设备的控制,因为C语言并没有提供真正的“端口”的概念。如果是内存映射,那就方便的多了。


  以 #define IOPIN   (*((volatile unsigned long *) 0xE0028000))   为例:
作为一个宏定义语句,define是定义一个变量或常量的伪指令。
首先( volatile unsigned long * )的意思是将后面的那个地址强制转换成 volatile unsigned long * ,unsigned long * 是无符号长整形,volatile 是一个类型限定符,如const一样,当使用volatile限定时,表示这个变量是依赖系统实现的,以为着这个变量会被其他程序或者计算机硬件修改,由于地址依赖于硬件,volatile就表示他的值会依赖于硬件。
        volatile 类型是这样的,其数据确实可能在未知的情况下发生变化。比如,硬件设备的终端更改了它,现在硬件设备往往也有自己的私有内存地址,比如显存,他们一般是通过映象的方式,反映到一段特定的内存地址当中,这样,在某些条件下,程序就可以直接访问这些私有内存了。另外,比如共享的内存地址,多个程序都对它操作的时候。你的程序并不知道,这个内存何时被改变了。如果不加这个voliatile修饰,程序是利用catch当中的数据,那个可能是过时的了,加了 voliatile,就在需要用的时候,程序重新去那个地址去提取,保证是最新的。归纳起来如下:


1. volatile变量可变 允许除了程序之外的比如硬件来修改他的内容   
2. 访问该数据任何时候都会直接访问该地址处内容,即通过cache提高访问速度的优化被取消  
   对于((volatile unsigned long *) 0xE0028000)为随硬件需要定义的一种地址,
游客,如果您要查看本帖隐藏内容请回复

游客,如果您要查看本帖隐藏内容请回复


相关帖子

沙发
gujiamao12345| | 2017-9-4 15:38 | 只看该作者
学习下!!!

使用特权

评论回复
板凳
suxindg| | 2017-9-5 09:59 | 只看该作者
谢谢分享

使用特权

评论回复
地板
hunyuanqi| | 2017-9-11 19:52 | 只看该作者
看看,学习学习!!!!!!!!!!!!

使用特权

评论回复
5
caijie001| | 2017-10-9 21:42 | 只看该作者
学习了

使用特权

评论回复
6
zhaoheng1125| | 2017-10-15 08:48 | 只看该作者
看看

使用特权

评论回复
7
山东电子小菜鸟|  楼主 | 2017-10-15 12:39 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq:641208111;技术交流群:377640799 大学电子竞赛预热赛开赛啦~千元大奖等你来拿火热进行中!!点击参加活动 欢迎加个人QQ:641208111一起交流合作

140

主题

3082

帖子

23

粉丝