gpt4 book ai didi

arm - 如何完成低优先级中断?

转载 作者:行者123 更新时间:2023-12-04 18:08:02 25 4
gpt4 key购买 nike

我有一个发送 USB 数据的高优先级中断和一个已经获取下一个要发送的数据的低优先级任务。

有时高优先级中断需要一些仍在获取的数据,在这种情况下,我需要指示 MCU 在继续执行高优先级中断之前完成较低优先级的任务。

我不知道该怎么做。是否可以使用 NVIC_SetPriority 提高后台任务的优先级,并立即从 USB 任务调用 NVIC_SetPendingIRQ,然后再次降低它?或者使这项工作最简单的方法是什么?

最佳答案

您有多少时间来响应数据请求,以及为下一个请求预取需要多长时间?如果预取时间很短,我会反转你的中断优先级 - 这会为数据请求中断填充缓冲区。

否则,没有一种干净的方法可以在裸机上做你想做的事——这就是操作系统的用途。如果您在 OS 中,数据请求中断例程可以从预取中断例程请求信号并从中断返回并等待数据请求中断例程发送它已完成一个 block 的信号。

裸机,您可以尝试让预取例程在每个缓冲区就绪后调用数据请求中断。 DRIR 醒来后会进行一系列检查

  • 我是被数据请求吵醒了吗?
    • 是的:我有数据要发送吗?
      • 是:发送数据,清除中断请求,中断返回
      • 否:将“需要的 block ”计数器加 1,清除中断请求,从中断中返回
    • 否:一定是被预取完成唤醒,“需要的 block 数”是否为零?
      • 是:缓冲区有数据,但还不需要,返回
      • 否:发送 1 个数据 block ,递减“需要的 block ”直到它达到零或缓冲区为空,返回

无法保证您会及时取出数据,但至少这样低优先级中断有机会完成。

顺便说一句,我不认为 N​​VIC 可以强制当前正在执行的中断为另一个更高优先级的中断而停止。当中断同时发生时(或在中断已被屏蔽时发生,即在服务另一个中断时发生),优先级非常重要。

许多操作系统提供了一个两步中断过程,其中直接中断例程尽可能减少以清除中断,并通知一个单独的中断线程来处理请求的较长、详细的部分。参见 http://en.wikipedia.org/wiki/Interrupt_handler

由于直接中断例程小而快,它允许将优先级分配给各个中断线程以控制执行顺序。

关于arm - 如何完成低优先级中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21750069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com