C语言 在 FreeRTOS 第一个任务运行期间,第二个固件插槽跳转到第一个插槽



我创建了一个应用程序,该应用程序的内存映射中有 2 个固件插槽。它工作得很好,两个插槽都根据存储在闪存中的 32 位音序器编号正确执行。

当我尝试使用 FreeRTOS 时出现问题。默认情况下,固件是为第一个插槽编译的...运行此插槽没有任何问题。但是,当设备启动保存在第二个插槽中的固件时,当RTOS在prvPortStartFirstTask中启动其第一个任务,然后跳转到vPortSVCHandler时,它会切换到第一个插槽中的任务。

我做错了什么?我认为函数地址在编译后是相对的,因此使用2个固件插槽运行此应用程序应该没有困难。


编辑

从引导加载程序切换到主应用程序期间的流程如下: 1. 检查应使用哪个固件插槽。 2. 禁用 IRQ。 2. 将矢量表复制到内存。RAM 的这一部分对于两个插槽都是相同的。在复制过程中,我正在更改每个地址的偏移量,因此它们将与特定的固件插槽兼容。默认情况下,地址没有偏移量,它会在编译后阶段删除。 3. 根据RAM中矢量表中的第一个单词设置堆栈指针。将矢量表复制到 RAM 时,该地址不会更改。 4. 设置 SCB->VTOR。 5. 执行数据同步屏障 DSB((。 6. 从复制到 RAM 的矢量表中跳转到重置处理程序。


编辑 2

当我将闪存地址范围更改为辅助插槽的应用程序编译时,它工作正常。 是否有可能编译代码,使应用程序独立于 PC,至少在这种情况下它可以工作?


编辑 3

# Generate position independent code.
-fPIC
# Access bss via the GOT.
-mno-pic-data-is-text-relative
# GOT is not PC-relative; store GOT location in a register.
-msingle-pic-base
# Store GOT location in r9.
-mpic-register=r9

但是,现在这个插槽停止工作。

我认为我的问题与那个问题相似。

一般来说,固件不是独立于位置构建的,所以我不相信所有的"函数地址在编译后都是相对的"。您可以为特定的开始位置(第一个或第二个固件插槽(编译固件。

至于您的主要问题,您是否做了任何操作将中断处理程序/中断向量从一个固件插槽切换到另一个固件插槽?或者,当您调用 SVC 处理程序时,是否跳转到第一个固件的中断处理程序?

如何更改中断向量因体系结构而异。对于 stm32f429,您可以在此处查看

相关内容

最新更新