(*(volatile unsigned *)0x20)讲解
2011-11-18 09:31
381 查看
对于(volatile unsigned char *)0x20我们再分析一下,它是由两部分组成:
1)(unsigned char *)0x20,0x20只是个值,前面加(unsigned char *)表示0x20是个地址,而且这个地址类型是unsigned char ,意思是说读写这个地址时,要写进unsigned char 的值,读出也是unsigned char 。
2)volatile,关键字volatile 确保本条指令不会因C 编译器的优化而被省略,且要求每次直接读值。例如用while((unsigned char *)0x20)时,有时系统可能不真正去读0x20的值,而是用第一次读出的值,如果这样,那这个循环可能是个死循环。用了volatile 则要求每次都去读0x20的实际值。
那么(volatile unsigned char *)0x20是一个固定的指针,是不可变的,不是变量。而char *u则是个指针变量。
再在前面加"*":*(volatile unsigned char *)0x20则变成了变量(普通的unsigned char变量,不是指针变量),如果#define i (*(volatile unsigned char *)0x20),那么与unsigned char i是一样了,只不过前面的i的地址是固定的。
那么你的问题就可解答了,(*(volatile unsigned char *)0x20)可看作是一个普通变量,这个变量有固定的地址,指向0x20。而0x20只是个常量,不是指针更不是变量。
就是地址0x20里的值。
1)(unsigned char *)0x20,0x20只是个值,前面加(unsigned char *)表示0x20是个地址,而且这个地址类型是unsigned char ,意思是说读写这个地址时,要写进unsigned char 的值,读出也是unsigned char 。
2)volatile,关键字volatile 确保本条指令不会因C 编译器的优化而被省略,且要求每次直接读值。例如用while((unsigned char *)0x20)时,有时系统可能不真正去读0x20的值,而是用第一次读出的值,如果这样,那这个循环可能是个死循环。用了volatile 则要求每次都去读0x20的实际值。
那么(volatile unsigned char *)0x20是一个固定的指针,是不可变的,不是变量。而char *u则是个指针变量。
再在前面加"*":*(volatile unsigned char *)0x20则变成了变量(普通的unsigned char变量,不是指针变量),如果#define i (*(volatile unsigned char *)0x20),那么与unsigned char i是一样了,只不过前面的i的地址是固定的。
那么你的问题就可解答了,(*(volatile unsigned char *)0x20)可看作是一个普通变量,这个变量有固定的地址,指向0x20。而0x20只是个常量,不是指针更不是变量。
就是地址0x20里的值。
相关文章推荐
- 解读 *(volatile unsigned int *)0x30008000 的含义
- #define GPFCON (* (volatile unsigned long * )0x56000050 )
- (*(volatile unsigned char *)0x20)的意义(先记录下来)
- #define A (* (volatile unsigned *) 0x48000000 )讲解(转)
- (*(volatile unsigned char *)0x20)用法
- *(volatile unsigned *)0x4F000000 的理解
- volatile关键字的简单讲解
- ARM特殊寄存器定义详解——#define A (* (volatile unsigned long *) 0x48000000(zz)
- (*(volatile unsigned int *))
- 详解C中volatile关键字(讲解的很详细,还有优化问题(硬软件优化))
- React Native控件之PullToRefreshViewAndroid下拉刷新组件讲解(20)
- 线程安全的理论讲解(volatile)
- (*(volatile unsigned int *))详解-数值常量如何转化为内存地址_转阿拉丁神丢新浪博
- Linux-20-远程连接linux根据原理讲解故障排查思路(L004-02)
- ARM特殊寄存器定义详解——#define A (* (volatile unsigned long *) 0x48000000
- #define IOPIN (*((volatile unsigned long *) 0xE0028000))
- 一个表达式 *(volatile unsigned short int *)(0x60020000)=val; 的解析
- 【补充】 嵌入式中的 *(volatile unsigned int *)理解
- (*(volatile unsigned long *)
- ARM学习随笔(6)volatile以及对(*(volatile unsigned long *))的理解