写代码注意的细节问题

(1)由于精度原因,判断两个小数是否相等不能用等号,要用“树的结构”

  double K1,K2;    
      if(K1==K2)
        .... 

double 类型的比较要用equal()函数来判断是否相等,因为直接用==精度不够,小数点后6位后的不同可能会默认为相等,其实相当于约等于。

(2)volatile关键字

uint8_t Flag;
int main()
{
    ...
    while(1)
    {
        if(Flag==1)
        do();
    }
}
void TIM_IRQHandler(void)
{
    ...
    Flag=1;
}

主函数和中断函数都要用到Flag变量,一般Debug的时候可能没有问题,但是当release版本的时候会出现问题。这是因为某些编译器在编译代码的时候会进行相应的优化,在中断的时候改变了变量值但是主函数却没改变。
当把变量用关键字volatile定义为

 volatile uint8_t Flag;

volatile关键字会提醒编译器该变量是容易改变的,每次存储或者读取该变量的时候一定要从变量地址读取数据。在中断或者多线程的代码中经常使用volatile关键字,避免不同优化等级时程序出现错误,提高代码鲁棒性。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务