我有一个发送 USB 数据的高优先级中断,以及一个已经获取下一个要发送的数据的低优先级任务。
有时高优先级中断需要一些仍在获取的数据,在这种情况下,我需要指示 MCU 在继续执行高优先级中断之前完成较低优先级的任务。
我不知道如何使这项工作。是否可以使用 NVIC_SetPriority 提高后台任务的优先级,并立即从 USB 任务中调用 NVIC_SetPendingIRQ,然后再次降低它?或者什么是最简单的方法来完成这项工作?
您需要多少时间来响应数据请求,以及为下一个请求预取需要多长时间?如果预取时间很短,我会颠倒您对中断的优先级 - 这会为数据请求中断填充缓冲区。
否则,没有一种干净的方式来做你想要的裸机——这就是操作系统的用途。如果您在操作系统中,数据请求中断程序可以从预取中断程序请求信号并从中断返回并等待数据请求中断程序发送它已完成块的信号。
裸机,您可以尝试在每个缓冲区准备好后让预取例程调用数据请求中断。DRIR 然后在唤醒时进行一系列检查
无法保证您会及时获取数据,但至少这样低优先级的中断就有机会完成。
顺便说一句,我不认为 NVIC 可以强制当前执行的中断停止以换取不同的更高优先级的中断。当中断同时发生时(或者在中断已经被屏蔽时发生,即在服务另一个中断时),优先级真的很重要。
许多操作系统提供两步中断过程,其中直接中断例程尽可能少地清除中断,并且它通知单独的中断线程来处理请求的更长、更详细的部分。见http://en.wikipedia.org/wiki/Interrupt_handler
由于直接中断程序小而快,它允许将优先级分配给各个中断线程以控制执行顺序。
我不知道您是否有充分的理由在两种不同的上下文中运行 RX 和 TX,但通常这可以非常简单地仅在一种上下文中实现。但是,如果你真的想按照你原来的设计,你需要引入某种机制来同步这两个上下文的操作。通常,如果您正在运行 RTOS,您将使用事件标志、二进制信号量或给定 RTOS 提供的其他类似服务。
在收到一些数据之前,您不希望(也不能)发送任何数据,对吧?这就是为什么您需要等待接收到数据后从 RX 上下文设置的通知(在 TX 上下文中)。
在不采用这种技术的情况下完成这种隧道传输很快就会失去同步。