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:优化时 FreeRTOS 代码发生故障

Guru**** 2446330 points
Other Parts Discussed in Thread: TMS570LC4357, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1242888/tms570lc4357-freertos-code-failing-when-optimized

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

我正在使用 Halcogen 为 TMS570LC4357 MCU 生成的 FreeRTOS 代码。 此外使用 TI 的 ARM 编译器。

我设置以下示例任务、该任务每1ms 运行一次并切换 GPIO。 没有其他任务正在运行:

查看逻辑分析仪的结果如下:

这个结果符合预期、正如您看到的、GPIO 的频率为1000Hz

现在、如果我设置 opt_level = 2、则会看到以下结果:

通常 GPIO 切换行为符合预期、但有时会在延迟发生之前发生第一次 GPIO 切换。 在任务能够阻止前、好像某些代码正在任务中执行。

现在、如果我关闭 vTaskDelayUntil 的优化(但所有其他代码的 opt_level = 2)、如下所示:

我们又回到了预期的结果:

我想知道、Halcogen 生成的代码存在问题吗? 从我在线读到的内容可以看出、FreeRTOS 能够使用 ARM 编译器运行优化。 其他人是否看到过此问题?

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

    尊敬的 Mark:

    我能否让您的整个项目在结束时调试该问题?

    您甚至可以通过压缩您的项目来向我发送一条私人消息。

    --

    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    我使用 Halcogen 生成的代码在 Code Composer Studio 中创建了一个新项目。 我已经连接了该项目。

    e2e.ti.com/.../FreeRTOS_5F00_Opt_5F00_test.zip

    代码如下、与我的上一个示例非常相似。

    当我在运行时没有进行优化时、我可以看到以下内容。 这是预期行为。 GIOA6设置当我们启动任务时、GIOA7切换任务的整个运行时间、最后、一旦任务完成运行、GIOA6将清除。 然后任务会延迟。

    现在、当我打开 opt_level=2时、可以看到以下结果。 好像在任务应该被阻断前 GIOA6设置一样。 任务实际上会在以后执行。

    放大后可以看到 GIOA6只在很短的时间内清除:

    现在、如果我关闭 vTaskDelayUntil 的优化(就像我在前一个示例中所做的那样)、我将再次看到预期的结果:

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

    尊敬的 Mark:

    我保持了您提到的优化级别2。

    但不知道为什么我无法看到您提到的问题。 这是输出。

    您使用的编译器版本是什么?

    --

    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    真有意思。 我使用的是 TI v18.12.2.LTS。

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

    尊敬的 Mark:

    这很有趣。 我使用的是 TI v18.12.2.LTS。

    我甚至使用"TI v18.12.2.STS"进行了测试、但仍然无法重现您提到的问题。 您是否在使用最新版本的 CCS?

    --

    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    我不使用最新版本。 我正在使用:

    Code Composer Studio
     版本:9.1.0.00010

    操作系统: Windows 10, v.10.0., x86_64 / Win32
    Java 版本:1.8.0_144

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

    尊敬的 Mark:

    我无法看到您提到的问题、即使是借助  

    Code Composer Studio
     版本:9.1.0.00010

    编译器
    TI v18.12.2.LTS。

    不知道为什么、您能否检查 您附加到我的代码是否正确?

    您能否在此主题中下载随附的代码并使用它进行测试?

    --

    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    我才意识到这个问题。 在文件/source/os_tasks.c 中、我添加了#pragma 以关闭 vTaskDelayUntil 的所有优化、并且我忘记在上传项目之前将其删除。

    请删除此#pragma 并执行全新构建、您应该会看到问题。

    谢谢。

    标记

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

    尊敬的 Mark:

    感谢您指出、  

    对不起、我也错过了#pragma。 现在、我将删除该 pragma、并在最后进行测试。 我将尽快提供更新。

    --

    谢谢。此致、
    Jagadish。

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

    尊敬的 Mark:

    还没有找到根本原因,但如果我使用"gioToggleBit"而不是"gioSetBit"为 GIOA6 ,那么一切似乎都再次起作用。

    这个问题是由于"gioSetBit"函数还是"vTaskDelayUtil"引起的、这也让我感到困惑。

    --

    谢谢。此致、
    Jagadish。