进临界区(关全局中断)是否会影响数据的接收?
在嵌入式的編程中,經(jīng)常會使用嵌入式實時操作系統(tǒng),比如FreeRTOS,RTT等。
而在使用這些操作系統(tǒng)時,會有一個臨界區(qū)的概念,一般操作是
1,進入臨界區(qū);
2,操作不能被線程打斷的語句;
3,退出臨界區(qū);
而進入臨界區(qū)的具體操作往往就是關(guān)掉系統(tǒng)的所有可以關(guān)閉的中斷。這里有一個問題,如果有一個外設(shè)剛剛要產(chǎn)生一個中斷請求時,這時候恰好進入了臨界區(qū),disable所有中斷,那么這個外設(shè)的中斷會不會被丟棄,是不是會有數(shù)據(jù)丟失了呢?
比如串口的FIFO中斷,我們設(shè)置成RXFIFO收到5個字時產(chǎn)生接收中斷,那么上述情況發(fā)生時是不是這5個字就丟掉呢?
這個問題我想了一會兒,開始不太明白,后來想到了一個關(guān)鍵點,我覺得這數(shù)據(jù)不會丟失。因為中斷產(chǎn)后往往需要被清除,如果不清除中斷產(chǎn)生標(biāo)志位的話,系統(tǒng)會一直有這個中斷到來。當(dāng)上述RXFIFO中斷將要產(chǎn)生時,系統(tǒng)剛剛關(guān)了全局中斷,那好這個串口中斷沒有產(chǎn)生請求,但是也沒被清除中斷標(biāo)志位;于是,等臨界區(qū)退出后,它會繼續(xù)產(chǎn)生這個中斷請求,之后進入相應(yīng)中斷處理函數(shù)接收FIFO中的數(shù)據(jù),并清除中斷,這樣一來數(shù)據(jù)就成功的被接收到了;
這個過程也提示了兩個注意點,一是進臨界區(qū)的時候要盡量短,否則系統(tǒng)可能會漏掉新來的數(shù)據(jù);
再是這個FIFO設(shè)置的不能太滿,好讓系統(tǒng)在退出臨界區(qū)之前還可以接收一定數(shù)量的外設(shè)進來的數(shù)據(jù).
?
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的进临界区(关全局中断)是否会影响数据的接收?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中断锁与信号量的一种使用场景
- 下一篇: 实现线程栈初始化(RTT)