1. 程式人生 > >SylixOS 中斷響應時間測試

SylixOS 中斷響應時間測試

sylixos 中斷 綁核

1.應用場景

在一些情況下,對於一些緊急的中斷任務,系統需要為其提供穩定可靠的中斷響應時間,但一般的中斷服務函數,它的響應時間可能會受到其他中斷向量的影響,延遲響應。在SylixOS中有兩種解方案。

1.提高該中斷向量優先級,打開中斷嵌套來確保緊急中斷的響應時間。

2.對於多核處理器,可以采用中斷綁核的形式,即將緊急中斷綁定到某一核上,該核只處理緊急任務。

下面通過測試正常情況下、中斷嵌套情況下、中斷綁核情況下的中斷響應時間,來對比采用上述兩種方式的優點。

2.中斷響應時間測試方案

使用示波器自帶的1KHZ輸出方波作為CPU的中斷源,下降沿中斷,在中斷服務裏改變CPU引腳輸出電平並捕獲。中斷響應時間為1KHZ方波由從高電平上升到0.7*VCC開始到CPU輸出低電平的時間差。具體測試方案見PPT支持SMP的大型實時操作系統

(IDE目錄下的ppt目錄裏)。硬件連接圖如圖2- 1所示。

技術分享

圖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 中斷響應時間測試