You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32L053R8T6:libgcc函数__gnu_thumb1_case_sqi无法移至RAM的问题

问题原因与解决方案

核心问题

你的链接脚本配置未生效有两个关键原因:

  1. 排除对象错误:你要移动的目标函数是__gnu_thumb1_case_sqi,它属于_thumb1_case_sqi.o文件,但你仅在链接脚本中排除了_thumb1_case_uqi.o,完全未处理_thumb1_case_sqi.o,导致该函数仍被默认放入Flash的.text段。
  2. 仅排除无意义,需主动指定RAM存放:即使正确排除目标文件,链接器仍会将未匹配到特定段的代码默认归入.text段。你必须显式定义RAM中的代码段,并将目标函数的代码分配到该段。

修正后的链接脚本配置

1. 添加RAM代码段定义

在SECTIONS块中,.text段之前或之后添加一个专门用于RAM代码的段(例如.text_ram),指定其存放在RAM中:

/* 存放需要运行在RAM中的代码 */
.text_ram :
{
    . = ALIGN(4);
    /* 明确指定libgcc中的目标文件 */
    *libgcc.a:_thumb1_case_sqi.o(.text)
    *libgcc.a:_thumb1_case_uqi.o(.text) /* 如果也需要移动该函数,可保留此行 */
    . = ALIGN(4);
} >RAM AT>FLASH
  • >RAM:指定段的运行地址在RAM
  • AT>FLASH:指定段的加载地址在Flash(启动时需通过代码将该段从Flash复制到RAM,STM32标准启动文件通常支持自定义段复制,若不需要可省略此部分)

2. 修正.text段的排除规则

在原.text段中,同时排除_thumb1_case_sqi.o和_thumb1_case_uqi.o:

.text :
{
    . = ALIGN(4);

    /* 排除两个目标文件的.text和.text*段 */
    *(EXCLUDE_FILE(libgcc.a:_thumb1_case_sqi.o libgcc.a:_thumb1_case_uqi.o) .text)
    *(EXCLUDE_FILE(libgcc.a:_thumb1_case_sqi.o libgcc.a:_thumb1_case_uqi.o) .text*)

    *(.glue_7)         /* glue arm to thumb code */
    *(.glue_7t)        /* glue thumb to arm code */
    *(.eh_frame)
    /* 其他原有内容 */
} >FLASH

额外说明

  • 由于__gnu_thumb1_case_sqi是libgcc库中的函数,无法直接修改其源码添加__attribute__((section))属性,因此只能通过链接脚本强制分配段。
  • 若使用AT>FLASH,需确保启动代码中包含将.text_ram段从Flash复制到RAM的逻辑。STM32L0的标准启动文件可通过修改__etext、__data_start__等符号扩展支持自定义段复制,或手动添加复制代码。

内容的提问来源于stack exchange,提问作者Alex C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:15:09