博客專欄

EEPW首頁 > 博客 > Cortex-M系統(tǒng)中斷延遲及其測量方法

Cortex-M系統(tǒng)中斷延遲及其測量方法

發(fā)布人:魚鷹談單片機(jī) 時間:2022-03-19 來源:工程師 發(fā)布文章

大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是Cortex-M系統(tǒng)中斷延遲及其測量方法。

在嵌入式領(lǐng)域里,實(shí)時性是個經(jīng)常被我們掛在嘴邊的概念,這里的實(shí)時性主要強(qiáng)調(diào)得是當(dāng)外界事件發(fā)生時,系統(tǒng)是否能在規(guī)定的時間范圍內(nèi)予以響應(yīng)處理,這個時間閾值越小,系統(tǒng)的實(shí)時性就越高。當(dāng)然關(guān)于這個實(shí)時性,也有軟硬之分,硬實(shí)時要求的是設(shè)定的時間閾值內(nèi)必須完成響應(yīng),而軟實(shí)時則僅需根據(jù)任務(wù)的優(yōu)先級盡可能快地完成響應(yīng)即可。

無論是 RTOS 環(huán)境還是裸機(jī)環(huán)境下,系統(tǒng)最原始的實(shí)時性保障其實(shí)來自于 MCU 內(nèi)核的中斷響應(yīng)能力,關(guān)于中斷響應(yīng)能力有一個重要指標(biāo)叫中斷延遲時間,今天我們就來聊一聊 Cortex-M 內(nèi)核的中斷延遲及其測量方法:

一、什么是系統(tǒng)中斷延遲?

所謂中斷延遲,即從中斷請求 IRQ 信號置起開始到內(nèi)核進(jìn)入執(zhí)行該中斷 ISR 第一條指令時的間隔,如下圖所示, 箭頭范圍內(nèi)的 11 個周期就是中斷延遲時間。關(guān)于這個概念,ARM 公司專家 Joseph Yiu 的一篇博客 《Cortex-M內(nèi)核系統(tǒng)中斷延遲入門指南》 介紹得很詳細(xì)。

圖片

為什么會有中斷延遲?其實(shí)這是無法避免的,當(dāng)內(nèi)核在執(zhí)行 main thread 代碼時,來了中斷事件,NVIC 里對應(yīng) IRQ 信號被置起,內(nèi)核接到 NVIC 通知后壓棧保存現(xiàn)場(以便中斷 ISR 處理完成時回到被打斷的 main thread 地方),然后再從中斷向量表里取出對應(yīng)中斷 ISR 來執(zhí)行,這一系列動作是需要時間的。

Cortex-M 家族發(fā)展至今,已有 M0/M0+/M1/M3/M4/M7/M23/M33/M35P/M55 等多款內(nèi)核,這些內(nèi)核的中斷延遲時間不一,如下表所示。注意表中的數(shù)值單位是內(nèi)核的時鐘周期,并且是在零等待內(nèi)存系統(tǒng)條件下結(jié)果(即代碼鏈接在零等待內(nèi)存里)。

  • Note1: 一般來說 MCU 內(nèi)部與內(nèi)核同頻的 SRAM 是標(biāo)準(zhǔn)的零等待內(nèi)存。
  • Note2: 許多運(yùn)行頻率超過 100MHz 的微控制器會搭配非常慢的 Flash 存儲器(例如 30 - 50MHz),雖然可以使用 Flash 訪問加速硬件來提高性能,但中斷延遲仍然受到 Flash 存儲系統(tǒng)等待狀態(tài)的影響。
圖片二、如何測量系統(tǒng)中斷延遲?

測量 Cortex-M 的中斷延遲方法有很多,任何一個帶中斷的 MCU 外設(shè)模塊都可以用來測中斷延遲,Cortex-M 中斷延遲時間跟觸發(fā)中斷的具體外設(shè)模塊類型基本上是無關(guān)的(最多受一點(diǎn)該外設(shè)中斷信號同步周期的影響)。

利用 GPIO 模塊來測量 Cortex-M 的中斷延遲是最簡單的方法,選擇兩個 GPIO,一個配置為輸入(GPIO_IN),另一個配置為上拉輸出(GPIO_OUT,初態(tài)設(shè)為高),開啟 GPIO_IN 的邊沿中斷(比如下降沿),在 GPIO_IN 邊沿中斷 ISR 里翻轉(zhuǎn)兩次 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 函數(shù)偽代碼里,我們對 GPIO_OUT 做了兩次翻轉(zhuǎn),這是有必要的。我們隨便選擇一個 CM7 芯片去實(shí)際編譯(IAR環(huán)境下,無優(yōu)化)可以看到如下匯編代碼,每一次翻轉(zhuǎn)實(shí)際上由四條指令組成,我們作為計(jì)時基準(zhǔn)的 GPIO_OUT 第一個邊沿其實(shí)是 ISR 里執(zhí)行了第一句翻轉(zhuǎn)代碼后的時刻,而中斷延遲是不包含第一句翻轉(zhuǎn)代碼執(zhí)行時間的。因?yàn)橹噶盍魉€優(yōu)化等復(fù)雜情況,我們就不從理論上計(jì)算四條指令實(shí)際消耗時鐘周期數(shù),直接再翻轉(zhuǎn)一次 GPIO_OUT,測量 GPIO_OUT 低電平時間即認(rèn)為是這四條指令執(zhí)行時間。

圖片

因此最終中斷延遲時間 td = t1 - t2,其中 t1、t2 是我們可以測量出來的時間。此外,td 時間內(nèi)包含了 tx,這個 tx 是 I/O 跳變信號到芯片內(nèi)部 IRQ 置起的時間,這個時間是芯片系統(tǒng)所需的同步時間,因芯片設(shè)計(jì)而異,本應(yīng)不被計(jì)算在系統(tǒng)中斷延遲內(nèi),但因?yàn)檫@個時間無法測量,故而就放在中斷延遲里了,也算是一點(diǎn)小小誤差吧。

下一篇我們將在實(shí)際 Cortex-M 芯片上用這種方法去實(shí)測中斷延遲,敬請期待。

圖片

至此,Cortex-M系統(tǒng)中斷延遲及其測量方法痞子衡便介紹完畢了,掌聲在哪里~~~



*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。



關(guān)鍵詞: 單片機(jī)

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉