vggy 2025-11-20 09:36 采纳率: 0%
浏览 6

在用stm32cubemx移植freerots过程中报错

错误提示为
but MDK-ARM V5.32project generation have a problem.
在生成过程中出现错误。
编辑keil5时报错,错误提示
task1\task1.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.
请问,问题出在哪里,怎么解决

  • 写回答

5条回答 默认 最新

  • 檀越@新空间 2025-11-20 09:47
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    你遇到的错误信息是:

    task1\task1.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.
    

    这个错误通常发生在 Keil MDK-ARM 的链接器(armlink)在解析 .sct 链接脚本时,找不到指定的段(section),尤其是在使用了 FIRSTLAST 选项时。这在使用 FreeRTOS 移植到 STM32CubeMX 项目中时比较常见。


    🔍 问题分析

    1. 原因一:链接脚本(.sct 文件)配置错误

    你可能在 .sct 文件中使用了类似以下语句:

    LR_IROM1 0x08000000 0x00080000
    {
        ER_IROM1 0x08000000
        {
            *.o (RESET, +First)
            * (InRoot$$Sections)
            .ANY (+RO)
        }
    }
    

    如果你在 .sct 中指定了某个未被编译器生成的段(如 RESETInRoot$$Sections 等),而该段没有实际内容,就会报错。


    2. 原因二:FreeRTOS 移植不正确

    在 STM32CubeMX 中生成代码后,如果手动移植 FreeRTOS,可能会导致链接脚本中某些段(如 heap_4tasks)未被正确包含,导致链接失败。


    3. 原因三:使用了不兼容的 FreeRTOS 版本

    有些 FreeRTOS 的版本或配置文件(如 heap_4.c)与 Keil MDK-ARM 不兼容,特别是当使用了自定义内存分配方式时。


    ✅ 解决方案

    1. 检查并修改 .sct 文件

    修改前示例(错误):

    LR_IROM1 0x08000000 0x00080000
    {
        ER_IROM1 0x08000000
        {
            *.o (RESET, +First)
            * (InRoot$$Sections)
            .ANY (+RO)
        }
    }
    

    修改后(推荐):

    LR_IROM1 0x08000000 0x00080000
    {
        ER_IROM1 0x08000000
        {
            *.o (RESET, +First)
            * (InRoot$$Sections)
            .ANY (+RO)
        }
    }
    

    注意: 如果你使用的是 FreeRTOS 的 heap_4.c,确保它被正确添加到工程中,并且链接脚本中包含了 heap_4.o 的引用。


    2. 确保 FreeRTOS 源码和头文件已正确添加

    • 在 Keil 5 中打开你的项目。
    • 右键点击 "Target 1""Options for Target...""C/C++" → 添加 FreeRTOS 的源文件路径(如 FreeRTOS/SourceFreeRTOS/Portables/GCC/ARM_CM3)。
    • 确保 FreeRTOSConfig.h 被正确包含,并且配置无误。

    3. 检查是否启用了 USE_STDPERIPH_DRIVERHAL

    如果你在 STM32CubeMX 中选择了 HAL 库,但 FreeRTOS 的移植是基于标准外设库(StdPeriph),则会出现冲突。

    建议: 使用 HAL 库 + FreeRTOS 的组合更稳定。


    4. 确保 .sct 文件中包含所有必要的段

    .sct 文件中加入如下内容(适用于 FreeRTOS):

    LR_IROM1 0x08000000 0x00080000
    {
        ER_IROM1 0x08000000
        {
            *.o (RESET, +First)
            * (InRoot$$Sections)
            .ANY (+RO)
            * (NOLOAD) ; 这个用于防止未使用的段报错
        }
    
        RW_IRAM1 0x20000000 0x00020000
        {
            .ANY (+RW +ZI)
        }
    }
    

    5. 重新生成代码并检查

    • 使用 STM32CubeMX 重新生成代码。
    • Project Manager 中选择 "MDK-ARM v5"
    • 确保 FreeRTOS 的相关文件(如 tasks.c, queue.c, list.c)被正确导入。

    🛠️ 示例代码(修改后的 .sct 文件)

    LR_IROM1 0x08000000 0x00080000
    {
        ER_IROM1 0x08000000
        {
            *.o (RESET, +First)
            * (InRoot$$Sections)
            .ANY (+RO)
            * (NOLOAD)
        }
    
        RW_IRAM1 0x20000000 0x00020000
        {
            .ANY (+RW +ZI)
        }
    }
    

    🧩 总结

    | 问题 | 解决方法 | |------|----------| | .sct 文件中缺少必要段 | 修改 .sct 文件,加入 * (NOLOAD) 防止报错 | | FreeRTOS 移植不完整 | 确保 tasks.c, heap_4.c 等文件被正确添加 | | 使用了不兼容的 FreeRTOS 版本 | 使用官方推荐的 FreeRTOS 版本 | | HAL 库与 StdPeriph 冲突 | 使用 HAL + FreeRTOS 的组合更稳定 |


    如果你能提供具体的 .sct 文件内容,我可以进一步帮你定位具体错误位置。欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 11月20日