打印

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

[复制链接]
1466|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
haokeer|  楼主 | 2016-11-19 20:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
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只是个常量,不是指针更不是变量。

使用特权

评论回复
5
yysforever| | 2016-11-22 10:57 | 只看该作者
maninman1981 发表于 2016-11-20 21:01
(*(volatile unsigned char *)0x20)可看作是一个普通变量,这个变量有固定的地址,
指向0x20。而0x20只是 ...

为什么要这么做呢,一般只要定义了,就不会被优化的吧

使用特权

评论回复
6
冰是睡着的冰| | 2016-11-22 11:02 | 只看该作者
yysforever 发表于 2016-11-22 10:57
为什么要这么做呢,一般只要定义了,就不会被优化的吧

必须要这样做才能够保证硬件地址不被编译器优化成中间变量

使用特权

评论回复
7
Dennis-Zhou| | 2016-11-23 21:59 | 只看该作者
不懂,从来不这么用的。我记得在库函数的底层经常这么用的吧

使用特权

评论回复
8
jouney316| | 2016-11-23 22:08 | 只看该作者
(volatile unsigned *)类型指针,unsigned 后面没有东西吗?

使用特权

评论回复
9
l科科1987| | 2016-11-24 19:41 | 只看该作者
对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射。如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使用汇编语言完成实际对设备的控制,因为C语言并没有提供真正的“端口”的概念。

使用特权

评论回复
10
dongbaohui| | 2016-11-24 19:44 | 只看该作者
如果是内存映射,那就方便的多了。

使用特权

评论回复
11
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,可以读/写操作!

使用特权

评论回复
12
原味_郭| | 2016-11-27 14:41 | 只看该作者
volatile 是什么意思呢?

使用特权

评论回复
13
liutongda| | 2016-11-28 09:08 | 只看该作者
原味_郭 发表于 2016-11-27 14:41
volatile 是什么意思呢?

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

1.cpu外设寄存器

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

3.操作系统中的线程间都会用到的公共变量.

使用特权

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

本版积分规则

11

主题

183

帖子

0

粉丝