2017-01-02 36 views
2

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()

謝謝。

回答

6

你的方法似乎很正常。您需要禁用中斷來保護緩衝區。

當中斷被禁止時,中斷標誌將繼續被設置,但處理程序不會被調用。當中斷使能時,中斷處理程序將運行。

禁用中斷時不會過長的警告是禁用時可能會觸發兩種相同類型的中斷。如果發生這種情況,單中斷標誌會被設置一次,並且無法確定是否有兩個中斷掛起。中斷處理程序只運行一次。本質上,第一個中斷會丟失。

+0

謝謝,這非常清楚! – nekitip

相關問題