用C语言宏定义寄存器地址解释 和 关键字 volatile

来源:互联网 发布:弹珠枪在淘宝上怎么搜 编辑:程序博客网 时间:2024/05/17 09:35
现在随意假设个宏定义寄存器地址:
#define GPFDAT  (*(volatile unsigned long*)0x56000000)
先假设:
unsigned long tmp;定义个无符号长整型变量 
unsigned long* GPFDAT_PRT = &tmp;定义个无符号长整型指针
所以现在GPFDAT是存放了地址的指针。同理得:
把0x56000000转换为地址:(volatile unsigned long*)0x56000000,强制转换。
所以0x56000000这个地址中的内容应该为:(*(volatile unsigned long*)0x56000000)。
最后得:GPFDAT这个宏定义代表了某寄存器中的值。

volatile关键字:
别称易失变量:容易丢失的变量;因为编译器为了程序的效率,在编译时会进行一些优化。可有时候我们不希望对某些变量进行优化,所以在变量前加上个volatile关键字,编译器就不会对该变量进行优化了,而是老老实实到内存中再去读取数据。(优化了后可能是把该变量的值存放在某个临时的寄存器中,要用时,直接到寄存器中读取,因为寄存器读取数据比内存中要快很多)。
例:多线程中,一个线程在等另一个线程释放资源时,这个线程会有个while(flag == 0)循环来不断的查看资源是否被释放;而当另个线程把资源释放后会马上修改flag的值,相当于通知等待线程,资源已经释放。这样就不会陷入死锁状态。如果flag变量不用volatile关键字来修饰,将一直读取临时寄存器中的值,而将陷入死锁状态。
0 0
原创粉丝点击