This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS570LC4357:带有 halcogen GCC 工具的 FreeRTOS 代码被卡在 vPortEnterCritical () 上

Guru**** 2809405 points

Other Parts Discussed in Thread: HALCOGEN, TMS570LC4357

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1606838/tms570lc4357-freertos-code-with-gcc-tools-from-halcogen-getting-stuck-at-vportentercritical

器件型号: TMS570LC4357
主题中讨论的其他器件: HALCOGEN

尊敬的团队:

我们已经从 halcogen 生成了 FreeRTOS 工程(gcc 工具)。 我们正在使用 gcc 7.5 编译器。 我们能够在 Halcogen 生成的裸机代码上使用此编译器并测试几个驱动程序。  

使用 FreeRTOS 端口时、代码卡在 portmacro.h 中定义的 vportentercritical () 函数处

是否有人看到此问题? 可能的解决方案是什么?

此致、

Kamlesh  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Kamlesh:

    我们有一个内部 AI 工具、可以分析此控制器的所有旧的相关线程及其文档。 我从中得到了一些建议、您能检查一下吗?

    TMS570LC4357 FreeRTOS (GCC 卡在 vPortEnterCritical ())

    根据已有信息以及包含 GCC 的 TMS570 器件上 FreeRTOS 的常见问题、以下是最可能的原因和解决方案:

    最常见的根本原因:

    1.中断配置问题

    TMS570LC4357 使用矢量中断管理器 (VIM)、该管理器需要正确初始化、然后 FreeRTOS 才能正确管理中断 (0)。 该vPortEnterCritical()函数处理 ARM Cortex-R4 CPSR 寄存器以禁用中断、如果未正确配置 VIM 或中断系统、则可能会导致系统挂起。

    解决方案:

    • 调用前确保 VIM 已正确初始化 vTaskStartScheduler()
    • 验证中断矢量表是否在 VIM RAM(地址 0xFFF82000)(0) 中正确初始化
    • 在启动调度器 (3) 之前、确保在 CPSR 寄存器中正确启用 FIQ 和 IRQ

    2. GCC 编译器优化问题

    GCC 7.5 可以以不同于 TI 编译器的方式优化关键的内联汇编代码、可能会中断中的中断启用/禁用机制portmacro.h

    解决方案:

    • 尝试volatile在关键部分周围添加关键字或编译器屏障
    • 降低优化级别(尝试或测试) -O1-O0
    • 检查是否针对 GCC 语法正确实现了用于中断禁用/启用的内联汇编
    • 验证__asm指令是否与 GCC 兼容(GCC 使用与 TI 编译器不同的语法)

    3、堆栈配置问题

    FreeRTOS 需要为每个任务和系统堆栈正确配置堆栈。

    解决方案:

    • 验证 HALCoGen 配置中的栈大小是否足够
    • 确保链接器脚本为 FreeRTOS 堆分配足够的内存
    • 检查configTOTAL_HEAP_SIZE中是否FreeRTOSConfig.h合适

    4、系统初始化顺序

    初始化的顺序对于 HALCoGen 生成的代码非常重要。

    建议的初始化序列:

    1. _coreInitRegisters_() / _coreInitStackPointer_()
    2. System initialization (clocks, flash, etc.)
    3. VIM initialization
    4. Enable IRQ/FIQ in CPSR
    5. Create FreeRTOS tasks
    6. vTaskStartScheduler()

    5. MPU/缓存配置

    如果启用了 MPU 或高速缓存、错误的配置可能会导致 FreeRTOS 操作出现问题。

    解决方案:

    • 首先尝试禁用 MPU 以找出问题所在
    • 如果使用高速缓存、请确保配置了直写模式 (8)
    • 验证是否为代码和数据正确配置了存储器区域

    调试步骤:

    1. 添加断点 vPortEnterCritical()以准确地查看它挂起的位置
    2. 检查 CPSR 寄存器 -验证中断位是否处于预期状态
    3. 验证 VIM 寄存器 -检查 IRQINDEX、FIQINDEX 和中断使能寄存器
    4. 使用最小配置进行测试 -使用最少的代码创建单个任务
    5. 与 TI 编译器比较 -如果可能,使用 TI ARM 编译器进行测试,以隔离 GCC 特有的问题

    可尝试的代码修改:

    在中portmacro.h、确保关键部分宏与 GCC 兼容:

    #define portDISABLE_INTERRUPTS() \
        __asm volatile ("CPSID if" ::: "memory")
    
    #define portENABLE_INTERRUPTS() \
        __asm volatile ("CPSIE if" ::: "memory")

    HALCoGen 配置检查清单:

    • ✓在 HALCoGen 中启用了 FreeRTOS
    • 选择✓正确的 GCC 工具链
    • ✓VIM 配置正确
    • ✓分配了足够的堆/栈内存
    • ✓系统时钟配置正确

    --
    此致、
    Jagadish。