Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Bootloader
ota在线升级
qboot
带操作系统的boot,跳转到带操作系统的app发生hardfault
发布于 2022-12-11 04:57:47 浏览:1496
订阅该版
在使用qboot建立bootloader的时候,发现跳转到app后app死机。 查阅很多资料均说是中断没有关干净导致,但是我检查了一遍也没发现。 于是我新建了两个最基础的rtthread工程,一个加上跳转函数作为bootloader,一个在main.c中添加中断向量表偏移函数作为app,但是就这样的组合,跳转还是出现了hardfault,调试可发现其跳转至app,在hw_board_init中,clk_init前开启总中断,执行后就会触发systick中断,随后就hardfault了,但是这个systick中断在bootloader中跳转前已经关闭,跳转函数还是使用的qboot的跳转函数。 我也查阅了很多资料,我怀疑是pendsv搞的鬼,但是我调试时在pendsv处打断点,也没发现进pendsv中断,所以就很困惑。还望有经验的大神指导指导。 rtthread为4.03版本。 bootloader 跳转函数 ```c RT_WEAK void qbt_jump_to_app(const char*part) { typedef void (*app_func_t)(void); rt_uint32_t app_addr = BOOT_APP_ADDR; rt_uint32_t stk_addr = *((__IO uint32_t *)app_addr); app_func_t app_func = (app_func_t)(*((__IO uint32_t *)(app_addr + 4))); if(partInvalid(part, BOOT_APP_ADDR) == RT_TRUE){ return; } LOG_I("Jump to application(%s) 0x%08x 0x%08x running ... ", part,stk_addr,(uint32_t)app_func); rt_thread_mdelay(200); __disable_irq(); HAL_DeInit(); for(int i=0; i<128; i++) { HAL_NVIC_DisableIRQ(i); HAL_NVIC_ClearPendingIRQ(i); } SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; SysTick->CTRL = 0; SysTick->LOAD = 0; SysTick->VAL = 0; HAL_RCC_DeInit(); __set_CONTROL(0); __set_MSP(stk_addr); app_func();//Jump to application running LOG_E("Qboot jump to application fail."); } ``` app ```c /** * Function ota_app_vtor_reconfig * Description Set Vector Table base location to the start addr of app(RT_APP_PART_ADDR). */ static int ota_app_vtor_reconfig(void) { #define NVIC_VTOR_MASK 0x3FFFFF80 /* Set the Vector Table base location by user application firmware definition */ SCB->VTOR = RT_APP_PART_ADDR & NVIC_VTOR_MASK; return 0; } INIT_BOARD_EXPORT(ota_app_vtor_reconfig); ```
查看更多
Consen
2022-12-13
Hello
确认之后来结题了 先说结论 跳转函数在系统时钟主频较低时 跳转函数的执行设定是有点问题的 关闭总中断后最好是优先关闭systick,中间不要夹杂其它代码了。 问题诱因是因为主频配成了8M,导致关总中断后到关闭systick中间的指令时间大于systick触发时间,后续排查时直接看ICSR内存大小端看错了,还以为产生的是MemManager异常,其实就是systick中断挂起了。 就是这样,所以qboot的跳转函数针对指令时间问题可以优化一下,关总中断后优先关闭systick即可 ```c RT_WEAK void qbt_jump_to_app(void) { typedef void (*app_func_t)(void); u32 app_addr = QBOOT_APP_ADDR; u32 stk_addr = *((__IO uint32_t *)app_addr); app_func_t app_func = (app_func_t)(*((__IO uint32_t *)(app_addr + 4))); if ((((u32)app_func & 0xff000000) != 0x08000000) || ((stk_addr & 0x2ff00000) != 0x20000000)) { LOG_E("No legitimate application."); return; } rt_kprintf("Jump to application running ... \n"); rt_thread_mdelay(200); __disable_irq(); SysTick->CTRL = 0; SysTick->LOAD = 0; SysTick->VAL = 0; HAL_DeInit(); for(int i=0; i<128; i++) { HAL_NVIC_DisableIRQ(i); HAL_NVIC_ClearPendingIRQ(i); } HAL_RCC_DeInit(); __set_CONTROL(0); __set_MSP(stk_addr); app_func();//Jump to application running LOG_E("Qboot jump to application fail."); } ```
4
个回答
默认排序
按发布时间排序
aozima
2022-12-11
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
常见的操作你代码中都做了,下步你在APP中单步调试下看看有没新发现。
梅江松子
2022-12-12
这家伙很懒,什么也没写!
```c void app_start(void) { _jumo_to_app jumo_to_app; uint32_t StackAddr; uint32_t ResetVector; __disable_irq(); HAL_MspDeInit(); StackAddr = *(__IO uint32_t *)(FLASH_BASE | APP_STARTUP_ADDR); ResetVector = *(__IO uint32_t *)(FLASH_BASE | APP_STARTUP_ADDR + 4); HAL_DeInit(); /* 函数指针赋值 */ jumo_to_app = (_jumo_to_app)ResetVector; __set_MSP(StackAddr); /* 设置主栈指针 */ jumo_to_app(); } ``` 你试试把APP中设置中断向量表的函数,不用自动初始化,把他放在 系统时钟初始化后面执行
JonasWen
2022-12-12
这家伙不懒,但是什么也不想写!
hw_board_init中会重新初始化滴答定时器,通过INIT_BOARD_EXPORT导入的初始化函数在hw_board_init的最末端才执行。而你又提前开了总中断,自然会报hardfault了。
撰写答案
登录
注册新账号
关注者
1
被浏览
1.5k
关于作者
Consen
Hello
提问
2
回答
2
被采纳
2
关注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 Studio中构建前执行python命令
2
研究一了一段时间RTT,直接标准版上手太难,想用nano,但又舍不得组件
3
CherryUSB开发笔记(一):FSDEV USB IP核的 HID Remote WakeUp (USB HID 远程唤醒) 2025-01-18 V1.1
4
RT-thread 缩写字典
5
RT Thread 源码分析笔记 :线程和调度器
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
Bootloader
AT
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在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
聚散无由
2
篇文章
14
次点赞
catcatbing
2
篇文章
4
次点赞
Wade
2
篇文章
2
次点赞
Ghost_Girls
1
篇文章
5
次点赞
xiaorui
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部