进临界区(关全局中断)是否会影响数据的接收?

在嵌入式的编程中,经常会使用嵌入式实时操作系统,比如FreeRTOS,RTT等。

而在使用这些操作系统时,会有一个临界区的概念,一般操作是

1,进入临界区;

2,操作不能被线程打断的语句;

3,退出临界区;

而进入临界区的具体操作往往就是关掉系统的所有可以关闭的中断。这里有一个问题,如果有一个外设刚刚要产生一个中断请求时,这时候恰好进入了临界区,disable所有中断,那么这个外设的中断会不会被丢弃,是不是会有数据丢失了呢?

比如串口的FIFO中断,我们设置成RXFIFO收到5个字时产生接收中断,那么上述情况发生时是不是这5个字就丢掉呢?

这个问题我想了一会儿,开始不太明白,后来想到了一个关键点,我觉得这数据不会丢失。因为中断产后往往需要被清除,如果不清除中断产生标志位的话,系统会一直有这个中断到来。当上述RXFIFO中断将要产生时,系统刚刚关了全局中断,那好这个串口中断没有产生请求,但是也没被清除中断标志位;于是,等临界区退出后,它会继续产生这个中断请求,之后进入相应中断处理函数接收FIFO中的数据,并清除中断,这样一来数据就成功的被接收到了;

这个过程也提示了两个注意点,一是进临界区的时候要尽量短,否则系统可能会漏掉新来的数据;

再是这个FIFO设置的不能太满,好让系统在退出临界区之前还可以接收一定数据的外设数据;

 

你可能感兴趣的:(进临界区(关全局中断)是否会影响数据的接收?)