與典型的實時操作系統RT-Linux、WinCE、VxWorks等相比,Windows似乎無法直接應用于對實時性有要求的場合。而本文將在安裝了Windows 10 IoT企業版的ESM8400工控主板上、測試系統實時性能的一個重要指標——中斷響應延時。測試結果將表明,安裝Windows操作系統的ESM8400工控主板,在啟用軟實時特性后,系統實時性能將顯著提高,在ESM8400上實際測試中斷響應延時能穩定的控制在200us以內。
ESM8400是基于NXP iMX8MP的 名片尺寸ARM64工控主板,可安裝Windows 10 IoT企業版操作系統,Windows 10 IoT企業版就是完整版本的Windows 10,而且支持軟實時特性,下面依次說明如何啟用Windows IoT企業版系統的軟實時特性,如果開發支持軟實時的應用程序。最后將對比ESM8400 工作在Windows標準模式和軟實時模式下GPIO中斷響應延時情況。
Windows 10 軟實時是 Windows 10 IoT 企業版 版本 21H2 的一項新功能,它允許設備制造商在其設備上引入軟實時功能。此實時行為通過 4 個關鍵設置引入:
1. CPU 隔離:將系統級干擾從隔離的 CPU 遷移出去,減少對用戶實時應用程序的潛在抖動。
2. 獨立 CPU 上的自定義 ISR/DPC 固定:所有硬件中斷都路由到系統和非實時內核,但通過編寫自定義 ISR/DPC 驅動程序,可以將設備特定的中斷路由到實時內核。
3. 互斥體的優先級繼承:此設置可確保執行最高優先級的線程,即使在復雜的多線程場景中也是如此。
4. 最多 16 個 RT 線程優先級別:這使程序員能夠在實時任務間分配資源,以確保首先執行最重要的任務。
在Windows管理員命令提示符下執行以下腳本:
::禁用空閑狀態 powercfg.exe / setacvalueindex SCHEME_CURRENT SUB_PROCESSOR IdleDisable 1 powercfg.exe / setactive SCHEME_CURRENT ::禁用診斷策略服務DPS sc query dps sc stop dps sc config dps start = disabled ::禁用Windows音頻 sc query Audiosrv sc stop Audiosrv sc config Audiosrv start = disabled ::禁用SysMain sc query SysMain sc stop SysMain sc config SysMain start = disabled ::禁用Windows更新 sc query wuauserv sc stop wuauserv sc config wuauserv start = disabled ::禁用線程 DPC reg add "HKLM\System\CurrentControlSet\Control\Session Manager\kernel" / v ThreadDpcEnable / t REG_DWORD / f / d 0
將系統配置為實時性能,需要提供要分配給實時任務的 CPU 核心數,其余部分用于運行系統或標準用戶任務。 必須在 Windows IoT CSP SetRTCores 節點中提供數值,這是專用于實時工作負載的 CPU 核心數,有效數值必須至少為 1 且小于 CPU 中的物理核心數。ESM8400主CPU為4核ARM Cortex-A53,建議將1個核作為實時任務的CPU核心。
需要注意的是,軟實時功能一旦啟用,就只能對分配的CPU核心數進行調整,要完全禁用軟實時只能重裝Windows系統。
1. 下載 psexec 工具。
2. 運行管理命令提示符。
3. 在命令提示符下,在系統帳戶下啟動 PowerShell psexec.exe -s -i powershell.exe
4. 執行以下腳本:
$nameSpaceName = "root\cimv2\mdm\dmmap" $className = "MDM_WindowsIoT_SoftRealTimeProperties01" $obj = Get - CimInstance - Namespace $namespaceName - ClassName $className Add - Type - AssemblyName System.Web Set - CimInstance - CimInstance $obj $obj.SetRTCores = 1 Set - CimInstance - CimInstance $obj
5. 重啟計算機以激活更改。
將設備配置為實現實時性能后,可以將應用程序設置為使用標準 Win32 API 進行實時運行。賦予線程或進程實時性能的唯一因素是線程/進程優先級排名和 CPU 核心關聯。
若要獲取特定線程或進程的實時性能,其優先級應在實時性能范圍內,并且應將其關聯設置為在實時內核上運行。
1. 使用 SetPriorityClass 函數 :將進程的 ProcessPriorityClass 屬性設置為 REALTIME_PRIORITY_CLASS。
2. 使用 SetProcessAffinityMask 函數 將進程設置為僅在為實時應用程序保留的內核上運行
1. 使用 NtSetInformationThread 函數 將線程的 ThreadBasePriority 設置為 16 到 31 之間的值
2. 使用 SetThreadAffinityMask 函數 將線程設置為僅在為實時應用程序保留的內核上運行
中斷響應延時測試方法是:利用ESM8400的GPIO0作為中斷觸發信號,持續翻轉高低電平輸出,GPIO1中斷輸入管腳。利用Windows系統的QPC計數器,在操作GPIO0翻轉之前調用QPC獲取時間戳,在GPIO1中斷響應回調函數中再次獲取時間戳,然后計算兩個時間之間的間隔,以此完成GPIO中斷響應延時的精確測量。硬件上需要在ESM8400評估底板上用跳線器將ESM8400的GPIO0與GPIO1短接進行測試。
參考本文第1節,我們已經可以將ESM8400設置成軟實時模式,參考第2節讓測試程序在分配的實時CPU核心上運行。
下面分別統計了1千萬次Windows工作在標準模式與實時模式時、系統CPU空閑和高負載情況下、GPIO中斷響應延時時間。
可以看到當CPU空閑時,無論Windows是否工作在實時模式,99.99%的中斷響應都小于200us。當CPU負載加重時,Windows標準模式下的中斷響應時間變得極不確定,而實時模式下的中斷響應時間幾乎不受CPU負載的影響,仍然確保99.99%的中斷在200us內得到響應。
下圖對GPIO中斷響應最大延時的測量,更能直觀反映Windows標準模式與實時模式在系統實時性能上的差距。
成都英創信息技術有限公司 028-8618 0660