与典型的实时操作系统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