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/TM4C1294NCPDT:Semaphore_pend ()在被布置后保持被阻断

Guru**** 2468460 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/672622/rtos-tm4c1294ncpdt-semaphore_pend-remains-blocked-after-posted

器件型号:TM4C1294NCPDT

工具/软件:TI-RTOS

我正在使用 Launchpad TM4C1294板在 TI-RTOS 和 NDK 的帮助下开发 Modbus/TCP 通信。  该应用程序在开始时运行良好。  该板与我的 PC 主机接口通信良好、并且正在与我的 LabVIEW 接口交换适当的 Modbus 格式的消息。  信号量正在被发布、并且挂起工作正常。  我的代码使用  用户创建的 ModbusServer()函数内的 NDK recv()函数。  recv()设置为非阻塞。  

不幸的是,在大约30秒的数据传输之后,Semaphore_pend()似乎不再响应。   我知道 Semaphore_post ()仍在工作,因为我可以看到计数为1,  并且调试器仍然响应 Semaphore_post ()包含函数中的断点。

我的调试功能随着我对 RTOS 的陌生而不断发展。  我没有注意到 ROV 中任务的任何异常堆栈问题。  我的执行图按预期工作、直到 Lost semaphore_pend()的点、此时我无法绘制任何新事件。  我正在使用板上的 LED 来帮助我确定 Semaphore_pend()正在阻断。  当我在 Semaphore_pend()失败后停止代码时,我经常在文件"clock.c"中的 Clock_workFuncDynamic ()中找到代码,但在处理成功调用 MainLoopTrigger 并显示为布置信标时除外。  

非常感谢您在调试此问题时提供的帮助。  我 已经处理这个问题几天了、并且已经达到了我当前调试能力的极限。  我希望通过在这个论坛上进行接触、我可以扩展我的知识并调试这个问题。  本帖子末尾提供了我的软件版本和屏幕截图供您参考。  感谢您花时间查看此请求。

此致、

Ryan

编译器版本 TI v16.12.0.STS

NDK 2.25.0.09

CCS 7.0.0.00042

用于 TivaC 2.16.01.14的 TI-RTOS

相关帖子#1: https://e2e.ti.com/support/embedded/tirtos/f/355/t/275695 

相关文章#2: https://e2e.ti.com/support/embedded/tirtos/f/355/t/248310 

事件设置:

 

代码:

当 Semaphore_pend ()看起来不再响应时、程序似乎保持在 文件"clock.c"中的 Clock_workFuncDynamic ()内、除非正在处理成功调用 MainLoopTrigger 的 clock0。



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

    我继续了解有关此问题的更多信息。  在我通过论坛进行的搜索中、我找到了一篇有关 调试队列和信标的文章 、这有助于我专注于计时器控制器。  我将节拍模式从"不必要的计时器节拍将被抑制"更改为"计时器将在每个周期中断"。  我还将节拍周期更新为1、000us、并将时钟0周期更改为25、以保持我所需的25ms 信标服务。  这极大地提高了我的性能。  由于我不熟悉 RTOS、我不确定将来是否会让自己头疼、这进一步降低了风险。  这种扩展是否会很好?  有人可以提供建议吗?  是否最好将 clock0周期设为1、将 tick 周期设为25、000us?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ryan、
    您最初在将节拍周期更改为1ms 之前的节拍周期是多少。 我想您之前必须有很短的节拍周期、对吧? 在您的 clock0函数中、间隔周期设置为1。 这意味着无论您的节拍周期是多少、时钟0都会以相同的速率触发。 如果时间太短、则任务可能无法在下一个勾号出现前完成。 我可以想象这是您的原始问题。 在您的最新节拍设置为1ms 时、我认为如果您将时钟函数设置为25ms、这是合理的。 我认为这比1us 的节拍和25000us 的时钟函数间隔要好。 使用1us 时钟、您将在处理时钟函数之前生成25000个中断。 这确实占用了系统资源。 我不是 RTOS 专家。 希望我们的 RTOS 专家能提供更多意见。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    NDK 堆栈假定一个1ms 的 Clock.tickPeriod、所以我不会为此而混乱。 有一种方法可以重新配置 NDK 堆栈以使用不同的 Clock.tickPeriod、但我被告知这并不容易。

    因此、我建议您坚持使用1ms Clock.tickPeriod、并将时钟对象周期配置为25ms。

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

    感谢 Alan 和 Charles 的帮助和推荐!  以下是我现在在 cfg 文件中的内容:

    clock.tickPeriod = 1000;
    var clock2Params = new Clock.Params ();
    clock2Params.instance.name ="clock0";
    clock2Params.startFlag = true;
    clock2Params.period = 25;
    clock2Params.arg = null;
    program.global.clock0 = Clock.create ("&MainLoopTrigger"、1、clock2Params); 

    之前我 的 Clock.tickPeriod 设置为25、000、我的 clock2Params.period 设置为1。  原始 Clock.tickPeriod 设置是我遇到问题的原因、应按照建议设置为1000 。  这似乎现在运作良好。  非常感谢您抽出宝贵时间和专业知识来帮助我解决此问题。  谢谢!

    请注意、

    Ryan