Windows 10 ARM工控主板CAN总线实时性能测试
在常规的Windows系统中支持CAN总线应用,需要外接CAN总线适配器,通常为USB转CAN模块或PCI接口CAN卡。实时性本身是CAN总线的显著特性之一,但由于Windows并非实时操作系统,应用程序容易受到系统CPU负载影响,导致调度周期不确实,这就限制了CAN总线在Windows系统中的应用。
英创公司推出的名片尺寸Windows工控主板ESM8400,其核心是基于NXP的iMX8MP 4核ARM64 MPU,安装Windows 10 IoT企业版操作系统,Windows 10 IoT企业版就是完整版本的Windows 10,而且支持软实时特性。ESM8400自带两路CAN总线接口,结合Windows 10 IoT企业版的软实时特性,可以实现可靠的10ms(甚至更小)循环周期调度,这使得ESM8400可作为软实时IPC直接应用于对控制周期有严格时序要求的控制回路中,以触发状态机的行为,然后通过CAN总线调度较小的硬实时控制单元。
本文将介绍基于安装Windows 10 IoT企业版的ESM8400 CAN总线实时应用的测试目标、测试方法,以及对测试数据进行统计与分析。对于开发实时应用程序的具体编程细节将在单独的一篇文档中进行说明。
1. 测试目标
模拟工业自动化现场实际应用,在ESM8400应用程序中生成10ms的固定循环周期,在每个循环周期内调用CAN接口以250kBits/s波特率连续发送6帧数据。最终统计分析两个时间指标:
1、10ms循环周期在各种软件配置、以及各种CPU负载情况下的实际最大时间是多少。
2、在各种工况下连续发送6帧CAN数据的耗时情况,并统计最长耗时。
2. 测试方法
2.1 硬件环境
ESM8400评估底板直接支持1路CAN总线接口,通过PCAN模块(USB转CAN)连接到计算机。测试时需要注意短接评估底板上的CAN总线匹配电阻跳线器。

2.2 PCAN-View
PCAN-View是PCAN模块对应的Windows应用程序,PCAN-View可以记录接收的CAN数据,同时可记录每帧数据的时间戳,时间戳精度为0.1ms。时间戳由PCAN模块自身标记,不会受测试计算机软件系统调度问题所影响。所以利用接收到的CAN数据时间戳,可以对各项时间指标进行精确的统计。

2.3 测试程序
ESM8400上运行的测试程序利用Windows系统的高精度定时器QPC实现10ms的循环定时,每个循环周期内连续发送6帧CAN数据,测试发送12W帧CAN数据(2W个循环)后程序退出。下面是测试程序的主要代码,关于ESM8400 CAN接口在Windows中的使用细节,将在另一编文档中进行说明。
| CFlexCAN can; flexcan_frame_t frame; volatile BOOLEAN txComplete = TRUE; LARGE_INTEGER frequency; LARGE_INTEGER end, last;
// 设置本进程优先级 // SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); // 将本进程设置为仅在CPU3, CPU4上运行 // SetProcessAffinityMask(GetCurrentProcess(), (1 << 3) | (1 << 2)); // 打开ESM8400 CAN1,波特率设置为250kBit/s can.Open(1, 250000); // 获取QPC的频率 result = QueryPerformanceFrequency(&frequency); // 计算10毫秒对应的QPC计数,减去1是为了补偿可能的调度延迟 LARGE_INTEGER interval = { frequency.QuadPart / 100 - 1 }; QueryPerformanceCounter(&last); end = last; while(1){ // 等待直到达到或超过预定的10毫秒间隔 do { QueryPerformanceCounter(&end); } while ((end.QuadPart - last.QuadPart) < interval.QuadPart); // 更新上一次循环结束的时间 last = end; // 连续发送6帧CAN数据,每帧的CAN ID从1到6 for (int i = 1; i < 7; i++) { frame.mfs_1.id = i; can.Write(&frame); while (!can.txComplete) {}; can.txComplete = FALSE; frame.mfp.mfp_w.dataWord1++; // 此处可进行其它操作,注意代码执行时间不要超过循环定时 // 每个循环发送6帧,发送超过12W帧(2W个循环)后退出程序 if (frame.mfp.mfp_w.dataWord1 > 120010) break; } |
3. 进行测试
3.1 测试项目
将测试程序分别设置为Normal和Realtime优先级类,在CPU空闲和CPU负载75%的情况下,测试程序运行于Windows 10标准模式和软实时环境进行了6个项目的对比测试。
| 测试项目 | CPU负载 | Windows 10 系统模式 | 进程优先级类 |
| 1 | 空闲 | 标准模式 | Normal |
| 2 | 75% | 标准模式 | Normal |
| 3 | 75% | 标准模式 | RealTime |
| 4 | 空闲 | 软实时模式, 3个标准CPU + 1个实时CPU | RealTime |
| 5 | 75% | 软实时模式, 3个标准CPU + 1个实时CPU | RealTime |
| 6 | 75% | 软实时模式, 2个标准CPU + 2个实时CPU | RealTime |
对于测试项目的进一步说明:
1、ESM8400的处理器i.MX8MP有4个CPU核心,在Windows标准模式下,测试程序由系统自动调度在某个CPU上运行。在3+1软实时模式下,应用程序通过SetProcessAffinityMask函数设置当前进程在CPU4(实时核心)上运行,在2+2软实时模式下,通过SetProcessAffinityMask函数设置当前进程在CPU3和CPU4上运行。
2、测试程序进程优先级类由SetPriorityClass系统API配置为NORMAL_PRIORITY_CLASS或REALTIME_PRIORITY_CLASS。
3、测试时利用CPU Stress程序为系统增加75%的高优先级 (HIGH_PRIORITY_CLASS)负载。

4、在启用的Windows 10 软实时的情况下,可以看到在CPU Stress中增加的75%负载,Windows系统分别施加到了CPU1~CPU3上,不占用CPU4资源,这就是Windows IoT企业版的软实时特性之一——CPU隔离技术的体现。(下图中为1个实时核心 + 3个标准核心)

3.2 数据统计与分析
每个测试项目执行2W次循序,得到12W帧、带精度为0.1ms时间戳的CAN数据,将6个测试超过72W帧数据导入Excel。

如前面的测试程序所示,每个循环发送的第1帧CAN数据的ID为1,最后第6帧CAN ID为6,这里利用每一个ID为1的CAN帧时间戳、统计10ms循环的实际最大时间,利用ID为1和6的CAN帧时间戳计算连续发送6帧CAN数据的实际耗时。统计结果如下:
1. 各工况下CAN数据发送的耗时情况
CAN总线在250kBit/s波特率下,理论上每秒最多能传输约2300个CAN标准帧,传输6个标准帧的最短时间理论上需要约2.6ms。分别统计发送6帧数据耗时在3ms内、3ms~6ms之间、6ms~9ms之间以及耗时超过9ms的次数。

从上面的统计结果可以看到:
- Win10标准模式下,如果不对应用进程优先级作任何设置,即使CPU空闲,也有一次发送时间超过9ms,当CPU负载增加时,CAN的发送时间变得很不确实,接近1000次发送时间超过9ms。
- 在Win10标准模式下,无论CPU负载如何,发送耗时都小于等于6ms。唯一在CPU负载75%时,有一次耗时处于6ms~9ms之间,根据原始数据查得这次耗时为6.1ms。
- 在分配2个实时核心的情况下,发送实时性要好于1个实时核心。这是因为测试程序实际上有两个线程:一个主循环线程;一个完成端口线程,用于为发送结果提供异步通知。
- 在Windows标准模式下,将应用程序设置为实时进程,得到了最好的实时性能,这将在稍后的测试总结中进一步说明。
2. 最大时间统计
通过统计发送6帧数据的最长耗时,以及统计10ms周期的实际最大时间更能直观的反应系统在各个工况下的性能表现,和可预测性。

4. 测试总结
在Windows标准模式下,如果不对应用进程优先级做特别设置,程序的调度响应时间将很不确定,在本次测试中,原本10ms的循环定时周期实际上最长测得为160ms。
在Windows标准模式下,提高进程优先级可显著提高响应的实时性,但需要注意的是在标准模式下, Windows线程可以被调度到任意CPU上,Windows的音频驱动、SysMain、DPS等后台服务可能会在某一时间对关键应用程序造成影响,这会增加系统的不可预测性。
在ESM8400上启用Windows的软实时特性,对多核CPU进行隔离应用,将关键应用进程固定在实时CPU上运行,能得到可预测的实时性能,具备在对控制周期有严格时序要求的使用场景中应用的能力。
相关文章:
Windows 10 ARM工控主板CAN总线实时性能测试
在常规的Windows系统中支持CAN总线应用,需要外接CAN总线适配器,通常为USB转CAN模块或PCI接口CAN卡。实时性本身是CAN总线的显著特性之一,但由于Windows并非实时操作系统,应用程序容易受到系统CPU负载影响,导致调度周期…...
如何在不依赖函数调用功能的情况下结合工具与大型语言模型
当大型语言模型(LLM)原生不支持函数调用功能时,如何实现智能工具调度?本文通过自然语言解析结构化输出控制的方法来实现。 GitHub代码地址 核心实现步骤 定义工具函数 使用tool装饰器声明可调用工具: from langcha…...
【Linux AnolisOS】关于Docker的一系列问题。尤其是拉取东西时的网络问题,镜像源问题。
AnolisOS 8中使用Docker部署(全)_anolis安装docker-CSDN博客 从在虚拟机安装龙蜥到安装docker上面这篇文章写的很清晰了,我重点讲述我解决文章里面问题一些的方法。 问题1: docker: Get https://registry-1.docker.io/v2/: net/h…...
【Elasticsearch】Mapping概述
以下是Elasticsearch中提到的关于Mapping的各模块概述: --- 1.Dynamic mapping(动态映射) 动态映射是指Elasticsearch在索引文档时,自动检测字段类型并创建字段映射的过程。当你首次索引一个文档时,Elasticsearch会根…...
GPT-4o悄然升级:能力与个性双突破,AI竞技场再掀波澜
在大模型竞技场中,GPT-4o悄悄发布了全新版本,凭借其卓越的多项能力,迅速超越了DeepSeek-R1,成功登上并列第一的位置。这次更新不仅在数学(第6名)上有所突破,还在创意写作、编程、指令遵循、长文…...
如何选择合适的超参数来训练Bert和TextCNN模型?
选择合适的超参数来训练Bert和TextCNN模型是一个复杂但关键的过程,它会显著影响模型的性能。以下是一些常见的超参数以及选择它们的方法: 1. 与数据处理相关的超参数 最大序列长度(max_length) 含义:指输入到Bert模…...
C# SpinLock 类 使用详解
总目录 前言 SpinLock 是 C# 中一种轻量级的自旋锁,属于 System.Threading 命名空间,专为极短时间锁竞争的高性能场景设计。它通过忙等待(自旋)而非阻塞线程来减少上下文切换开销,适用于锁持有时间极短(如…...
【linux】在 Linux 上部署 DeepSeek-r1:32/70b:解决下载中断问题
【linux】在 Linux 上部署 DeepSeek-r1:32/70b:解决下载中断问题 【承接商业广告,如需商业合作请+v17740568442】 文章目录 【linux】在 Linux 上部署 DeepSeek-r1:32/70b:解决下载中断问题问题描述:解决方法方法一:手动中断并重启下载方法二:使用 Bash 脚本自动化下载在…...
机器学习所需要的数学知识【01】
总览 导数 行列式 偏导数 概理论 凸优化-梯度下降 kkt条件...
4.【线性代数】——矩阵的LU分解
四 矩阵的LU分解 1. AB的逆矩阵2. 转置矩阵3. ALU3.1 2x2矩阵3.2 3x3矩阵3.3 nxn的矩阵分解的次数? 1. AB的逆矩阵 { ( A B ) ( B − 1 A − 1 ) I ( B − 1 A − 1 ) ( A B ) I ⇒ ( A B ) − 1 B − 1 A − 1 \begin{cases} (AB)(B^{-1}A^{-1}) I\\ (B^{-1}A^…...
【清晰教程】本地部署DeepSeek-r1模型
【清晰教程】通过Docker为本地DeepSeek-r1部署WebUI界面-CSDN博客 目录 Ollama 安装Ollama DeepSeek-r1模型 安装DeepSeek-r1模型 Ollama Ollama 是一个开源工具,专注于简化大型语言模型(LLMs)的本地部署和管理。它允许用户在本地计算机…...
Spring Cloud工程搭建
目录 工程搭建 搭建父子工程 创建父工程 Spring Cloud版本 创建子项目-订单服务 声明项⽬依赖 和 项⽬构建插件 创建子项目-商品服务 声明项⽬依赖 和 项⽬构建插件 工程搭建 因为拆分成了微服务,所以要拆分出多个项目,但是IDEA只能一个窗口有一…...
使用Redis实现分布式锁,基于原本单体系统进行业务改造
一、单体系统下,使用锁机制实现秒杀功能,并限制一人一单功能 1.流程图: 2.代码实现: Service public class VoucherOrderServiceImpl extends ServiceImpl<VoucherOrderMapper, VoucherOrder> implements IVoucherOrderSe…...
【MediaTek】 T750 openwrt-23.05编 cannot find dependency libexpat for libmesode
MediaTek T750 T750 采用先进的 7nm 制程,高度集成 5G 调制解调器和四核 Arm CPU,提供较强的功能和配置,设备制造商得以打造精巧的高性能 CPE 产品,如固定无线接入(FWA)路由器和移动热点。 MediaTek T750 平台是一款综合的芯片组,集成了 5G SoC MT6890、12nm 制程…...
CHARMM-GUI EnzyDocker: 一个基于网络的用于酶中多个反应状态的蛋白质 - 配体对接的计算平台
❝ "CHARMM-GUI EnzyDocker for Protein−Ligand Docking of Multiple Reactive States along a Reaction Coordinate in Enzymes"介绍了 CHARMM-GUI EnzyDocker,这是一个基于网络的计算平台,旨在简化和加速 EnzyDock 对接模拟的设置过程&…...
c# 2025/2/17 周一
16. 《表达式,语句详解4》 20 未完。。 表达式,语句详解_4_哔哩哔哩_bilibili...
vite【详解】常用配置 vite.config.js / vite.config.ts
官网 https://cn.vitejs.dev/guide/ vite 常用配置 Vite 配置文件通常是 vite.config.js (使用 CommonJS 语法)或者 vite.config.ts(使用 TypeScript 语法),默认内容为 import { defineConfig } from vite import vue…...
最新智能优化算法: 阿尔法进化(Alpha Evolution,AE)算法求解23个经典函数测试集,MATLAB代码
一、阿尔法进化算法 阿尔法进化(Alpha Evolution,AE)算法是2024年提出的一种新型进化算法,其核心在于通过自适应基向量和随机步长的设计来更新解,从而提高算法的性能。以下是AE算法的主要步骤和特点: 主…...
用于可靠工业通信的5G-TSN集成原型:基于帧复制与消除可靠性的研究
论文标题 中文标题:用于可靠工业通信的5G-TSN集成原型:基于帧复制与消除可靠性的研究 英文标题:5G-TSN Integrated Prototype for Reliable Industrial Communication Using Frame Replication and Elimination for Reliability 作者信息 …...
HaProxy源码安装(Rocky8)
haproxy具有高性能、高可用性、灵活的负载均衡策略和强大的将恐和日志功能,是法国开发者 威利塔罗(Willy Tarreau)在2000年使用C语言开发的一个开源软件,是一款具 备高并发(一万以上)、高性能的TCP和HTTP负载均衡器,支持基于cookie的持久性&a…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
