1354|6

321

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

STM32 调试可以运行退出调试跑飞 [复制链接]

本帖最后由 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运行?这不是误导人吗?如果一开始就不跳转我也不会找错方向了白白耽误我好几天的时间。真是坑爹了。

此帖出自stm32/stm8论坛

最新回复

其实就是程序有问题     详情 回复 发表于 2023-12-4 11:44
点赞 关注
个人签名模电临时工
 

回复
举报

6149

帖子

6

TA的资源

版主

沙发
 

直接跳转操作还是要慎之又慎,引导和应用部分应该是分别编译的吧,之后要和到一块在下载进去,单独调试肯定只是其中一部分

此帖出自stm32/stm8论坛

点评

是的,单独调应用部分发现可以正常进入main函数,但是你让他自己跑就又不行了不知道跑到哪里去了,说来也是巧合刚好我的printf打印又出了问题,有时能打印有时又不行,如果打印功能正常我也早发现问题的根源了,刚好  详情 回复 发表于 2023-12-1 19:38
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 

回复

321

帖子

1

TA的资源

一粒金砂(高级)

板凳
 
秦天qintian0303 发表于 2023-12-1 10:30 直接跳转操作还是要慎之又慎,引导和应用部分应该是分别编译的吧,之后要和到一块在下载进去,单独调试肯定 ...

是的,单独调应用部分发现可以正常进入main函数,但是你让他自己跑就又不行了不知道跑到哪里去了,说来也是巧合刚好我的printf打印又出了问题,有时能打印有时又不行,如果打印功能正常我也早发现问题的根源了,刚好第一次用SWV打印调试问题多如牛毛,打印就像双缝干涉时有时无,BUG掩护BUG再牛逼的人也很难发现更何况是菜鸡如我。

此帖出自stm32/stm8论坛

点评

printf打印是在哪里的?你的程序应该是已经跑飞,只能收到跑飞前的,还是好好检查一下跳转吧,可以加一下灯的控制来指示  详情 回复 发表于 2023-12-1 23:51
 
个人签名模电临时工
 

回复

6149

帖子

6

TA的资源

版主

4
 
shipeng 发表于 2023-12-1 19:38 是的,单独调应用部分发现可以正常进入main函数,但是你让他自己跑就又不行了不知道跑到哪里去了,说来也 ...

printf打印是在哪里的?你的程序应该是已经跑飞,只能收到跑飞前的,还是好好检查一下跳转吧,可以加一下灯的控制来指示

此帖出自stm32/stm8论坛

点评

问题是已经解决了,只是付出的代价有点高,花了好几天时间才解决。由于printf功能异常导致我错误高估了问题的复杂性,而且从问题的表象分析指向了一个完全错误的方向。  详情 回复 发表于 2023-12-4 10:00
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复

321

帖子

1

TA的资源

一粒金砂(高级)

5
 
秦天qintian0303 发表于 2023-12-1 23:51 printf打印是在哪里的?你的程序应该是已经跑飞,只能收到跑飞前的,还是好好检查一下跳转吧,可以加一下 ...

问题是已经解决了,只是付出的代价有点高,花了好几天时间才解决。由于printf功能异常导致我错误高估了问题的复杂性,而且从问题的表象分析指向了一个完全错误的方向。

此帖出自stm32/stm8论坛

点评

其实就是程序有问题    详情 回复 发表于 2023-12-4 11:44
 
个人签名模电临时工
 
 

回复

6149

帖子

6

TA的资源

版主

6
 
shipeng 发表于 2023-12-4 10:00 问题是已经解决了,只是付出的代价有点高,花了好几天时间才解决。由于printf功能异常导致我错误高估了问 ...

其实就是程序有问题  

此帖出自stm32/stm8论坛
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复

321

帖子

1

TA的资源

一粒金砂(高级)

7
 
本帖最后由 shipeng 于 2023-12-7 19:44 编辑

我发这个贴子的主要目的有两个:

1.希望可以帮到有缘人;

2.为了说明一个道理希望能给大家一些启示:很多仿真分析的问题表象都是误导人的就是为了把你骗进坑里面,关键还是要用printf靠谱点。

我话说完,谁赞成谁反对?

此帖出自stm32/stm8论坛
 
个人签名模电临时工
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表