RT-Thread 升级时起始运行地址不是0x08000000

我调试STM32程序,带RT-Thread操作系统,将程序起始位置修改为0x08008000,程序就不能正常运行了,如改回成0x08000000,就可以了。如果我不用操作系统程序没问题。有谁晕倒过这样的事啊?求助!


找到原因了,原来在RTT的系统里初始化程序有两次重复修改了SCB->VTOR寄存器。

首先修改

#define VECT_TAB_OFFSET  0x8000 

1、SystemInit()函数:
#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif 

2、boad.c文件下,NVIC_Configuration():
#ifdef  VECT_TAB_RAM
        /* Set the Vector Table base location at 0x20000000 */
         //NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
        /* Set the Vector Table base location at 0x08000000 */
         //NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
将红色部分注释掉就可以正常跳转了。
### STM32 RT-Thread 修改 Flash 起始地址配置方法 在 STM32 上使用 RT-Thread ,如果需要修改 Flash 的起始地址以支持特定需求(如将中断向量表指向外部 Flash 地址),可以通过以下方式实现。 #### 中断向量表重定位 为了使程序能够从指定的 Flash 地址(例如 `0x90000000`)加载并执行业务代码,必须重新设置中断向量表的位置。通常情况下,默认的中断向量表位于内部 Flash 的起始位置(通常是 `0x08000000`)。通过调整启动文件中的代码可以完成这一操作: ```c void SystemInit(void) { SCB->VTOR = 0x90000000; // 将中断向量表基址设置为外部 Flash 地址[^1] } ``` 上述代码片段展示了如何利用 ARM Cortex-M 处理器的 VTOR 寄存器来更改中断向量表的位置。此寄存器用于存储中断向量表的基址,将其赋值为目标地址即可完成重定向。 #### BSP 制作教程参考 对于具体的移植过程,可参照官方提供的 STM32 系列 BSP 制作教程文档[^2]。该文档详细描述了如何针对不同硬件平台定制 RT-Thread 的 BSP 文件结构以及必要的驱动适配工作。 #### 用户配置文件路径设定 除了基础的硬件初始化外,还需要关注用户定义部分的配置项。具体来说,在项目目录下的 `user` 文件夹中找到 `rtconfig.h` 文件,并确保其包含正确的头文件路径声明[^3]。这样做的目的是让编译器能够在构建过程中正确解析所需的宏定义和其他依赖关系。 #### 动态内存管理策略调整 值得注意的是,在某些特殊场景下可能遇到因默认采用动态内存分配而导致的任务无法正常运行的情况。此建议切换至静态内存管理模式。即取消掉与动态内存有关的部分选项配置,并显式地为每一个需要用到堆栈空间的对象指明大小范围[^4]。 综上所述,要成功地把 RT-Thread 移植到带有自定义闪存映射布局的 STM32 微控制器上,不仅需要合理安排好固件镜像下载后的入口点及其关联资源分布情况;而且还要仔细核查软件框架层面的各项参数选取是否符合实际应用场景的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值