c - 在 FreeRTOS 第一次任务运行期间,第二个固件插槽跳转到第一个插槽
问题描述
我创建了一个应用程序,它的内存映射中有 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
但是,现在这个插槽停止工作了。
我认为我的问题与那个类似。
解决方案
推荐阅读
- python - 如何在 django 管理面板的“添加用户”部分添加更多字段?
- apache-spark - Apache spark 中的列参考
- node.js - 如何在异步函数 discord.js 中使用 message.react() 中的循环
- ansible - Ansible:在上一个主机上启动服务完成后,在下一个主机上启动服务
- reactjs - React - 功能和组件之间的区别
- list - 如何找出列表类型所属的类?
- android - 如何在 RecyclerView 适配器中使用 getLifecycle().addObserver()
- android - 跳过了 844 帧!带有 Spinner 的简单 AlertDialog 导致 MainThread 中的工作过多
- javascript - Wrapper 函数破坏了 socket.io 函数
- firebase-realtime-database - 如何将 Firebase RTDB snapshot.value 传输到 Dart/Flutter 类实例