打印
[STM32H7]

boot与app的跳转,存在一个小问题

[复制链接]
593|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
梧桐uuu|  楼主 | 2025-2-28 23:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
经过测试,能够从boot到app的跳转,使用Keil V5。自定义引导加载程序位于IROM 0x08000000。应用程序位于IROM 0x08020000。需要在Keil设置的boot和app两个内存地址。现在的棘手部分是Keil在指定的内存地址的开始处使用一块内存来完成一些工作。在引导加载程序应用程序中进行调试时,在重置处理程序中加载到R0的__main指针将是0x08001AD而不是预期的0x08000000。因此,boot跳转例程是:JumpAddress = 0x080201AD; // 应用程序地址偏移 + ''Keil偏移''Jump_To_Application = (pFunction) JumpAddress;NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x20000); // 应用程序地址偏移__set_MSP((__IO uint32_t) 0x08020000); // 初始化用户应用程序的堆栈指针Jump_To_Application();即使改变boot中app的地址,Keil偏移仍然是0x1AD。在BTL和app中使用相同的时钟。在app中使用了RTX,但在BTL中未启用,如果在BTL中启用RTX,则跳转失败。我的问题是为什么Keil有这个“常量”地址偏移?能否在boot中带有RTX启用的BTL跳转?如何做...

使用特权

评论回复
沙发
公羊子丹| | 2025-3-2 08:11 | 只看该作者
Keil 生成的 __main 偏移量通常与 C 运行时初始化有关,可能是 Keil 的启动代码保留了一定的前导空间,你可以检查 startup_stm32h7xx.s 里的 Reset_Handler 看看它做了什么。

使用特权

评论回复
板凳
周半梅| | 2025-3-2 08:12 | 只看该作者
0x1AD 这个偏移看起来像是 Keil 运行时库的预设值,你可以在 scatter file 或者 linker script 里手动调整 ENTRY 指令,看看能否让 __main 入口地址更符合预期。

使用特权

评论回复
地板
帛灿灿| | 2025-3-2 08:14 | 只看该作者
RTX 在 BTL 里启用后跳转失败,可能是因为 RTX 修改了系统的中断向量表或者堆栈,建议在跳转前彻底停掉 RTX 并手动恢复中断优先级。

使用特权

评论回复
5
童雨竹| | 2025-3-2 08:15 | 只看该作者
你尝试过不用 __set_MSP 直接从 VTOR 读取 SP 并设置 MSP 吗?有时候 Keil 生成的 vector table 可能与手动指定的 IROM 起始地址不同。

使用特权

评论回复
6
万图| | 2025-3-2 08:16 | 只看该作者
你在 NVIC_SetVectorTable 之前,是否先 __disable_irq() 了?有时候中断可能会在跳转时打断,导致 RTX 进入错误状态。

使用特权

评论回复
7
Wordsworth| | 2025-3-2 08:17 | 只看该作者
试着在 Keil->Options for Target->Linker 里开启 No Use Memory Init 选项,看看能否去掉 Keil 在 IROM 头部加的额外数据。

使用特权

评论回复
8
Bblythe| | 2025-3-2 08:19 | 只看该作者
你是否已经关闭 Keil RTX 的 SysTick ?有可能 RTX 仍然控制 SysTick,导致跳转后 App 运行异常,建议手动清除 SysTick 配置。

使用特权

评论回复
9
Pulitzer| | 2025-3-2 08:20 | 只看该作者
你可以在 BTL 里手动调用 SCB->VTOR = 0x08020000; 确保 VTOR 真的切换到了 App 区域,然后再检查 app 里的 Reset_Handler 入口是否正确。

使用特权

评论回复
10
Uriah| | 2025-3-2 08:21 | 只看该作者
试试在 BTL 里手动调用 osKernelDeinitialize() 彻底关闭 RTX,确保所有 RTX 线程和定时器都释放,避免 App 进入不稳定状态。

使用特权

评论回复
11
Clyde011| | 2025-3-2 08:22 | 只看该作者
RTX 可能会占用 Heap 和 Stack,如果 BTL 里的 RTX 没有正确释放,在 App 里可能会导致 malloc/free 失效,建议在 BTL 跳转前检查 HEAP 的状态。

使用特权

评论回复
12
梧桐uuu|  楼主 | 2025-3-2 20:42 | 只看该作者
感谢大神们指教

使用特权

评论回复
13
将爱藏于深海| | 2025-3-22 01:23 | 只看该作者
Keil MDK在启动时会执行一些初始化操作,这些操作通常由__main函数处理。__main函数是C运行时库的一部分,负责初始化全局变量、堆栈等。这个偏移量(0x1AD)可能是Keil在启动时执行这些初始化操作的固定地址

使用特权

评论回复
14
失物招領| | 2025-3-22 02:24 | 只看该作者
编译器生成的启动文件(如startup_stm32fxxx.s)中的一些固定操作。可能就是偏移量吧

使用特权

评论回复
15
她已醉| | 2025-3-22 03:32 | 只看该作者
当你从引导加载程序跳转到应用程序时,应用程序的入口地址通常是Reset_Handler,但Keil会在Reset_Handler之前执行一些初始化操作(如__main)。因此,跳转地址需要加上这个偏移量,以确保应用程序能够正确初始化

使用特权

评论回复
16
捧一束彼岸花| | 2025-3-22 04:23 | 只看该作者
RTX是一个实时操作系统,它会在启动时对系统进行一些额外的初始化操作(如任务调度、堆栈管理等)。如果在引导加载程序中启用了RTX,可能会导致RTX的初始化代码可能会覆盖应用程序的初始化代码

使用特权

评论回复
17
春日负喧| | 2025-3-22 05:34 | 只看该作者
RTX可能会修改一些关键寄存器或内存区域,导致应用程序无法正确启动。因此,在引导加载程序中启用RTX可能会导致跳转失败

使用特权

评论回复
18
温室雏菊| | 2025-3-22 06:33 | 只看该作者
避免在引导加载程序中使用RTX在引导加载程序中不要启用RTX,保持引导加载程序的简单性。在应用程序中启用RTX,确保应用程序能够正常运行

使用特权

评论回复
19
故意相遇| | 2025-3-22 07:26 | 只看该作者
在跳转时,手动计算应用程序的入口地址,并加上Keil的偏移量(0x1AD

使用特权

评论回复
20
西洲| | 2025-3-22 08:34 | 只看该作者
修改应用程序的启动文件(如startup_stm32fxxx.s),跳过Keil的初始化代码。这需要对启动文件有较深的理解,并且可能会影响应用程序的正常运行

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

8

帖子

0

粉丝