1. gzyueqian
      13352868059

      嵌入式開發:編寫中斷服務例程的5個最佳實踐

      更新時間: 2024-06-08 09:18:58來源: 粵嵌教育瀏覽量:1047


      幾乎每個嵌入式系統都使用中斷服務程序。如果需要跟蹤時間,可能會有一個產生系統滴答的定時器中斷。如果你有一個USART,你可能正在使用中斷。使用DMA進行更高效的數據傳輸?你可能正在使用中斷。

      中斷是嵌入式系統不可或缺的一部分。不幸的是,寫得不好的ISR會導致系統出現爭用情況、響應能力差,甚至CPU使用過度。

      在本帖中,我們將探討撰寫高效ISR的幾種最佳實踐。

       

      1.保持簡短快速

      中斷超級酷!當的代碼正在執行并且發生重要事件時,程序會被中斷以跳轉到中斷服務例程。發生跳轉時,寄存器的當前狀態需要存儲在中斷幀中。

      中斷幀被推送到堆棧上,并進入ISR。中斷運行,然后中斷幀恢復,應用程序恢復。可以想象,每次運行中斷服務程序時,這個過程都會消耗CPU周期并產生開銷。周期數因處理器和架構而異,但中斷兩端的周期數可能在12到數百個之間。

       

      雖然我們對中斷開銷無能為力,但我們可以控制中斷中使用的周期數。可以想象,ISR執行所花費的CPU周期越多,對我們的應用程序代碼的影響就越大。長而慢的中斷會導致程序不同部分的抖動和其他時序問題。它們甚至會導致其他中斷丟失或延遲!

      經驗法則是讓你的中斷短而快!

       

      2.不要調用函數

      如果你希望你的ISR短而快,你應該避免在ISR內部進行函數調用。函數(尤其是那些開銷巨大或執行復雜任務的函數)會大大增加ISR的執行時間。增加的執行時間會導致中斷丟失或其他關鍵任務的延遲處理,從而可能導致系統不穩定。

      當在ISR中調用一個函數時,它涉及到額外的步驟,如將當前上下文推送到堆棧上、跳轉到函數代碼并返回到ISR。這些額外的步驟消耗了寶貴的CPU周期。如果函數包含阻塞調用、等待I/O操作或依賴中斷期間可能處于不一致狀態的資源,則可能會嚴重影響系統的響應能力和可預測性。

      現在,可能認為編寫ISR會違反軟件開發最佳實踐。畢竟,我們不應該模塊化我們的代碼嗎?沒有職能,我們的ISR不會變得混亂嗎?

      使用一些技巧來規避不調用函數的最佳實踐

      1)使用靜態編譯或預處理程序。

      根據的語言,復雜的計算或至少部分計算可能會在編譯時執行。通過在編譯時執行這些計算,ISR在運行時需要執行的工作將會減少。

      2)內嵌函數

      仍然可以將ISR代碼放入函數中,但是不要將它們作為常規函數,而是使用inline關鍵字。inline關鍵字會建議編譯器不要調用該函數,而是應該將該函數的內容復制并粘貼到調用者中。

      內聯函數將消除與函數調用相關的開銷。被警告!只是給編譯器的一個建議!必須在程序集中驗證該函數實際上是內聯的。

      注意今天大多數編譯器會采納我們的建議,但你不能毫無疑問地相信它!

      通過避免ISR中的函數調用,可以保持中斷處理的效率和可靠性,確保的系統在各種條件下保持響應和穩定。

       

      3.將進程卸載到其他線程

      中斷并不是用來做很多繁重的工作的。我們希望中斷短而快,這意味著它應該做最少需要做的事情。例如,如果正在通過USART接收作為數據包一部分的字節,則不會在中斷中處理該數據包。處理該字節,然后設置一個標志來指示程序的另一部分應該處理該數據。

      通過將密集的進程卸載到其他線程,可以確保ISR保持高效和快速響應。這種方法可以在裸機或多線程環境中使用。以下是如何有效地將處理任務轉移到ISR之外的方法

      1)設置標志

      使用簡單的標志來指示事件已經發生。主程序或另一個線程可以監視這些標志,并在安全的情況下進行必要的處理。

      使用隊列

      實現隊列將數據從ISR傳遞到其他線程。這樣,ISR可以快速將數據排隊并返回處理中斷,同時主程序或專用工作線程可以處理排隊的數據。

      3)線程同步

      確保ISR和其他線程之間的正確同步,以避免競爭情況和數據損壞。根據需要使用互斥、信號量或其他同步機制。

       

      通過遵循這些實踐,可以在嵌入式系統中保持高水平的性能和可靠性。這將確保ISR保持快速和高效,同時安全地處理和控制更復雜的處理。

       

      4.對共享變量使用volatile

      ISR和主程序共享變量時,將它們聲明為volatile是至關重要的。volatile關鍵字告訴編譯器,變量值可能會在程序流的控制之外隨時更改,從而防止編譯器應用假定值不會意外更改的特定優化。

      如果沒有volatile關鍵字,編譯器可能會優化掉必要的讀取或寫入,從而導致不可預測的行為和難以診斷的錯誤。Volatile將為做三件事

      1)阻止優化

      編譯器假定非易失性變量不會改變,除非程序顯式修改它。對于共享變量,這種假設是錯誤的,因為ISR可以隨時更改變量。將變量聲明為volatile會阻止編譯器優化必要的讀取或寫入。

      2)確保數據是新鮮的

      使用volatile時,編譯器總是從內存中讀取值,而不是使用寄存器中的緩存值。這確保了主程序看到ISR寫入的最新值,反之亦然。

       

      結論

      中斷服務例程對于每個嵌入式系統都至關重要。如果你想讓你的系統反應靈敏和高效,你必須正確地實現你的中斷。我無法告訴你我遇到性能差的系統的頻率,根本原因是ISR寫得不好。

      如果你遵循本文中的最佳實踐,你的中斷會表現得更好,引起的問題也會更少。


      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 五月AV中文字幕DVD | 中文字幕无线在线视频观 | 日韩乱偷中文字幕 | 亚洲欧美日韩国产不卡tv | 免费在线黄a网站 | 亚洲乱码国产乱码精品精在线观看 |