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:始终检查 Mailbox_pend 的返回值?

Guru**** 2460850 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/650486/rtos-tm4c1294ncpdt-always-checking-return-value-of-mailbox_pend

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

工具/软件:TI-RTOS


CCS 6.1.3
tirtos_tivac_2_16_01_14 (BIOS_6_45_02_31)
xdctools_3_32_00_06_core
TI-CGT-ARM_15.12.1.LTS

SPRUEX3P (SYS/BIOS (TI-RTOS 内核) v6.45使用指南)第117页显示了一个将事件与邮箱一起使用的示例:

readerTask()
{
while (true){/*等待 ISR 或邮箱消息*/
事件= Event_pend (myEvent、
EVENT_ID_NONE、/*且掩码= 0 */
EVENT_ID_00 + Event_ID_01、/* orMask */
BIOS_wait_forever);/*超时*/

if (Events & Event_ID_00){
/*获取发布的消息。
* Mailbox_pend ()不会阻止、因为 Event_pend ()
*已保证消息可用。
*请注意特殊的 BIOS_NO_WAIT
*参数告诉邮箱 Event_pend()
*用于获取可用消息。
*
Mailbox_pend (mbox、&msgB、BIOS_no_wait);

processMsg (&msgB);
}
if (Events & Event_ID_01){
processISR();
}
}


但在调试期间、我相信有时会看到 Mailbox_pend (mbox、&msgB、BIOS_no_wait)的返回值为 false、然后 msgB 无效。 我读取了"packages/ti\SysBIOS\KNL\Mailbox.c"中的源代码、我不知道为什么在设置了 Event_ID_00并且超时为 BIOS_NO_WAIT 时它返回 false。

那么、您能帮您说明一下吗? 在这种情况下、我还应该检查返回值吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否有其他设置 Event_ID_00 (邮箱之外)的设置?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    否  

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

    您好、Todd、

     我想我可以通过修改示例代码"EVENT_EK_TM4C1294XL_TI_TivaTM4C1294NCPDT"来重现此问题。 请查看相关信息。 "EVENT_EK_TM4C1294XL_TI_TivaTM4C1294NCPDT_0"是原始代码、"EVENT_EK_TM4C1294XL_TI_TivaTM4C1294NCPDT_1"是修改后的代码。

     当我运行代码时、CIO 将输出  

    e2e.ti.com/.../event_5F00_EK_5F00_TM4C1294XL_5F00_TI_5F00_TivaTM4C1294NCPDT_5F00_0.rare2e.ti.com/.../event_5F00_EK_5F00_TM4C1294XL_5F00_TI_5F00_TivaTM4C1294NCPDT_5F00_1.rar

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

    感谢您的示例。 我重复了这个问题。 没有什么明显的东西会跳出来。 我仍在调试它。 我很快会向您提供最新信息。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    找到了。 有一个小的比赛窗口。 我正在测试内核的修复程序和应用程序的潜在解决方案。 我将在星期二发布。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jianyi、

    调用 Mailbox_post 时、这基本上是内部发生的情况  

      1.获取空闲队列信标

      2.从空闲队列中获取消息

      3.将用户消息内容复制到免费消息

      4.将 msg 放在 数据队列中

      5.布置数据队列信标,该信标也将调用 Event_post

    以下是您暴露的比赛条件...

    -低优先级任务调用 Mailbox_post、但在它完成上面的步骤5之前被 Clock 函数抢先

    -时钟函数向邮箱添加5 msgs (从而读取 readerTask)

    - readerTask 在设置 Event_ID_02的情况下从 Event_pend 返回

    - readerTask 从 Mailbox_pend 成功获取 msg。 在内部、Mailbox_pend 知道有更多消息、因此它再次设置 Event_ID_02以表示存在另一个消息。

    - readerTask 在设置 Event_ID_02的情况下从 Event_pend 返回

    (笑声)

    问题是、readerTask 现在实际上获得了6个 msgs (时钟函数5个、writerTask 1个)。 所以邮箱为空、而 readerTask 现在阻断。

    现在、writerTask 可以完成第5步。 因此、由于步骤5、...、readerTask 被唤醒、但邮箱为空。

    我们就此打开了一个错误报告、并将在未来的版本中解决。

    那么、您可以做什么呢?

    1.您可以在 readerTask 和 writerTask 中的 Mailbox_pend 和 Mailbox_post 周围添加一个 GateMutexPri_ENTER/leave。 这允许 writerTask 在 readerTask 处理任何 msgs 之前完成步骤5。

    2.我们有一个针对 Semaphore_post () API 的初始修复(未经审核或测试)。 我已经附加了它、但是你需要重建 SYS/BIOS 内核(TI-RTOS 用户指南中有说明)。  

    e2e.ti.com/.../Semaphore.c

    Todd

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

    因此、另一种解决方法可能是检查 Mailbox_pend 的返回值、并仅在返回值为 true 时处理 msg?

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

    我的解决方案避免了竞争情况、但实际上没有发生任何糟糕的事情。 您基本上只是有一个额外的 Mailbox_pend 调用。 因此、我同意、只需检查退货代码并采取相应的行动可能是最好的做法。