推广 热搜: PLC  PLC编程  电子  自动  控制  步进电机  LED  机器人  AT89S51  控制器 

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

   日期:2018-05-01     浏览:98    评论:0    
核心提示:现在随意假设个宏定义寄存器地址:#define GPFDAT (*(volatile unsigned long*)0x56000000)先假设:unsigned long tmp;定义个无符号长整型变量unsigned long* GPFDAT_
 现在随意假设个宏定义寄存器地址:
#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相关评论

推荐图文
推荐 嵌入式
点击排行

网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报