Windows工控主板实时性能测试

 2024-12-5 17:53:49     作者:刘乾坤     联系作者    


与典型的实时操作系统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中断响应延时情况。


1.     启用Windows IoT企业版 软实时特性

Windows 10 软实时是 Windows 10 IoT 企业版 版本 21H2 的一项新功能,它允许设备制造商在其设备上引入软实时功能。此实时行为通过 4 个关键设置引入:

1.    CPU 隔离:将系统级干扰从隔离的 CPU 迁移出去,减少对用户实时应用程序的潜在抖动。

2.    独立 CPU 上的自定义 ISR/DPC 固定:所有硬件中断都路由到系统和非实时内核,但通过编写自定义 ISR/DPC 驱动程序,可以将设备特定的中断路由到实时内核。

3.    互斥体的优先级继承:此设置可确保执行最高优先级的线程,即使在复杂的多线程场景中也是如此。

4.    最多 16 个 RT 线程优先级别:这使程序员能够在实时任务间分配资源,以确保首先执行最重要的任务。

  1.1    启用Windows IoT企业版 软实时特性

在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

  1.2    为实时应用分配CPU核心

将系统配置为实时性能,需要提供要分配给实时任务的 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.    重启计算机以激活更改。


2.     开发软实时应用程序

将设备配置为实现实时性能后,可以将应用程序设置为使用标准 Win32 API 进行实时运行。赋予线程或进程实时性能的唯一因素是线程/进程优先级排名和 CPU 核心关联。

若要获取特定线程或进程的实时性能,其优先级应在实时性能范围内,并且应将其关联设置为在实时内核上运行。


  配置实时进程

1.    使用 SetPriorityClass 函数 :将进程的 ProcessPriorityClass 属性设置为 REALTIME_PRIORITY_CLASS。

2.    使用 SetProcessAffinityMask 函数 将进程设置为仅在为实时应用程序保留的内核上运行


  配置实时线程

1.    使用 NtSetInformationThread 函数 将线程的 ThreadBasePriority 设置为 16 到 31 之间的值

2.    使用 SetThreadAffinityMask 函数 将线程设置为仅在为实时应用程序保留的内核上运行


3.     GPIO中断响应延时测试

中断响应延时测试方法是:利用ESM8400的GPIO0作为中断触发信号,持续翻转高低电平输出,GPIO1中断输入管脚。利用Windows系统的QPC计数器,在操作GPIO0翻转之前调用QPC获取时间戳,在GPIO1中断响应回调函数中再次获取时间戳,然后计算两个时间之间的间隔,以此完成GPIO中断响应延时的精确测量。硬件上需要在ESM8400评估底板上用跳线器将ESM8400的GPIO0与GPIO1短接进行测试。

w1.png

参考本文第1节,我们已经可以将ESM8400设置成软实时模式,参考第2节让测试程序在分配的实时CPU核心上运行。

下面分别统计了1千万次Windows工作在标准模式与实时模式时、系统CPU空闲和高负载情况下、GPIO中断响应延时时间。

w2.png

可以看到当CPU空闲时,无论Windows是否工作在实时模式,99.99%的中断响应都小于200us。当CPU负载加重时,Windows标准模式下的中断响应时间变得极不确定,而实时模式下的中断响应时间几乎不受CPU负载的影响,仍然确保99.99%的中断在200us内得到响应。

下图对GPIO中断响应最大延时的测量,更能直观反映Windows标准模式与实时模式在系统实时性能上的差距。

w3.png