Volatile的作用

pengam · 14次点击 · 21小时前

在中断函数中会修改的变量需要使用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修饰的编译结果

image.png


image.png


有volatile修饰的编译结果

image.png



被收藏 0  ∙  0 赞  
加入收藏
点赞
0 回复  
善言善语 (您需要 登录 后才能回复 没有账号 ?)

请先登录网站