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:NDK recv()-任务调度

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/773555/rtos-ndk-recv---task-scheduling

工具/软件:TI-RTOS

您好!

我有一个使用邮箱的生产者-使用者去除水模式。 制片人(初级2级) Mailbox_post (hndl、BIOS_wait_forever)消息发送给使用者(primo 6.) 执行 MQTT 客户端任务以向代理发送 MQTT 消息的任务。

在生产者端,我有一个 for 循环,没有任何 Task_sleep()调用。 当我用 QOS0发布 MQTT 消息(仅调用 socket send())时,只要顾客发送消息,生产者任务就会被阻止,一切都按预期工作,顾客的优先级更高,一切都很好。

但是、当我尝试发送 QOS1消息时、如果 send()后跟 recv()以获取 PUBACK、则任务调度程序不会阻止使用者任务、并且生成者在获取之前传输的 PUBACK 之前迭代到下一个循环周期。

问题1:理由是什么? 您能解释一下为什么会发生这种情况吗?

问题2:如何使顾客任务等待 recv()完成,而不让生产者任务恢复?

非常感谢

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

    让我来看看我是否完全了解您的 QOS1消息的情况。 在 Producer 端,您有一个循环,其中包含 send(),后跟一个 recv()。 在消费者端,您有一个 recv()调用,后跟一个 send()调用。
    您在调用 recv()时没有看到使用者区块-这是对的吗? 您是否检查了顾客的 recv()电话的回电情况?
    同样、您的 Producer 也会重新启动循环。 您能告诉我 Producer 从其 recv()调用返回了什么吗?

    我期望生产者,以较高的优先级,先发送(),然后再接收(),并在消费者被唤醒前阻止。 然后我希望顾客致电 recv()并返回先前发送的数据()。 制片人应在其 recv()调用中等待所有时间。

    是否有一个计时器集强制您的 Producer 线程恢复执行、而不是在其 recv 调用中无限期阻止? 它实际上是否会收到一些东西、但不会收到您的预期?

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

    Daniel、您好!

    这是否得到了解决?

    Todd

    [更新了3/5:标记为 TI 认为已解决。 如果某个帖子坐得太久而没有活动、我们就会遇到问题。 如果未解决问题、只需发布响应、然后重新打开]

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

    让我们暂停一下、因为我必须关注其他项目。 感谢你的帮助。