Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Bootloader
stm32
跳转
5
参考qboot源码的stm32 boot跳转动作的细节请教
发布于 2022-03-16 17:36:23 浏览:969
订阅该版
单片机升级流程:  跳转动作,是实现升级功能的必要步骤。 针对升级过程中的跳转动作,进行实验。 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. 相关源码:  实际boot时,这几句的打印结果如下 qboot.c Jump to application running ... app_func=0x8011d11 == stk_addr=0x20002fc0 == 这两个是啥地址? 经过百度,解答: app_func值为程序开始地址(复位地址), PS:用户代码区第二个字为程序开始地址(复位地址) stk_addr值为待初始化的APP的堆栈指针,PS:用户代码区的第一个字用于存放栈顶地址 查看boot2工程的map文件(boot2相对于boot1而言,),验证上面两个地址   **步骤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工程内进行仿真调试。 下面介绍下仿真调试的过程:  断点可以进入到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,负责业务逻辑,驱动了所有板载外设)。实验跳转成功。 **心得体会 看来,不规范操作,有时也能成功。但是就会留下坑,影响自己排查问题。 规范的操作的实验结果,才可以和其他的实验结果进行类比分析。 不规范的操作,实验起来却成功的实验结果,和其他的实验结果进行类比分析,将会一头雾水。** .
踩姑娘的小蘑菇
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
被浏览
969
关于作者
大话西游2018
这家伙很懒,什么也没写!
提问
35
回答
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
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
五分钟玩转RT-Thread新社区
5
国产MCU移植系列教程汇总,欢迎查看!
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
如何用Ubuntu qemu跑zephyr_polling的蓝牙
2
分享一种很简单的不阻塞TCP发送方法
3
stm32c86使用串口3时无法正常读到中断的数据
4
如何用ART-PI跑zephyr_polling的蓝牙
5
掌上单片机实验室 – 基于 RTT 框架的第一个应用
热门标签
RT-Thread Studio
串口
LWIP
Env
SPI
AT
FinSH
Bootloader
CAN总线
ART-Pi
Hardfault
文件系统
USB
DMA
RT-Thread
线程
SCons
RT-Thread Nano
stm32
MQTT
ESP8266
ota
UART
RTC
freemodbus
rtthread
rt-smart
packages_软件包
I2C
WIZnet_W5500
flash
cubemx
FAL
定时器
BSP
AB32VG1
PWM
ADC
SDIO
msh
socket
LVGL
keil
Debug
C++_cpp
中断
编译报错
SFUD
SMP
MicroPython
本月问答贡献
出出啊
1431
个答案
317
次被采纳
小小李sunny
1342
个答案
267
次被采纳
crystal266
505
个答案
149
次被采纳
whj467467222
1212
个答案
142
次被采纳
张世争
590
个答案
135
次被采纳
本月文章贡献
出出啊
3
篇文章
5
次点赞
小小李sunny
1
篇文章
1
次点赞
crystal266
1
篇文章
3
次点赞
whj467467222
2
篇文章
4
次点赞
张世争
6
篇文章
14
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部