前几天重装电脑系统,顺便把所有软件都更新了,MDK5.37版不支持AC5,自然就想把代码更新到AC6,没想到遇到各种坑,折腾了几天,最终没有爬过去,只好退回到AC5,体会如下:
一,AC6的优点(网上都有,我也是看见这些才想升级的)
1、代码小,AC6选Oz和LTO时152k,AC5选O3为172k
2、支持新C++17标准,是发展方向
二,AC6的缺点,网上没人写,本人实测结果
1、编译慢,与网上说的相反,不选Browse Infomation时,AC5是12秒,AC6是44秒,慢了4倍。
2、优化以后有BUG,代码如下:
nBatRecharge = 85; // 充电电量,高于此值不自动充电
nBatYellow = 30; // 黄色报警电量
nBatRed = 20; // 红色报警电量
nBatStop = 10; // 停止电量
编译器把上面4条字节型赋值语句合并成了一条32位赋值语句,但是没有考虑对齐的问题,偏移量0x4A不在4字节对齐处,触发HardFault_Handler中断。想起用MPU_Set_Protection解决这个问题,但是在备份内存中使用这个函数不成功,有时32位不能写,有时8位不能写。后来通过调整变量的位置解决这个问题。
3、case USART3: 不能用,提示USART3是变量,(AC5中没有问题),只好改用if else降低效率
4、上面两项改无以后还有未知的问题,只好放弃了,改回AC5。