大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是Cortex-M系統中斷延遲及其測量方法。
在嵌入式領域裡,實時性是個經常被我們掛在嘴邊的概念,這裡的實時性主要強調得是當外界事件發生時,系統是否能在規定的時間範圍內予以響應處理,這個時間閾值越小,系統的實時性就越高。當然關於這個實時性,也有軟硬之分,硬實時要求的是設定的時間閾值內必須完成響應,而軟實時則僅需根據任務的優先順序儘可能快地完成響應即可。
無論是 RTOS 環境還是裸機環境下,系統最原始的實時性保障其實來自於 MCU 核心的中斷響應能力,關於中斷響應能力有一個重要指標叫中斷延遲時間,今天我們就來聊一聊 Cortex-M 核心的中斷延遲及其測量方法:
一、什麼是系統中斷延遲?
所謂中斷延遲,即從中斷請求 IRQ 訊號置起開始到核心進入執行該中斷 ISR 第一條指令時的間隔,如下圖所示, 箭頭範圍內的 11 個週期就是中斷延遲時間。關於這個概念,ARM 公司專家 Joseph Yiu 的一篇部落格 《Cortex-M核心系統中斷延遲入門指南》 介紹得很詳細。
為什麼會有中斷延遲?其實這是無法避免的,當核心在執行 main thread 程式碼時,來了中斷事件,NVIC 裡對應 IRQ 訊號被置起,核心接到 NVIC 通知後壓棧儲存現場(以便中斷 ISR 處理完成時回到被打斷的 main thread 地方),然後再從中斷向量表裡取出對應中斷 ISR 來執行,這一系列動作是需要時間的。
Cortex-M 家族發展至今,已有 M0/M0+/M1/M3/M4/M7/M23/M33/M35P/M55 等多款核心,這些核心的中斷延遲時間不一,如下表所示。注意表中的數值單位是核心的時鐘週期,並且是在零等待記憶體系統條件下結果(即程式碼連結在零等待記憶體裡)。
- Note1: 一般來說 MCU 內部與核心同頻的 SRAM 是標準的零等待記憶體。
- Note2: 許多執行頻率超過 100MHz 的微控制器會搭配非常慢的 Flash 儲存器(例如 30 - 50MHz),雖然可以使用 Flash 訪問加速硬體來提高效能,但中斷延遲仍然受到 Flash 儲存系統等待狀態的影響。
二、如何測量系統中斷延遲?
測量 Cortex-M 的中斷延遲方法有很多,任何一個帶中斷的 MCU 外設模組都可以用來測中斷延遲,Cortex-M 中斷延遲時間跟觸發中斷的具體外設模組型別基本上是無關的(最多受一點該外設中斷訊號同步週期的影響)。
利用 GPIO 模組來測量 Cortex-M 的中斷延遲是最簡單的方法,選擇兩個 GPIO,一個配置為輸入(GPIO_IN),另一個配置為上拉輸出(GPIO_OUT,初態設為高),開啟 GPIO_IN 的邊沿中斷(比如下降沿),在 GPIO_IN 邊沿中斷 ISR 裡翻轉兩次 GPIO_OUT,然後用示波器測量兩個 GPIO 訊號邊沿間隔得出中斷延遲時間。
uint32_t s_pin_low = 0x0;
uint32_t s_pin_high = 0x1;
void GPIO_IN_IRQHandler(void)
{
GPIO_OUT->DR = s_pin_low;
GPIO_OUT->DR = s_pin_high;
ClearInterruptFlag(GPIO_IN);
__DSB();
}
需要注意的是在如上 GPIO_IN_IRQHandler 函式虛擬碼裡,我們對 GPIO_OUT 做了兩次翻轉,這是有必要的。我們隨便選擇一個 CM7 晶片去實際編譯(IAR環境下,無優化)可以看到如下彙編程式碼,每一次翻轉實際上由四條指令組成,我們作為計時基準的 GPIO_OUT 第一個邊沿其實是 ISR 裡執行了第一句翻轉程式碼後的時刻,而中斷延遲是不包含第一句翻轉程式碼執行時間的。因為指令流水線優化等複雜情況,我們就不從理論上計算四條指令實際消耗時鐘週期數,直接再翻轉一次 GPIO_OUT,測量 GPIO_OUT 低電平時間即認為是這四條指令執行時間。
因此最終中斷延遲時間 td = t1 - t2,其中 t1、t2 是我們可以測量出來的時間。此外,td 時間內包含了 tx,這個 tx 是 I/O 跳變訊號到晶片內部 IRQ 置起的時間,這個時間是晶片系統所需的同步時間,因晶片設計而異,本應不被計算在系統中斷延遲內,但因為這個時間無法測量,故而就放在中斷延遲裡了,也算是一點小小誤差吧。
下一篇我們將在實際 Cortex-M 晶片上用這種方法去實測中斷延遲,敬請期待。
至此,Cortex-M系統中斷延遲及其測量方法痞子衡便介紹完畢了,掌聲在哪裡~~~
歡迎訂閱
文章會同時釋出到我的 部落格園主頁、CSDN主頁、知乎主頁、微信公眾號 平臺上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。