2016-09-09 13 views
-1

我正在与STM32系统,我需要通过UART RX接收字节,事情是我必须同步过程,这意味着当它做的其他事情我们不能运行ISR,反之亦然。显然,最简单的方法是在该“关键部分”期间禁用irq。但是我担心后果,如果我在关键部分运行并且中断即将出现但被禁用,那么只要我再次启用irq,该中断是否会出现,或者是否应该丢失该数据通过中断?可能disable_irq延迟传入中断或只是直接跳过它

+0

尽可能使用DMA和假脱机字节。 – LPs

+0

这取决于您在关键部分禁用了多长时间的中断。如果硬件完成第二个字节的接收,则可能是第一个字节消失了。 (可能有硬件缓冲保留了几个字节,但很明显在某些时候它们会丢失。)因此,要在非常短的时间内禁用中断,或者如LP所说,使用不同的技术将数据从硬件到RAM,如DMA传输。 – Ross

+0

请在“答案”字段中查看我的意见:如果使用disable_irq,则发生硬件中断似乎无法准确缓冲硬件中断。 –

回答

0

一个设计正确的系统应该有中断粘性(在它们一旦到达中断控制器,它们就会被注册,直到被服务)。

换言之,如果在禁用中断的情况下发生中断,则应在重新启用中断后立即触发处理器。

那么唯一的问题是,在数据丢失之前,您可以延迟服务中断多长时间。这是每个外设的问题。有时候,设计者会将缓冲区/ FIFO放入其中,而其他时候则需要快速处理它或者可能会丢失数据。

+0

谢谢你的回答,Russ。 –

+0

谢谢你的回答,Russ。事实上,我今天提出了一个想法,假设硬件在disable_irq期间将不能存储任何东西,我们必须始终处理硬件ISR并临时存储相关数据,并在稍后安全地处理这些数据,在一些操作系统中通常称为延期rountine。这种机制明显增加了复杂性,但却避免了丢失中断相关数据的风险。 –

+0

对不起,我以前的帖子可能不准确,基本上延迟的ISR例程主要用于缩短ISR的处理时间,但不是重合问题。这里的关键问题是,即使是在调用延迟例程的时候,实际的硬件中断仍然可能发生(假设它可能随时发生),因此除了禁用IRQ之外几乎没有办法同步该过程。但在disable_irq期间,带有IRQ的数据可能会丢失 –