针对的问题:
实验0x08000000地址的boot1(裸机工程,除片内falsh外,只驱动了led)-> 0x08010000地址的boot2(0x08010000这个地址上也是存放了一个boot程序,基于qboot的RT-Thread Project,除片内falsh外,只驱动了led), 跳转失败。
今天针对这个问题,来打一下断点调试。
跳转失败,跳转前这个裸机boot1工程打印出来的app_func(程序开始地址)、stk_addr(栈顶地址)都是对的啊。
如何知道是对的呢? 查看本帖子开头介绍的查看boot2工程的map文件那段说明。
所以,我选择在boot2工程内进行仿真调试。
下面介绍下仿真调试的过程:
断点可以进入到main函数的前置函数int $Sub$$main(void)。这是RTThread的正常启动流程。
说明boot2工程已经跑起来了。这也说明boot1程序的跳转使命已经完成了。
继续打断点
又发现可以进入到开启调度器的这块代码,但是在执行开启调度器的这个函数内,代码就跑飞了(点仿真运行、过一会点停止,不知道执行到哪去了,函数没有正常结束)。
于是进行概念联想,RTOS的调度-》定时器-》中断, 中断要正常使用,要先重定位异常向量表。
于是在基于qboot的RTThread这个boot2工程内,添加上重定位异常向量表的代码,
再次烧录。
现在
0x08000000地址的boot1(裸机工程,除片内falsh外,只驱动了led) —> 0x08010000地址的boot2(0x08010000这个地址上也是存放了一个boot程序,基于qboot的RT-Thread Project,除片内falsh外,只驱动了led) —> 0x08020000地址的app(非boot程序,app程序,RT-Thread Project,负责业务逻辑,驱动了所有板载外设,LAN8720A PHY、W25Q32等), 跳转成功。
问题解决。
那现在也可以解释为什么下面这种情况可以跳转成功,把APP程序跑起来了
实验0x08000000地址的boot1(裸机工程,除片内falsh外,只驱动了led)-> 0x08020000地址的app(非boot程序,app程序,RT-Thread Project,负责业务逻辑,驱动了所有板载外设,LAN8720A PHY、W25Q32等),跳转成功。
因为我在APP程序里进行了异常向量表的重定位。
现在梳理通了以后,就对本帖子最开始出的步骤1有疑点了。
boot2内没有进行异常向量表的重定位,为什么又可以跑起来呢?boot2是带qboot软件包的基于RTThread的工程,RTOS运行是需要调度器支持的,调度器需要定时器,必须要重定位异常向量表以后才能让定时器中断开始正常工作吧。可实测,boot2工程可以正常跑。
为了保险起见,为了规范操作,我在该boot2工程内添加上重定位异常向量表的代码,再次实验
0x08000000地址的boot1(基于qboot的RT-Thread Project) -> 0x08010000地址的boot2(基于qboot的RT-Thread Project) -> 0x08020000地址的app(RT-Thread Project,负责业务逻辑,驱动了所有板载外设)。实验跳转成功。
心得体会
看来,不规范操作,有时也能成功。但是就会留下坑,影响自己排查问题。
规范的操作的实验结果,才可以和其他的实验结果进行类比分析。
不规范的操作,实验起来却成功的实验结果,和其他的实验结果进行类比分析,将会一头雾水。
.
问 参考qboot源码的stm32 boot跳转动作的细节请教