如何完成优先级较低的中断?

时间:2014-02-13 09:29:55

标签: arm interrupt lpc cortex-m

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

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

我无法弄清楚如何使这项工作。是否可以使用NVIC_SetPriority提高后台任务的优先级,并立即从USB任务调用NVIC_SetPendingIRQ,然后再降低它?或者最简单的方法是什么呢?

2 个答案:

答案 0 :(得分:1)

您需要多长时间来回答数据请求,以及预取下一个请求需要多长时间?如果预取时间很短,我会颠倒你的中断优先级 - 这会使缓冲区填满数据请求中断。

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

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

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

没有任何保证您能及时获得数据,但至少这样可以让优先级较低的中断完成。

BTW,我不认为NVIC可以强制当前正在执行的中断为不同的高优先级中断停止。当中断同时发生时(或者当中断已被屏蔽时,即在为另一个中断服务时),优先级确实很重要。

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

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

答案 1 :(得分:0)

我不知道你是否有充分的理由在两种不同的环境中运行RX和TX,但通常这只能在一个上下文中实现。但是,如果您真的想要遵循原始设计,则需要引入某种机制来同步这两个上下文的操作。通常,如果您正在运行RTOS,您将使用事件标志,二进制信号量或给定RTOS提供的一些其他类似服务。

在收到某些数据之前,您不希望(也不能)发送任何数据,对吧?这就是为什么你需要等待收到数据后从RX上下文设置的通知(在TX上下文中)。

在不采用这种技术的情况下完成这种隧道会很快失去同步。