Windows工控主板实时性能测试

        与典型的实时操作系统RT-LinuxWinCEVxWorks等相比,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管理员命令提示符下执行以下脚本:

::禁用空闲状态

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

  2.2为实时应用分配CPU核心

        将系统配置为实时性能,需要提供要分配给实时任务的 CPU 核心数,其余部分用于运行系统或标准用户任务。 必须在 Windows IoT CSP SetRTCores 节点中提供数值,这是专用于实时工作负载的 CPU 核心数,有效数值必须至少为 1 且小于 CPU 中的物理核心数。ESM8400CPU4ARM 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短接进行测试。

ESM8400开发评估底板

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

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

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

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

                    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值