介绍NoTime模式下的高精度线程

描述

NoTime是基于实时系统构建的.NET控制台开发框架,用户可以使用VisualStudio方便快捷地开发基于.NET语言的实时程序模块,实现最小125微秒的线程调度周期。这样一来,工程师的工作重心就能转移到设备运控及逻辑程序本身,无需关心实时性的实现了。

我们先打开软件自带的案例,案例的功能主要是实现NoTime和Windows之间线程sleep的精度对比,流程是启动线程后,函数中是一个while循环,循环里流程是NoTime中先sleep 125μs,因为Windows最小的单位是1ms,所以Windows这边是sleep 1ms,然后获取微秒级的时钟值,再减去上次获取到的时钟值,并且将差值做最大值计算,将最大值记录下来,后面这一段是手动清除最大值。

下面我们启动案例,看一下结果:可以看到NoTime这边,sleep 125μs的值基本在125~141之间。但是Windows这边的sleep 1ms的精度基本上会随着Windows的调度而随之变大变小,特别是我们打开一些占用CPU比较高的程序的时候。

介绍了NoTime的高精度线程能够实现最小125微秒的线程调度周期。那么如何在Windows与NoTime中部署机器控制程序,才能够在最小改动的情况下,轻松实现性能的提升呢?

以下是我们建议放在NoTime中执行的程序:

1.从业务层来看,NoTime主要适合实现有实时性要求的业务逻辑。对于具有周期重复性、需要快速启停的动作程序,建议放到NoTime里,保障快速稳定运行,例如短距离高速往返运动。

2.安全控制业务以及异常处理逻辑建议放到NoTime里,这样就能保证即便Windows蓝屏后,程序仍然可以正常运行,避免出现设备失控等情况。

3.全局报警信号监控是适合放在NoTime里的,因为NoTime中刷新频率更高,一能更快地捕捉IO触发,二是比较稳定不会受到电脑环境干扰。

4.如果在一段运动中需要IO触发后马上就切换运动指令,而且从IO触发到执行运动指令的时间要求较短,可以将其单独放在NoTime中,避免因Windows波动而导致运动指令切换延后,引起轴实际已经过冲。

5.若有与外设实时通信的需求,可以基于我们的实时通信库实现,支持在NoTime下基于串口及网口与外设通信。

6.对通讯及对运动速度 需求不高的程序可以仍然放在Windows端不用改动,这样就可以在保留现有完整功能的同时,完成迁移工作,减少单次工作量。

因NoTime提供的是一个开发平台,具体业务划分是不受限制的,可以将很小的一个功能函数在NoTime实现,也可以将一个较大的业务模块在NoTime实现。所以对于现有软件要将部分功能迁移到NoTime下来说,软件本身改动不大,Windows下的原有功能也可以保留。

那么如何快速的部署NoTime,让原有程序以最小的改动实现性能提升,以及如何使用NoTime的基本程序结构呢?

大家好,我是ProU软件工程师傅超,我们提供了一个NoTime中的基本程序结构,大致分为运动流程,流程管理,通讯及数据四个部分:

.NET技术

1. 运动流程

首先看到的是我们NoTime程序的入口,在这我们先打开了和ProR的通讯通道,这个是必须要有的,而后是建立共享内存,这个内容我们后面会仔细讲解,Maintask也就是我们主流程,我们转到定义来仔细看一下 。

在这我们初始化了三个数据结构体,调用了子流程1,子流程2的功能函数,目前这两个函数里的内容是一样的 ,可以看到只是简单的将一些数据置为0,下面的子流程3我们用了流程管理的结构,这个“add”就是添加了子流程3里的函数,子流程的函数我们就写具体的运动流程代码或者某功能的实现代码。

2.流程管理

我们转到定义来看下流程管理的结构,这个管理结构在NoTime和Windows下都是通用的,我们把需要执行的子流程的函数做了一个统一管理,可以先看一下注册的动作,我们做了一个简单的封装,可以更加便捷的去添加子流程里的动作。原理就是我们把要执行的函数都先添加到一张列表里,流程启动和停止通过变量去控制整张列表里函数的运行,值得一提的是,列表里函数在运行完后都会有一个反馈状态,有反馈状态我们就可以更好的控制流程的运转,目前是有错误,完成,执行中三种,这个可以后面再自定义补充。

3.通讯

接下来我们看下通讯,在这我们展示的是NoTime和Windows的交互方式,相关功能函数都是放在一个独立的文件里,便于更加快捷的定位和操作。本次案例里采用的是共享内存,回顾一下NoTime程序的入口函数,在这是创建了共享内存,然后在windows下打开共享内存,从而实现NoTime与Windows的交互,若有与外设基于串口或网口通讯需求的也可以放在这一块。

4.数据

我们分成了PublicData和GlobalData两种数据结构体,PublicData里面建立的数据是针对于主流程的以及基本需要的,比如退出指令和循环次数,而GlobalData里面则是针对于子流程的,现在这里面放的就是子流程的一些状态。






审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分