SylixOS 中斷響應時間測試
1.應用場景
在一些情況下,對於一些緊急的中斷任務,系統需要為其提供穩定可靠的中斷響應時間,但一般的中斷服務函數,它的響應時間可能會受到其他中斷向量的影響,延遲響應。在SylixOS中有兩種解方案。
1.提高該中斷向量優先級,打開中斷嵌套來確保緊急中斷的響應時間。
2.對於多核處理器,可以采用中斷綁核的形式,即將緊急中斷綁定到某一核上,該核只處理緊急任務。
下面通過測試正常情況下、中斷嵌套情況下、中斷綁核情況下的中斷響應時間,來對比采用上述兩種方式的優點。
2.中斷響應時間測試方案
使用示波器自帶的1KHZ輸出方波作為CPU的中斷源,下降沿中斷,在中斷服務裏改變CPU引腳輸出電平並捕獲。中斷響應時間為1KHZ方波由從高電平上升到0.7*VCC開始到CPU輸出低電平的時間差。具體測試方案見PPT支持SMP的大型實時操作系統
圖2- 1 中斷響應時間測試硬件連接
測試以zynq7000開發板為例,zynq7000處理器為雙核處理器,中斷控制器為GIC pl350,它支持中斷嵌套和中斷綁核。測試程序如程序清單2- 1所示。
程序清單2- 1 中斷響應時間測試代碼
/********************************************************************************************************* * 函數名稱: __doIsr ** 功能描述: 中斷服務函數 ** 輸 入 : VOID ** 輸 出 : ** 全局變量: ** 調用模塊: *********************************************************************************************************/ static irqreturn_t __doIsr (PVOID pvArg, ULONG iVector) { API_GpioClearIrq(GPIO_NUM); /* 清中斷 */ writel(readl(0xE000A204) | (1 << 0), 0xE000A204); /* 11號腳,設置為出輸出 */ writel(readl(0xE000A208) | (1 << 0), 0xE000A208); /* 11號腳,設置為出輸出使能 */ writel(readl(0xE000A200) | (1 << 0), 0xE000A000); /* 11號腳,設置為低電平 */ bspDelayUs(1); /* 延遲1us */ writel(readl(0xE000A200) | (0 << 0), 0xE000A000); /* 11號腳,設置為高電平 */ return LW_IRQ_HANDLED; } /********************************************************************************************************* ** 函數名稱: module_init ** 功能描述: 模塊加載函數 ** 輸 入 : VOID ** 輸 出 : 0 表示成功,非0表示失敗 ** 全局變量: ** 調用模塊: *********************************************************************************************************/ int module_init (void) { system("shfile /etc/thread_affinity.sh"); LW_CLASS_CPUSET cpuset; LW_CPU_ZERO(&cpuset); LW_CPU_SET(1, &cpuset); API_GpioRequestOne(GPIO_NUM, LW_GPIOF_IN, "intIn"); /* 下降沿觸發中斷 */ LW_IRQ = API_GpioSetupIrq(GPIO_NUM, LW_FALSE, 0); API_InterVectorConnect(LW_IRQ, /* 安裝操作系統中斷向量表 */ (PINT_SVR_ROUTINE)__doIsr, (PVOID)LW_NULL, "isr"); API_InterSetTarget(LW_IRQ, sizeof(LW_CLASS_CPUSET), &cpuset); /* 設置中斷目標CPU1 */ API_InterVectorEnable(LW_IRQ); /* 中斷使能 */ return 0; }
在不開中斷嵌套和中斷不綁核的情況下,用上述方案進行測試。在不加負載的情況下,其中斷響應時間如圖3- 1所示。3.正常情況下中斷響應時間測試
圖3- 1 無負載下中斷響應時間測試
由圖3- 1可以看出其中斷響應時間大概為3.5us,並且實際測試時波動較大,中斷響應時間不穩定。在加負載的情況下(內存拷貝負載和CPU負載),其中斷響應時間測試結果如下圖3- 2所示。
圖3- 2 加負載下中斷響應時間測試
由圖3- 2可以看出,加負載後,內存拷貝等任務可能會產生中斷,從而影響測試中斷向量的中斷響應時間,測試中斷向量的中斷響應時間已經達到7us,並且實際響應時間很不穩定,有時可能出現十幾微妙的情況。對於緊急任務,這種不穩定情況是不允許出現的。
4.中斷嵌套下中斷響應時間測試
在SylixOS下,可以采用中斷嵌套的方式加快高優先級中斷向量的響應時間,將測試中斷向量的優先級設置為最高,並且打開中斷嵌套,測試中斷響應時間,圖4- 1可以看出各個中斷向量分布在不同的CPU核上。
圖4- 1
如圖4- 2所示,測試中斷向量的中斷響應時間為3.5us,並且實際響應時沒有太大波動(響應時間穩定在3.5us)。
圖4- 2 中斷嵌套下無壓力中斷響應時間測試
如圖4- 3所示是在加負載(CPU負載和內存拷貝負載)的情況下,測試中斷向量的響應時間為5us左右,並且實際響應沒有太大波動(響應時間穩定在5us)。
圖4- 3 中斷嵌套下加負載中斷響應時間測試
由測試結果可以看出,中斷嵌套可以提高中斷的響應時間。
在單核處理器下,只能通過中斷嵌套來保證緊急中斷的響應時間,但多級中斷嵌套存在中斷棧溢出的風險,用戶在使用時需要註意這一點。
大部分中斷控制器為了防止中斷棧溢出,一般會限制中斷嵌套的層數,例如AIC支持最多8級中斷嵌套,GIC支持最多7級中斷嵌套。
SylixOS中用戶可以手動配置中斷棧的大小,通過memory_cfg.h 下的LW_CFG_INT_STK_SIZE選項進行中斷棧大小的設置,SylixOS默認中斷棧大小為4K,用戶可以根據自身情況進行配置,配置選項程序如程序清單4- 1所示。
程序清單4- 1 中斷棧大小配置
/********************************************************************************************************* * 基本二進制大小單位定義 *********************************************************************************************************/ #ifndef LW_CFG_KB_SIZE #define LW_CFG_KB_SIZE (1024) #define LW_CFG_MB_SIZE (1024 * LW_CFG_KB_SIZE) #define LW_CFG_GB_SIZE (1024 * LW_CFG_MB_SIZE) #endif /********************************************************************************************************* * KERNEL THREAD & INTERUPT STACK * (不包括網絡與其他擴展子系統相關線程) *********************************************************************************************************/ #define LW_CFG_INT_STK_SIZE (4 * LW_CFG_KB_SIZE)/* 系統中斷堆棧大小 (字節) */ ... …
5.中斷綁核下中斷響應時間測試
開中斷嵌套存在一定風險,在多核處理器下,中斷控制器一般都支持中斷綁核。可以采用中斷綁核的方式提高緊急中斷向量的響應時間,中斷綁核程序如程序清單5- 1所示。
程序清單5- 1 中斷綁核設置
LW_CLASS_CPUSET cpuset; LW_CPU_ZERO(&cpuset); LW_CPU_SET(1, &cpuset); API_GpioRequestOne(GPIO_NUM, LW_GPIOF_IN, "intIn"); /* 下降沿觸發中斷 */ LW_IRQ = API_GpioSetupIrq(GPIO_NUM, LW_FALSE, 0); API_InterVectorConnect(LW_IRQ, /* 安裝操作系統中斷向量表 */ (PINT_SVR_ROUTINE)__doIsr, (PVOID)LW_NULL, "isr"); API_InterSetTarget(LW_IRQ, sizeof(LW_CLASS_CPUSET), &cpuset); /* 設置中斷目標CPU1 */ API_InterVectorEnable(LW_IRQ); /* 中斷使能 */
程序運行後,如圖5- 2所示可以看出,測試中斷向量綁定到CPU 1,其他中斷向量綁定到了CPU 0。
圖5- 2 中斷綁核
在不加負載的情況下,中斷響應時間測試結果如圖5- 3所示,可以看出中斷響應時間在3us左右,並且實際測試時響應時間沒有太大波動。
圖5- 3 綁核無負載中斷響應時間測試結果
在加負載(CPU負載和內存拷貝負載)的情況下,響應測試結果如圖5- 4所示,響應時間為4us,並且實際測試時響應時間沒有太大波動,負載對緊急任務的中斷響應時間影響很小。
圖5- 4 綁核有負載中斷響應時間測試結果
根據上述測試結果可以看出,中斷綁核也可以保證中斷響應時間的穩定可靠
SylixOS 中斷響應時間測試