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.

[参考译文] TMS570LS3137:带有 HALCOGEN/FreeRTOS 的虚假数据中止中断

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1463440/tms570ls3137-spurious-data-abort-interrupt-with-halcogen-freertos

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

工具与软件:

您好!

我必须完成一个基于 TMS5730LS3137 + HALCOGEN + FreeRTOS 的软件。 该软件是由离开公司的其他人开发的。

我对这个 CPU 没有任何经验,所以我需要很多星期来了解它是如何工作的!

我最终找到了应用程序虚假崩溃的根本原因、这是一个地址0xFFFFFFB0上的 DABT。

经过进一步的研究,我发现这个错误是在 FreeRTOS xTaskResumeAll ()函数中提出的。 有时、当调用 taskYIELD_if_using_preemption ()时、CPU 仍处于用户模式!

我更改了例行程序以检查电流模式、并在需要时升高至系统模式。

现在、该软件可以正常工作、没有出现任何故障。

我无法理解的是、为什么 CPU 目前有时处于用户模式。

这是已知问题吗?

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

    我在这个问题上花了更多的时间。

    我发现异常是在 pvPortMalloc ()调用期间触发的(参见下面的屏幕截图):

    这是一个野生的黑客,所以我把它改为一个不那么"危险"的东西。

    我将 portYIELD_within_api()的定义更改为:

    #define portYIELD_WITHIN_API()		{\
        BaseType_t x = (_get_CPSR() & 0x1F); \
        if (x == 0x10) prvRaisePrivilege(); \
        portSYS_SSIR1_REG = portSYS_SSIR1_SSKEY; \
        asm( " DSB " ); asm( " ISB " ); \
        if (x == 0x10) asm( " CPS #0x10"); \
        }

    现在、我的应用程序按预期工作、但我不知道这是一个好主意、或者我的软件中是否存在其他问题

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

    在 FreeRTOS 论坛上进行了一些交流之后、似乎 HALCOGEN 生成的代码缺少 MPU_pvPortMalloc ()和 MPU_vPortFree ()!

    添加这些例程以更简洁的方式解决了我的问题(cf https://forums.freertos.org/t/cortexr4-spurious-data-abort-interrupt/22301/16)。

    要完成我的答复,我不得不稍微改变一点的实现`prvRaisePrivilege ()`。 因为 TI 完成的实施始终会强制切换到系统模式!
    我添加了一条简单的检查、只在 CPU 处于用户模式时切换到系统模式(如`Mpu_vPortFree ()`/`Mpu_pvPortMalloc ()`可被调用用于 IRQ 模式)

    也许应该更新 HALCOGEN!