在中断函数中会修改的变量需要使用volatile加以修饰,原因是编译器经常会将代码进行优化处理,特别是在while循环中,会造成中断函数中修改了该变量,但是在中断外的该变量调用却永远没有更新,是因为编译器优化掉了循环读取该变量部分的代码,也就是只读取1次。 ======================================================================= 背景说明: 1、m_24g_rx_complete变量在优先级更高的中断函数中会修改; 2、m_24g_rx_complete的指针值放置在寄存器r4中; 3、drv_pmu_timer_cnt_get()的指针值放置在r5+0x54中; ======================================================================= 代码分析: 无volatile修饰m_24g_rx_complete(寄存器r4中)的代码读取了一次后就跳到了0x201b2c,接下来被只执行om_time_past()的循环判断。 有volatile修饰的代码汇编会一直循环执行获取m_24g_rx_complete(寄存器r4)的值和判断om_time_past(); ======================================================================= C源码 while(1) { rx_successful = m_24g_rx_complete; if(rx_successful) { break; } else { if(om_time_past(rx_duration_time, drv_pmu_timer_cnt_get())) { if(--m_24g_sync_times == 0) { drv_tim_gp_stop(RF24G_LINK_TIMER); m_24g_link_state=RF24G_LINK_STATE_RECONN; } OM24G_CE_LOW(); break; } } } 无volatile修饰的编译结果 有volatile修饰的编译结果 |