最新消息:数据恢复成功,博主又回来啦,和你们同在!

新冠肺炎下的STM32调试之凌乱的LTO

MCU ZmmFly 128浏览 0评论

无法去公司,无法买到物料,甚至无法出小区

只能与远在北京的同事进行远程调试;

在同事的帮忙下,接上ST-LINK,接上串口

一、HardFault

HardFault!第一个遇到的就是这个问题,加堆栈,无效,没用,问题依旧;

单步,问题出在Flash的一个读写函数上,用嵌套union将配置存到一个uint64里写入Flash

HardFault就出现在擦除的时候,

仔细对比寄存器发现,在刚进入在线调试时Flash错误寄存器里有错误标志被置位了

困扰了5天,解决掉了,程序也由C++改为纯C

二、LTO

Flash配置存储调通后,printf打印始终无法正常输出,但是在单步里看内存又是正常的

因为使用了sscanf高级特性,无法使用MicroLIB,否则提示有函数未定义

到处找问题,调了3天,偶然情况下将LTO关闭,

编译烧录,输出正常;

为什么确认是LTO的问题?

因为调完第一个程序,后面第二个又遇到了同样的问题,对比编译配置,发现仅LTO项不同

三、终

  1. 遇到HardFault不慌,加堆栈大小,有scanf看scanf是否将uint8当uint32,有内存操作看是否有内存操作越界
  2. printf输出异常关LTO

注:LTO,全称Link-Time Optimization,为Keil中编译选项,开启后能大幅缩小ROM编译出来的尺寸,

但是有时会在编译链接时将非显式调用函数删除,导致一系列的链接报错,或各种因删除了函数导致的奇怪HardFault或跑飞,慎用!

转载请注明:神奇海域 » 新冠肺炎下的STM32调试之凌乱的LTO

发表我的评论
取消评论

Protected by WP Anti Spam

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址