写代码注意的细节问题
(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关键字,避免不同优化等级时程序出现错误,提高代码鲁棒性。
腾讯成长空间 1169人发布
