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.

[参考译文] RTOS/TM4C129DNCPDT:具有编译器优化功能的 TI-RTOS

Guru**** 2470720 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/673129/rtos-tm4c129dncpdt-ti-rtos-with-compiler-optimizations

器件型号:TM4C129DNCPDT
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

您好!

我正在使用 TI-RTOS 开发 TM4C129。 我们的项目涉及通信、由于处理量的增加、通信目前运行缓慢。 我想使用优化来加快速度、但优化会导致 Semaphore_pend 调用挂起、即使正在进行相关的 Semaphore_post 调用。

在我们项目的属性下,在 Build->ARM Compiler->Optimization 下,我设置了--opt_for_speed=5,这一点没有任何问题。 当我设置--OFF 时,一切都运行正常,但通信速度很慢。 当我设置-opt_level=1时、所有操作都运行得更快、但最终、尽管针对同一个信号量进行了 Semaphore_pend 调用、但 Semaphore_pend 调用永远不会返回。

我已经将所有信标、事件和邮箱设置为易失性、尽管它们是使用 app.cfg 文件进行静态设置的(因此我将调用 extern volatil...) 我是否需要执行任何其他技巧才能使优化正常运行? 我目前正在将 CCS 7.4.0.00015与编译器 TI v16.9.7.LTS 搭配使用。

感谢您的帮助!

-Tom

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

    您能否查看 Tools->RTOS 对象视图(名称可能因您拥有的 CCS 版本而异)。 打开信号量视图以查看信号量的状态。 您可能还需要快速检查堆栈使用情况(例如,“任务”->“详细”和“Hwi->模块”)。

    系统是否仍在以其他方式运行?

    我希望不同的编译器优化设置会在代码中显示竞态条件。

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

    感谢您的回答。 信标内部的任务具有相当高的优先级。 有趣的是、它没有说它在信标上被阻止。 它被列为"就绪"、不会被任何东西阻止。 其调用栈如下所示:
    0 task.c:75上的 ti_sysbios_knL_Task_schedule__i ()
    1 task.c:323处的 ti_SysBIOS_KNL_Task_restore__E (unsigned int)
    2 ti_SysBIOS_KNL_Semaphore_pend__E (struct ti_SysBIOS_KNL_Semaphore_Object *、unsigned int) at semaphore.c:191
    3 taskFxnTest (unsigned int、unsigned int) at Test.c:216 ***[这是我的代码!]
    4 task.c:414、PC = 0x000268F0 FP = 0x2001A0B0处的 ti_SYSBIOS_KNL_Task_exit__E ()

    尽管如此、当我在代码中的 Semaphore_pend 调用之后设置一个断点时、它永远不会到达那里。 此外、令人感兴趣的是、低优先级任务正在运行、即使相关任务仍被列为"就绪"、并且没有阻止它的任何内容。

    系统将继续运行。 至少还有一个被布置和挂起的信标、看起来仍然正常运行。 这是唯一挂起相关信标的位置、因此我认为没有发生竞争情况、至少不是针对信标。

    -Tom
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否曾禁用任务处理(例如 Task_disable)? 是否可以附加一个“任务->详细”的屏幕截图?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Todd、

    这是详细的任务列表。 相关任务是 taskSample (从顶部开始第二个)。 您将注意到、虽然 taskSample 已准备好运行、但仍有一个优先级较低的任务正在运行。 我不会在任何地方调用 Task_disable。  

    -Tom

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

    谢谢...奇怪 是否可以确认调度程序未锁定? 在 Task->Module 中、调度程序状态应该被解锁(Swi 的 ditto)。 您是否还可以确认当前 ThreadType 是 ROV->BIOS->Module 中的任务? ROV->BIOS->Scan for errors 是否会显示任何错误或警告?

    您在任务 FxnSample 中使用事件还是仅使用信标?

    您正在使用哪个版本的 TI-RTOS (或者更具体地说是 SYS/BIOS)?

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

    您好 Todd、

    很抱歉让雷达跌落了几天。 当我强制程序在我的代码中停止时、schedulerState 被列为 unlocked。 当前 ThreadType 设置为任务、"CAN for errors"选项卡未报告任何错误。

    我一直在使用事件和信标之间来回切换。 最初、当我发布时、我使用了一个信标。 然后、我尝试了一个事件、事情已经运行了一段时间。 但是、我发现(与此问题无关)我的任务堆栈太小、并且增加了其大小。 在执行该操作后、事件开始产生与信标相同的问题、并卡在相同的位置。 我的所有堆栈都是1024字节对齐的、也是1024的倍数。

    在我的项目的属性中、SYS/BIOS 为6.50.1.12版。 用于 TivaC 的 TI-RTOS 版本为2.16.0.08。

    -Tom

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    没问题。 我已经把这一点交给了一位同事、他会跟进。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Tom、

    您是否在任务 Comm1中使用了 TI 的任何驱动程序(例如 UART、I2C、SPI...等)?

    您能否提供有关此任务的模糊描述?

    这是异常行为、我希望帮助您解决此问题。

    谢谢、
    Derrick

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

    是的、任务 Comm1任务使用其中一个 UART 通道。 该任务会检查缓冲区中是否存在传入字节(字节由相应 UART 的中断放置在该处)。 如果存在任何字节、它将开始构建一个数据包、然后对其进行分析以读取来自我们后端软件的命令。

    固件实际上不使用 UART 的 RTOS 实现。 我不知道这是问题还是与优化无关。 到目前为止、它仅使用外设驱动程序库。

    感谢您的帮助、Derrick。 谢谢 Todd 至今为我提供的帮助。

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

    Thomas、

    您能描述一下您的 UART 中断实现吗?

    当在 RTOS 中使用中断时、RTOS 需要"注意"这些中断。

    为了纠正这种情况、您需要使用 Hwi 模块 来实现 UART 中断。

    Derrick

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

    我将实施此操作并返回给您。 您是否认为通过不将 RTOS 与这些中断集成、这会导致信号量挂起?

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

    下面 是有关 TI-RTOS 中中断处理的讨论:processors.wiki.ti.com/.../BIOS_for_Stellaris_Devices

    您可以拥有内核未管理的中断(我们将它们称为零延迟、因为 RTOS 不会增加延迟)。 注意:在非托管(零延迟)中断中、您不能进行任何可能影响调度程序(例如 Semaphore_post)的调用。

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

    我设法找到了一个临时的权变措施、方法是将一些代码移动到单独的项目中、对其进行优化、然后将其编译到静态库中。 然后、我将该库链接回原始项目。 我要优化的代码部分已经过优化、固件以我希望的速度运行。

    不过,我仍想继续这样做。 我一直忙于其他项目、如果手头有解决方案、我可能无法实施这些更改、以查看它是否纠正了我以前遇到的行为。 非常感谢您迄今提供的支持。

    -Tom