第2个B类问题-程序灌写后卡死

第2个B类问题-灌写程序后卡死

问题出现的现象

​ 1.灌写程序后卡死问题解决后,出现User程序灌写后不执行,按复位键程序之间跳回到BIOS。

​ 2.在未使用投屏时,程序大概率可以灌写成功,使用投屏后,程序大概率灌写失败。

​ 3.第一扇区在烧写后机器码消失,其他扇区存在机器码。

​ 4.在O0编译下能够烧写成功,在O1编译下大概率烧写失败。

问题出现的原因

​ 在O1优化等级下,函数循环被优化,循环被加快(具体优化可见嵌入式系统—8-编译优化等级详解),导致在O1优化下延时过短,进入跳转程序后,由于芯片电压不稳定,程序第一扇区被擦写后无法重新写入,导致第一扇区机器码消失。

问题解决的过程

​ 1.由于未使用投屏程序可以正常灌写,而使用投屏无法正常灌写,而且无法在其他机器上复现问题,认定是PC机的问题。后在未投屏情况下已经其他电脑中也发现类似情况,排除是投屏导致的问题。

​ 2.多次测试后,发现灌写程序后第一扇区机器码消失,认定Flash构件有问题,在Flash写入前后加了延时和其他保护措施以及在上位机添加延时,发现未能解决问题。

​ 3.经王老师使用反馈,O0编译下程序灌写不会出错,O1编译下程序出现错误,将问题在本机复现。

​ 4.由于第一扇区机器码被擦除,对每一帧进行了断点调试,发现写入第二帧后第一帧机器码并未消失,并且写完所有帧后,前面机器码均未消失,认定写入过程并未出现异常,并且手动按下复位键程序可以正常运行,而通过上位机复位第一帧依旧被擦除,定位至底层复位时发生问题,结合对编译优化等级的理解定位至循环问题,加大循环时间或不优化即可解决问题。

问题解决的办法

​ 1.加大延时时间,由原来的20000改成100000。

​ 2.对循环使用的变量采取不优化策略,将uint32_t改为vuint32_t。