【问题标题】:Second firmware slot jumps to first slot during FreeRTOS first task run在 FreeRTOS 第一次任务运行期间,第二个固件插槽跳转到第一个插槽
【发布时间】:2018-11-06 07:55:35
【问题描述】:

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

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

我做错了什么?我认为编译后函数地址是相对的,所以使用 2 个固件插槽运行这个应用程序应该没有问题。


编辑

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


编辑 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

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

我认为我的问题类似于one

【问题讨论】:

    标签: c assembly embedded freertos


    【解决方案1】:

    通常,固件不是构建position independent,所以我不相信所有“函数地址在编译后都是相对的”。您为特定的起始位置(第一个或第二个固件插槽)编译固件。

    至于您的主要问题,您是否已将中断处理程序/中断向量从一个固件插槽切换到另一个?还是在调用 SVC 处理程序时跳转到第一个固件的中断处理程序?

    如何更改中断向量因架构而异。对于 stm32f429,你或许可以看一下here

    【讨论】:

    • 针对特定固件插槽更新向量表。从 prvPortStartFirstTask 中调用的 vPortSVCHandler 函数返回时失败
    • 是否可以编译代码使应用程序独立于 PC,至少在这种情况下可以工作?
    • @VIPPER 多注意向量表;至少有两个问题,第一个是硬件将使用的向量表的地址,第二个是向量表的内容是绝对地址。
    猜你喜欢
    • 2020-11-23
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多