AVR MCU(Arduino)會記住nointerrupts()
部分發生的所有中斷嗎?在沒有中斷()的情況下,新中斷會在中斷()之後排隊並執行嗎?
void f1() {
noInterrupts();
// critical, time-sensitive code here
interrupts();
}
//now jump to queued interrupts if any
它會在interrupts()
之後執行它們嗎?
我問這個,因爲在閱讀數據表後,我感覺所有的中斷都有它們的標誌,所以這可能沒有問題。但我沒那麼有經驗,而且我很可能錯過了一些東西,因爲其他教程總是隱約地指出:「不要呆在那裏太久,因爲那個時候不會發生任何中斷。」
爲什麼?
我有一個循環緩衝區,我把一些來自I2C的數據包(只要發生I2C中斷,它們就會被放入)。我偶爾也會在主循環中讀取此緩衝區,並且時間不可預知,並且允許覆蓋。
此外,我使用相同的緩衝區類(但不同的實例)在相反的方向(I2C然後觸發中斷和讀取)。
我的問題是:我想在非中斷讀/寫過程中關閉中斷,所以我可以確定當I2C觸發並覆蓋正在從正常主循環讀取的項目時。
我現在有種處理讀取前後標誌的情況,所以中斷首先檢查是否該項目是免費的,但我對這種方法沒有信心,我想使它與noInterrupts()
和在主循環讀取期間使用interrupts()
。
謝謝。
謝謝,這非常清楚! – nekitip