小编VIP*_*PER的帖子

STM32 位置无关二进制文件

我正在使用以下 CFLAGS 为 Cortex-M4 (STM32F4) 编译我的 FreeRTOS 应用程序:

-fpic -msingle-pic-base -mpic-data-is-text-relative -mpic-register=r10
Run Code Online (Sandbox Code Playgroud)

-fpic为链接器设置了标志。

矢量表已正确复制到 RAM,并更改了当前正在启动的特定固件插槽设备的偏移值。

然而,从开始时隙固件主应用程序后,在设备挂起HardFaultIMPRECISERRCFSR寄存器。执行以下行时,它发生在vPortSVCHandler 中

ldmia r0!, {r4-r11, r14}
Run Code Online (Sandbox Code Playgroud)

此操作后,链接寄存器值等于0000 0000

我还应该做些什么来为 STM32 正确创建位置无关的应用程序?重新定位全局偏移表?如果是,在内存中的哪个位置?


编辑

根据以下问题,我的目标是使用引导加载程序和 2 个固件插槽创建应用程序。我需要 FLASH 中的固件插槽,以便我的设备能够在运行时更新。为什么我需要用 PIC 标志编译固件?每个插槽在内存中都有自己的空间。默认情况下,它是为第一个插槽地址编译的。从第二个插槽运行这样的二进制文件,为第一个插槽准备,是不可能的,因为数据访问等(老实说,这是我第一次使用 GOT 和 PIC 编译)是基于程序计数器寄存器值(当前位置在程序存储空间)。固件更新使用当前未使用的下一个空闲插槽。因为我不知道当前正在使用哪个,所以我需要构建可以在所有插槽(在这种情况下为 2)上正常工作的二进制文件。这就是为什么在阅读了许多网站、主题等之后。

我从引导加载程序切换到主应用程序的流程如下:

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

在 old_timer 发布答案后编辑

因此,我尝试为两个插槽编译代码。下面是 GOT 反汇编的结果:

Disassembly of section …
Run Code Online (Sandbox Code Playgroud)

linker compilation stm32 cortex-m stm32f4

4
推荐指数
1
解决办法
2294
查看次数

未生成STM32 HAL UART RXNE中断

我正在使用HAL驱动程序和CubeMX生成的代码.在我打电话的主要例程中HAL_UART_Receive_IT().通过UART传输数据(以环回方式连接)后,我可以看到模块正在接收字节并在寄存器中设置RXNE位.但是没有产生中断?我无法解释为什么......在HAL_UART_Receive_IT()函数中有代码启用中断,所以有什么问题?

hal interrupt stm32 uart

2
推荐指数
1
解决办法
2236
查看次数

标签 统计

stm32 ×2

compilation ×1

cortex-m ×1

hal ×1

interrupt ×1

linker ×1

stm32f4 ×1

uart ×1