我正在使用以下 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,并更改了当前正在启动的特定固件插槽设备的偏移值。
然而,从开始时隙固件主应用程序后,在设备挂起HardFault与IMPRECISERR集CFSR寄存器。执行以下行时,它发生在vPortSVCHandler 中:
ldmia r0!, {r4-r11, r14}
Run Code Online (Sandbox Code Playgroud)
此操作后,链接寄存器值等于0000 0000。
我还应该做些什么来为 STM32 正确创建位置无关的应用程序?重新定位全局偏移表?如果是,在内存中的哪个位置?
编辑
根据以下问题,我的目标是使用引导加载程序和 2 个固件插槽创建应用程序。我需要 FLASH 中的固件插槽,以便我的设备能够在运行时更新。为什么我需要用 PIC 标志编译固件?每个插槽在内存中都有自己的空间。默认情况下,它是为第一个插槽地址编译的。从第二个插槽运行这样的二进制文件,为第一个插槽准备,是不可能的,因为数据访问等(老实说,这是我第一次使用 GOT 和 PIC 编译)是基于程序计数器寄存器值(当前位置在程序存储空间)。固件更新使用当前未使用的下一个空闲插槽。因为我不知道当前正在使用哪个,所以我需要构建可以在所有插槽(在这种情况下为 2)上正常工作的二进制文件。这就是为什么在阅读了许多网站、主题等之后。
我从引导加载程序切换到主应用程序的流程如下:
在 old_timer 发布答案后编辑
因此,我尝试为两个插槽编译代码。下面是 GOT 反汇编的结果:
Disassembly of section …Run Code Online (Sandbox Code Playgroud) 我正在使用HAL驱动程序和CubeMX生成的代码.在我打电话的主要例程中HAL_UART_Receive_IT().通过UART传输数据(以环回方式连接)后,我可以看到模块正在接收字节并在寄存器中设置RXNE位.但是没有产生中断?我无法解释为什么......在HAL_UART_Receive_IT()函数中有代码启用中断,所以有什么问题?