(volatile unsigned *)与(volatile unsigned char *)的区别

[复制链接]
1833|12
 楼主| haokeer 发表于 2016-11-19 20:06 | 显示全部楼层 |阅读模式
(volatile unsigned *)与(volatile unsigned char *),两者有什么区别呢?
xiaolong12 发表于 2016-11-19 22:53 | 显示全部楼层
volatile,关键字volatile 确保本条指令不会因C 编译器的优化而被省略,且要求每次直接读值。
rmbass 发表于 2016-11-20 20:59 | 显示全部楼层

(unsigned char *)0x20,0x20只是个值,前面加(unsigned char *)表示0x20是个地址,而且这个地址类型是unsigned char ,
意思是说读写这个地址时,要写进unsigned char 的值,读出也是unsigned char 。
maninman1981 发表于 2016-11-20 21:01 | 显示全部楼层
(*(volatile unsigned char *)0x20)可看作是一个普通变量,这个变量有固定的地址,
指向0x20。而0x20只是个常量,不是指针更不是变量。
yysforever 发表于 2016-11-22 10:57 | 显示全部楼层
maninman1981 发表于 2016-11-20 21:01
(*(volatile unsigned char *)0x20)可看作是一个普通变量,这个变量有固定的地址,
指向0x20。而0x20只是 ...

为什么要这么做呢,一般只要定义了,就不会被优化的吧
冰是睡着的冰 发表于 2016-11-22 11:02 | 显示全部楼层
yysforever 发表于 2016-11-22 10:57
为什么要这么做呢,一般只要定义了,就不会被优化的吧

必须要这样做才能够保证硬件地址不被编译器优化成中间变量
Dennis-Zhou 发表于 2016-11-23 21:59 | 显示全部楼层
不懂,从来不这么用的。我记得在库函数的底层经常这么用的吧
jouney316 发表于 2016-11-23 22:08 | 显示全部楼层
(volatile unsigned *)类型指针,unsigned 后面没有东西吗?
l科科1987 发表于 2016-11-24 19:41 | 显示全部楼层
对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射。如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使用汇编语言完成实际对设备的控制,因为C语言并没有提供真正的“端口”的概念。
dongbaohui 发表于 2016-11-24 19:44 | 显示全部楼层
如果是内存映射,那就方便的多了。
ahhsyf 发表于 2016-11-27 14:32 | 显示全部楼层
举个例子,比如向寄存器A(地址假定为0x48000000)写入数据0x01,那么就可以这样设置了:

#define A (*(volatile unsigned *) 0x48000000 )
...
     A = 0x01;
...

这实际上就是内存映射机制的方便性了。其中volatile关键字是嵌入式系统开发的一个重要特点。


(volatile unsigned *) 0x48000000的意思是把0x48000000强制转换成volatile unsigned类型的指针,即对指针的操作的范围是从0x48000000开始的4个字节(int型),暂记为p。那么就有:

#define A   *p,即A为P指针指向位置的内容了。这里就是通过内存寻址访问到寄存器A,可以读/写操作!
原味_郭 发表于 2016-11-27 14:41 | 显示全部楼层
volatile 是什么意思呢?
liutongda 发表于 2016-11-28 09:08 | 显示全部楼层
原味_郭 发表于 2016-11-27 14:41
volatile 是什么意思呢?

volatile 限定编译器不对这个指针的指向的存储单元进行优化, 即不用通用寄存器暂时代替这个指针的指向的存储单元,而是每次取值都直接到指针的指向的存储单元取值.volatile 主要用于变量会异步改变的情况下,主要有三个方面:

1.cpu外设寄存器

2.中断和主循环都会用到的全局变量

3.操作系统中的线程间都会用到的公共变量.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

183

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部