Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Bootloader
STM32
bootload跳转到app
5
参考qboot源码的stm32 boot跳转动作的细节请教
发布于 2022-03-16 17:36:23 浏览:2022
订阅该版
[tocm] 单片机升级流程: ![image.png](https://oss-club.rt-thread.org/uploads/20220316/0e6c4b5ab4112cba941d6508a6161469.png.webp) 跳转动作,是实现升级功能的必要步骤。 针对升级过程中的跳转动作,进行实验。 2022.3.13 周日 升级跳转实验 ## 步骤1. 实验了0x08000000地址的boot1(基于qboot的RT-Thread Project) -> 0x08010000地址的boot2(基于qboot的RT-Thread Project) -> 0x08020000地址的app(RT-Thread Project,负责业务逻辑,驱动了所有板载外设),实验跳转成功,验证了两个boot+一个app,这样连续跳转的基本原理,在实践上是可行的。 另外,也验证了直接由boot1不经过boot2,直接跳转到app,可行。只需要修改boo1工程内的跳转地址,由原来的boot2地址修改为app地址即可。 步骤1实验很**成功**。 不理解处,Boot1内打印的待跳转地址(函数指针app_func的值), 我填入待跳转地址是0x08010000. 相关源码: ![image.png](https://oss-club.rt-thread.org/uploads/20220316/8b25b1bde9f87cf3c386542d4fe2ebde.png.webp) 实际boot时,这几句的打印结果如下 qboot.c Jump to application running ... app_func=0x8011d11 == stk_addr=0x20002fc0 == 这两个是啥地址? 经过百度,解答: app_func值为程序开始地址(复位地址), PS:用户代码区第二个字为程序开始地址(复位地址) stk_addr值为待初始化的APP的堆栈指针,PS:用户代码区的第一个字用于存放栈顶地址 查看boot2工程的map文件(boot2相对于boot1而言,),验证上面两个地址 ![image.png](https://oss-club.rt-thread.org/uploads/20220316/7760b399897c148ea621fd64838939f8.png.webp) ![image.png](https://oss-club.rt-thread.org/uploads/20220316/4ec66e953c85f7f2c7975ae9d73c5a8f.png.webp) ## 步骤2. 实验0x08000000地址的boot1(裸机工程)-> 0x08010000地址的boot2(基于qboot的RT-Thread Project), 跳转失败。 思路1,改变裸机工程的大小,再来试一试?不过本实验的boot1程序所占用的flash资源已经是小于64KB了,为什么还失败呢。 实测,将裸机工程修改得更小,占用flash更小(不到5KB),还是无法跳转。 本实验内,裸机跳转RTThread工程失败,**打印的这俩地址(app_func、stk_addr)和 步骤1的是一模一样的,为什么会**跳转失败**呢**? ## 步骤3. 实验0x08000000地址的boot1(裸机工程)-> 0x08020000地址的app(RT-Thread Project,负责业务逻辑,驱动了所有板载外设), **跳转成功**。 我的裸机工程内的跳转函数,是直接使用的qboot内复制过来的 qbt_jump_to_app()函数。 为什么可以跳转到我的位于0x08020000的qboot RTT工程,却不能跳转到位于0x08010000的qboot RTT工程? 或者说stm32 boot时有什么注意事项吗?希望大伙能多提供点思路,便于排查问题。感谢。 .
查看更多
3
个回答
默认排序
按发布时间排序
大话西游2018
2022-03-17
这家伙很懒,什么也没写!
针对的问题: 实验0x08000000地址的boot1(裸机工程,除片内falsh外,只驱动了led)-> 0x08010000地址的boot2(0x08010000这个地址上也是存放了一个boot程序,基于qboot的RT-Thread Project,除片内falsh外,只驱动了led), 跳转失败。 今天针对这个问题,来打一下断点调试。 跳转失败,跳转前这个裸机boot1工程打印出来的app_func(程序开始地址)、stk_addr(栈顶地址)都是对的啊。 如何知道是对的呢? 查看本帖子开头介绍的查看boot2工程的map文件那段说明。 所以,我选择在boot2工程内进行仿真调试。 下面介绍下仿真调试的过程: ![image.png](https://oss-club.rt-thread.org/uploads/20220317/4c412a50a67444cca7a3af14298b4ded.png) 断点可以进入到main函数的前置函数int $Sub$$main(void)。这是RTThread的正常启动流程。 说明boot2工程已经跑起来了。这也说明boot1程序的跳转使命已经完成了。 继续打断点 ![image.png](https://oss-club.rt-thread.org/uploads/20220317/9d1265e2a4f28fdc4f703afbc3f8427a.png.webp) 又发现可以进入到开启调度器的这块代码,但是在执行开启调度器的这个函数内,代码就跑飞了(点仿真运行、过一会点停止,不知道执行到哪去了,函数没有正常结束)。 **于是进行概念联想,RTOS的调度-》定时器-》中断, 中断要正常使用,要先重定位异常向量表。** 于是在基于qboot的RTThread这个boot2工程内,添加上重定位异常向量表的代码, ![image.png](https://oss-club.rt-thread.org/uploads/20220317/8581a8190d0779ba0ee8cc6a25b0d373.png.webp) 再次烧录。 现在 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有疑点了。 ![image.png](https://oss-club.rt-thread.org/uploads/20220317/d67c86a7e3d471c8bee70474a4bd496c.png) boot2内没有进行异常向量表的重定位,为什么又可以跑起来呢?boot2是带qboot软件包的基于RTThread的工程,RTOS运行是需要调度器支持的,调度器需要定时器,必须要重定位异常向量表以后才能让定时器中断开始正常工作吧。可实测,boot2工程可以正常跑。 为了保险起见,为了规范操作,我在该boot2工程内添加上重定位异常向量表的代码,再次实验 0x08000000地址的boot1(基于qboot的RT-Thread Project) -> 0x08010000地址的boot2(基于qboot的RT-Thread Project) -> 0x08020000地址的app(RT-Thread Project,负责业务逻辑,驱动了所有板载外设)。实验跳转成功。 **心得体会 看来,不规范操作,有时也能成功。但是就会留下坑,影响自己排查问题。 规范的操作的实验结果,才可以和其他的实验结果进行类比分析。 不规范的操作,实验起来却成功的实验结果,和其他的实验结果进行类比分析,将会一头雾水。** .
踩姑娘的小蘑菇
2022-03-16
这家伙很懒,什么也没写!
跳转前关闭所有中断,另外最好对外设都进行反初始化
出出啊
2022-03-16
恃人不如自恃,人之为己者不如己之自为也
1. 实验0x08000000地址的boot1(裸机工程)-> 0x08020000地址的boot2(基于qboot的RT-Thread Project) 2. 实验0x08000000地址的boot1(裸机工程)-> 0x08010000地址的app(基于qboot的RT-Thread Project) 这两种情况,第一种能成功?第二种就不行了?
撰写答案
登录
注册新账号
关注者
0
被浏览
2k
关于作者
大话西游2018
这家伙很懒,什么也没写!
提问
36
回答
40
被采纳
1
关注TA
发私信
相关问题
1
Linux下通过USBTinyISP为Arduino开发板烧?写Bootloader
2
请教修改NVIC后RTT调度函数失效的问题[已解决 bootloader中打开了不必要的中断]
3
进入bootloader的方式探讨
4
求助:IAP里的APP使用的RTT,跳转后出错。[已解决]
5
有没有人在STM32F103上用UART IAP跑过RT-Thread?
6
想做网口的IAP远程升级,不知可不可行
7
IAP问题
8
[已解决]请教基于RTT的IAP程序切换到应用程序不成功的问题(基于STM32F4)?
9
stm32f4xx-----IAP移植APP程序需要注意的地方
10
在调试IAP网络升级遇到跳转之后bootloader程序网络不通
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【RT-Thread】【ci】【scons】将ci.attachconfig.yml和scons结合使用
2
Rt-thread中OTA下载后,bootloader不搬程序
3
ulog 日志 LOG_HEX 输出时间改为本地日期时间
4
在RT-Thread Studio中构建前执行python命令
5
研究一了一段时间RTT,直接标准版上手太难,想用nano,但又舍不得组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1518
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
5
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部