因为我在驱动编写IIC使用软件模拟时IIC 驱动加密芯片的方法,所以需要写一个delay函数控制时序,但当我优化无代码时code优化成最高级别(速度最快,代码最优)后,发现IIC验证没有通过,初步怀疑软件时序的时间是否不对,于是使用IO逻辑分析仪测试了不同延迟函数的时间比较.
//=2022.04.21 为了测试delayms函数延迟的具体时间,使用IO翻转来测量 void TestDelay(void) { LEDInitOnCS0804(); // __enable_irq(); while(1) { LED_ON; atca_delay_us2(1); LED_OFF; atca_delay_us2(1); } }
/************************************************ 优化等级 none low Med High (ms) delayms(1); 0.29 0.27 delayms(4); 0.59 0.57 delayms(10); 1.19 1.17 delayms(1000); 100.1 100.1 100.1 atca_delay_us2(1); 2.75us 1.5us atca_delay_us3(1); 5us 4.75us ************************************************/ 排版不太对齐哈,只测试最高等级和none
每个函数的定义如下
//#pragma optimize=none void delayms(int ms) { //2019.01.01在这里填坑 ///在高级优化选择中,在无动作循环中使用volatile来定义变量 volatile int i; volatile int j; // int i; // int j; // for( i = 0; i<16666; i ) //约 1ms // for( j = 0; j<ms; j ); for( i = 0; i < 1000; i ) //=1000 OK for( j = 0; j < ms; j ); // asm( " nop " ); // asm( " nop " ); // asm( " nop " ); }
void atca_delay_us2(uint32_t nus) { int i; int j; for( i = 0; i < 17; i ) //约 1us = 16.6666 for( j = 0; j < nus; j ); } void atca_delay_us3(uint32_t nus) { volatile int i; volatile int j; for( i = 0; i < 17; i ) //约 1us = 16.6666 for( j = 0; j < nus; j ); }
通过对比发现atca_delay_us2和atca_delay_us3唯一区别就在于变量使用了volatile
总结: 使用volatile在工程中使用代码优化修改变量无影响
最后配上IAR6.3代码优化打开选择界面