Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
Bootloader
以RT-Thread为操作系统的工程无法正常启动
发布于 2014-08-28 16:28:44 浏览:6671
订阅该版
这是我在工作中遇到的一个和奇怪的问题。 本人使用的是cortex-m4核的stm32F407芯片的扩展板,使用mdk开发环境,操作系统就是`RT-Thread`。 我现在编写的程序是从`0x08000000`地址,即从片内flash偏移量为0x0的地址开始运行,程序能正常启动。 由于我要做一个在线升级的功能,所以我给片内flash划分了两个区,从`0x08000000`开始的是固化区,从`0x08040000`开始的是升级区,所以我每次升级的程序都会烧写到从`0x08040000`开始的地址,如果烧写完整,程序就会从固化区跳转到升级区去运行,跳转的代码如下: ```c int main(void) { /* disable interrupt first */ rt_hw_interrupt_disable(); #if (OS_IAP_ENABLE > 0) //注1:OS_IAP_ENABLE = 1:包含IAP程序段,OS_IAP_ENABLE = 0:运行程序段 //注2:在编译运行程序段时,请将工程Option for Target的ROM地址改为0x08040000 /*Sets the vector table location and Offset*/ NVIC_SetVectorTable(NVIC_VectTab_FLASH, (uint32_t)0x0); /*IAP升级代码段,片内flash的标志位指示有完整升级程序*/ if(((*(__IO uint32_t*)0x807FFFC) == 0x0) && ((*(__IO uint32_t*)0x807FFF8) == 0xffffffff)) { /* Check if valid stack address (RAM address) then jump to user application */ if (((*(__IO uint32_t*)0x08040000) & 0x2FFE0000 ) == 0x20000000) { /* Jump to user application */ JumpAddress = *(__IO uint32_t*) (0x08040004); Jump_To_Application = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) 0x08040000); Jump_To_Application(); } } #else NVIC_SetVectorTable(NVIC_VectTab_FLASH, (uint32_t)0x00040000); #endif /* startup RT-Thread RTOS */ rtthread_startup(); return 0; } ``` 我现在遇到的问题是程序跳到了0x08040000地址开始的程序区运行, - 程序运行到了rt_system_scheduler_start();线程调度这一行,前面所有的初始化都是正常的,但是线程就是起不来; - 我debug让程序停止,Disassembly窗口的指令停在了0xC0000000 0000 MOVS r0,r0 行; - rt_application_init()函数中的所有线程都是调用的rt_thread_init()线程静态初始化接口,而且返回RT_EOK,调用了rt_thread_startup()启动程序。 - 特别不能理解的是整个工程程序在从0x080000000开始的flash区能正常启动,但是烧到0x08040000开始的flash并跳转过去就无法启动了。我试过将一个ucOS的程序烧写到0x08040000flash区,跳转过去可以正常启动,但是rt_thread为操作系统的程序就不行。 这个问题很是奇怪,相信遇到的人也不多,会不会是环境变化导致程序线程调度运行不了呢?恳请有经验的大神帮帮我,非常感谢。
查看更多
9
个回答
默认排序
按发布时间排序
bernard
2014-08-28
这家伙很懒,什么也没写!
异常向量表配置没改?
aozima
2014-08-28
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
首先能肯定的是RT-Thread做IAP时放在任何地址都可以运行的。(有一定对齐要求) 主要检查跳转时的栈和中断向量。 然后APP中自己也可能有错误的设置了中断向量。 全部找出来并核对即可。 其实最好把bootloader中所有`NVIC_SetVectorTable`给干掉, 然后把启动代码按这里的`Magic Code`升级一下:http://www.rt-thread.org/phpBB3/topic3221.html 这样链接到哪,就自动设置到哪,使用方便,修改地址后不用检查修改代码。
claudling
2015-02-11
这家伙很懒,什么也没写!
1、找到system_stm32f10x.c ``` #define VECT_TAB_OFFSET 0x0000 /*!< Vector Table base offset field. ``` 修改为 ``` #define VECT_TAB_OFFSET 0x3000 /*!< Vector Table base offset field. ``` 2、找到misc.h ``` #define NVIC_VectTab_FLASH ((uint32_t)0x080030000) ``` 修改为 ``` #define NVIC_VectTab_FLASH ((uint32_t)0x08003000) ``` 3、修改icf文件 ``` /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08000000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; ``` 改为 ``` /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08003000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x08003000; ``` 按照上面的方式修改了app,所有 rt_system_scheduler_start();之前都可以执行,所有线程中的代码都没运行,怎么破?
aozima
2015-02-11
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
看您的意图是,APP地址从flash的12K(0x3000)开始。 这里的原始值有不对吧 >2、找到misc.h > > >``` >#define NVIC_VectTab_FLASH ((uint32_t)0x080030000) >``` > > >修改为 > > >``` >#define NVIC_VectTab_FLASH ((uint32_t)0x08003000) >``` --- 因代码中有多处对 SCB->VTOR 进行修改,建议在执行 rt_hw_context_switch_to前 对 SCB->VTOR(@0xE000ED08) 的值进行检查以确认是否为正确的 0x08003000 最好取消这些作法,而使用上面的 Magic Code,这样所有的定义和设置都不必要,只要保证链接脚本(IAR是icf文件)正确就可以自动设置了。 如果还不行,建议进行汇编级单步,并重点检查执行线程切换后是否有正确进入 PendSV_Handler
claudling
2015-02-11
这家伙很懒,什么也没写!
是的aozima,下面是笔误。 我在程序挂起的时候用IAR读出SCB->VTOR的值是0x08003000,但是由于我的IAR是bootloader的工程,跳转后感觉没法跟踪了。 >看您的意图是,APP地址从flash的12K(0x3000)开始。 > >这里的原始值有不对吧 >>2、找到misc.h >> >> >>``` >>#define NVIC_VectTab_FLASH ((uint32_t)0x080030000) >>``` >> >> >>修改为 >> >> >>``` >>#define NVIC_VectTab_FLASH ((uint32_t)0x08003000) >>``` > >--- > > > >因代码中有多处对 SCB->VTOR 进行修改,建议在执行 rt_hw_context_switch_to前 对 SCB->VTOR(@0xE000ED08) 的值进行检查以确认是否为正确的 0x08003000 >最好取消这些作法,而使用上面的 Magic Code,这样所有的定义和设置都不必要,只要保证链接脚本(IAR是icf文件)正确就可以自动设置了。 > >如果还不行,建议进行汇编级单步,并重点检查执行线程切换后是否有正确进入 PendSV_Handler ---
aozima
2015-02-11
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
调试技巧: 1. bootloader中至少可以跑到跳转后的指令,确认是APP的启动地址。(cortex-M系列的第一条指令请仔细阅读参考手册) 2. 保持bootloader不要擦除,然后在app中调试,断点最早可以下到启动代码的第一条指令,然后就跟没有bootloader的调试一样了。 STM32本身都是有bootloader的,可以简单理解为STM32的0->0x08000000是厂家内置的bootloader。
zchong
2015-02-11
这家伙很懒,什么也没写!
这个和rt-thread无关,使用IAP注意一下几点: 1、bootloader跳转到app前,最好把所有中断都关掉; 2、app的连接地址,以及app的中断想量表偏移地址设置是否正确; 3、跳转到app前的sp设置是否正确。
claudling
2015-02-11
这家伙很懒,什么也没写!
第一个问题,通过如下判断确认cortex-M的指令。 ``` u32 ret = ((*(vu32*)ApplicationAddress) & 0x2FFE0000 ); if (ret == 0x20000000) ``` 第二个,每次通过IAR下载APP,总会把bootloader(0x800 0000 ~ 0x800 2FFF)给擦除,所以不知道怎么通过单步来跟踪。 还请指教。3q >调试技巧: >1. bootloader中至少可以跑到跳转后的指令,确认是APP的启动地址。(cortex-M系列的第一条指令请仔细阅读参考手册) >2. 保持bootloader不要擦除,然后在app中调试,断点最早可以下到启动代码的第一条指令,然后就跟没有bootloader的调试一样了。 >STM32本身都是有bootloader的,可以简单理解为STM32的0->0x08000000是厂家内置的bootloader。 ---
zchong
2015-02-12
这家伙很懒,什么也没写!
进入app后,汇编代码还是可以跟踪的 烧些的时候不要都擦除,只擦除受影响的部分 >第一个问题,通过如下判断确认cortex-M的指令。 > > >``` >u32 ret = ((*(vu32*)ApplicationAddress) & 0x2FFE0000 ); >if (ret == 0x20000000) >``` > > >第二个,每次通过IAR下载APP,总会把bootloader(0x800 0000 ~ 0x800 2FFF)给擦除,所以不知道怎么通过单步来跟踪。 >还请指教。3q >>调试技巧: >>1. bootloader中至少可以跑到跳转后的指令,确认是APP的启动地址。(cortex-M系列的第一条指令请仔细阅读参考手册) >>2. 保持bootloader不要擦除,然后在app中调试,断点最早可以下到启动代码的第一条指令,然后就跟没有bootloader的调试一样了。 >>STM32本身都是有bootloader的,可以简单理解为STM32的0->0x08000000是厂家内置的bootloader。 > >--- ---
撰写答案
登录
注册新账号
关注者
1
被浏览
6.7k
关于作者
东方易岚
这家伙很懒,什么也没写!
提问
2
回答
3
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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-smart启动流程分析
2
EtherKit快速上手PROFINET
3
RTThread USB转串口无法接收数据
4
HC32F4A0 SD卡挂载及热插拔的实现
5
vscode插件 - RT-Thread Studio项目助手 | 跨平台开发
热门标签
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
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
812
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部