资讯详情

LPC1768 关于延时Delay时间与不同等级的优化对比

因为我在驱动编写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代码优化打开选择界面

标签: 国产atca电源连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台