本帖最后由 shipeng 于 2023-11-30 21:32 编辑
最近遇到一个奇怪的BUG让我对未知的领域充满恐惧,这是一种对未知问题的束手无策并对自己的能力不足陷入一种强烈的危机感。事情是这样塞尔蒂:我做了一个boot loader用来引导一个FREERTOS的APP,在调试模式(调试APP)可以看到软件可以正常引导跳转到APP运行,但是你不能在freertos初始化后面打断点也不能暂停否则就分分钟跑飞了。跑飞时看PC值是到boot loader里面去了。起初一直以为是freertos的锅。但是不用boot loader直接跑APP是没有任何问题的。有试过一次不用freertos直接跑裸机好像也没有问题,但是无奈freertos这位大哥我不敢动他,他的内部运行机制可以说全都是我的盲区。无奈只能去搜索引擎上找结果,但是似乎从来都没有人遇到过我这种问题,一个匹配的结果都没找到。
最后调了我好几天也没解决问题,实在没办法找了一个别人写的bootloader来试好像就可以了,没想到还是boot loader的锅。经过比对发现是跳转前对堆栈地址校验出了问题:
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
{
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
Jump_To_Application();
}
if条件那个不符合,要改成if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FF00000 ) == 0x20000000)才可以。但是我又不理解了仿真调试的时候不是跳转APP没有问题吗?难道仿真调试APP的时候不会运行boot loader,仿真器会自行跳转APP运行?这不是误导人吗?如果一开始就不跳转我也不会找错方向了白白耽误我好几天的时间。真是坑爹了。
|