TwinCAT3 实时内核调度算法

news2024/12/24 3:07:22

前言

TwinCAT3 支持多核心CPU并行运行实时任务,根据官方网站的帮助信息“实时”定义取自DIN44300,而且实时任务的调度算法默认是 RMS算法(速率单调调度算法)

RMS算法

来看一下百度百科的解释:
RMS(单调速率调度算法)是一种静态优先级调度算法,是经典的周期性任务调度算法。 RMS的基本思路是任务的优先级与它的周期表现为单调函数的关系,任务的周期越短,优先级越高;任务的周期越长,优先级越低。如果存在一种基于静态优先级的调度顺序,使得每个任务都能在其期限时间内完成,那么RMS算法总能找到这样的一种可行的统调度方案。
理论证明过程可以参看百度百科上的论述,这里不细说,直接给结论:
1)单核心处理器处理周期性任务时,RMS算法是最优的;
2)RMS算法是抢占式算法,周期越短的任务,优先级越高。
针对第二点,例如对于处理器来说,假定有2个任务,周期分别是 任务A:10 ms,任务B:50ms,那么CPU每50ms就会“中断”一次去执行任务A,A必须确保在10ms内执行完,假如A实际执行仅用2ms,那么剩下的8ms就可以给任务B执行,如果任务B实际执行需要35ms,那么执行完8ms以后,又到了10ms的中断时机,这时候CPU就把任务B挂起,把它的当前状态保存起来,以备后续接着执行任务B,转头去第二次执行任务A,任务A又用了2ms,这时候又空出来8ms来执行任务B,任务B再次执行8ms,CPU被迫中断,到目前为止,任务B总共运行了16ms,任务A运行了4ms,CPU运行了20ms。第三轮抢占再次开始,CPU第三次运行时,任务A占去2ms,任务B占去8ms,10ms时间又到了,CPU再次被中断,此时任务A运行了23=6ms,任务B总共运行了83=24ms,CPU总共运行了103=30ms;第四次抢占开始,任务A运行2ms,任务B运行8ms,CPU运行10ms,然后再次中断,到目前为止,任务A运行了24=8ms,任务B运行了 84=32ms,CPU运行了 104=40ms;第五次抢占开始,任务A运行2ms,任务B运行8ms,CPU运行10ms,任务A总共运行了25=10ms,这10ms是真正被任务A利用的CPU时间,CPU没有空转浪费。任务B运行3ms,这时,任务B总共运行了 32+3=35ms,才算是跑完了完整的“一圈”,期间被任务A多次打断。这时候CPU还剩 10-2-3=5ms空余时间,但是!!!!因为任务B的周期是50ms,所以CPU前四次总共执行了104=40ms,第五次实际跑任务A和任务B又花费了5ms,下一个10ms计时到,任务A的10ms中断和任务B的50ms周期中断一起触发,所以CPU空余时间实际上只有50-45=5ms,第六轮开始…
可以发现,在CPU运行的50ms时间内,任务A的代码被跑了5遍,任务B的代码只跑了1遍。

中断机制

Double-Tick中断

由于TwinCAT3支持多核心运行,衍生出两种核心分配机制即共享核心和独占核心,共享核心由TwinCAT实时调度器(下称 TwinCAT kernel)分配实时任务和Windows系统的占比,默认是 80%,即CPU在预设的实时周期中,其确保80%的CPU运算时间分配给实时任务,Windows系统只使用剩下的20%运算时间,这个值是可调的,如果接触过FreeRTOS这类tiny real-time kernel的人可能会注意到,在FreeRTOS中task的切换需要保存当前正在运行task的上下文,如果没有运行完,下一次排到它的时候,它就可以恢复当时的上下文环境(本质是寄存器中的值)接续运行。在TwinCAT的调度机制中,共享核心也需要在实时任务和非实时任务之前切换,若当前周期内实时任务没有运行完,那么就需要保存实时任务的上下文环境,以备下一周期恢复来接续执行。80%的设定就是保证在共享核心中,Windows系统总能获得20%的时间来执行,这个“切换点”就是中断来控制的,TwinCAT中称之为Double Tick。
下图中,第一个周期内,Double-Tick到来时实时任务还没有运行完,这时就需要保存实时任务的上下文环境,第二个Base Time到来的时候,上一次没有执行完的任务又获得了一段执行时间(绿色和红色的部分),然后才轮到了本次的“读输入-执行代码-写输出”的实时任务。
在这里插入图片描述

Tick中断

Tick中断是用来规划CPU时间片的,例如有两个核心的CPU,其中一个核心运行了PLC Task,该PLC Task的运行周期是10ms,那么每10ms中断一次就是Tick中断在负责。注意这里的Base Time就是10ms,如果在TwinCAT中把 Base Time设为100us,但是PLC Task设为 10ms,那么下图中的Base Time还是10ms,这个是要注意区分的。
在这里插入图片描述
在独占核心的情况下,Double-Tick中断没有存在的价值,因为整个核心被用来跑实时任务,也就是说TwinCAT Real-Time Kernel独占这个核心,Windows操作系统不能使用这个核心来运行了,那么实时任务的调度就变得简单了,如下图所示,这样用户的PLC程序获得了更过的CPU时间,用来跑一些计算量大的程序或者对jitter要求严苛的程序适合使用独占核心的这种配置方法,jitter会在Double-Tick的时候产生,由于和用户程序相关这个jitter存在“抖动”。
在这里插入图片描述

超时机制

对于用户而言,预测自己程序的执行时间非常困难,尤其是目前多核心的CPU,结合不同的核心分配机制,这个时间是不确定的,那么一旦用户程序写的非常复杂,在一个周期内并不能运行完毕该怎么办,TwinCAT的处理方法是放到下一个周期中继续运行,这样实际上挤压了下一个周期中程序的执行时间,导致后面每个周期都不能来运行本属于自己这个周期的程序,反而得腾挪时间来跑上一次积压下来的程序,这样的话,实际上几轮周期下来,对应关系就乱起来了,而且程序实际跑了几圈并不能通过周期运行圈数来一一对应,这种情况其实是不允许的。
如下图所示,CPU跑了4圈,但程序实际上只执行了3次,这种情况就会导致超时计数器累加。
在这里插入图片描述
一个正常运行的程序,超时计数器不应累计,应当始终为零,如下图所示
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1642734.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探究Android的多分辨率支持以及各种类型图标尺寸大小

术语和概念 屏幕尺寸 屏幕的物理尺寸,以屏幕的对角线长度作为依据(比如 2.8寸, 3.5寸)。 简而言之, Android把所有的屏幕尺寸简化为三大类:大,正常,和小。 程序可以针对这三种尺寸…

大厂案例 - 通用的三方接口调用方案设计(中)

文章目录 Pre阿里云华为云【AK和SK生成方案】最佳实践1. 创建API密钥管理系统2. 生成AK和SK3. 存储和管理AK和SK4. 提供API密钥分发机制5. 安全性6. 其他注意事项 DB Model Design表结构Next考虑其他建议 API接口设计指导1. 使用POST作为接口请求方式2. 客户端IP白名单3. 单个接…

ROS服务器通信

目录 一、角色 二、流程 注意 三、例子描述 四、srv文件 编译配置文件 vscode配置 五、Server.cpp编写例子 编写CMakeList 六、观察server的效果 七、Client编写例子 编写CMakeList 八、观察Client的结果 九、Client优化(动态输入) 了解argc…

【网络编程下】五种网络IO模型

目录 前言 一.I/O基本概念 1.同步和异步 2.阻塞和非阻塞 二.五种网络I/O模型 1.阻塞I/O模型 2.非阻塞式I/O模型 ​编辑 3.多路复用 4.信号驱动式I/O模型 5. 异步I/O模型 三.五种I/O模型比较​编辑 六.I/O代码示例 1. 阻塞IO 2.非阻塞I/O 3.多路复用 (1)select …

STM32 F103C8T6学习笔记16:1.3寸OLED的驱动显示日历

今天尝试使用STM32 F103C8T6驱动显示 1.3寸的OLED,显示数字、字符串、汉字、图片等 本质与0.96寸的OLED是完全相同的原理: 而且经过我的研究发现: 1.3寸大小的OLED并未比0.96寸的有更多的显示像素点数来显示,也是128*64的像素点数显示: 也…

2024-5-4

今日流水账: 上午: 之前的那道 kernel pwn 已经成功构造了 dirty pipe 原语(:但是不知道为啥修改 /bin/busybox 一直报段错误,悲,后面在探索探索(:这里简单尝试写下 /etc/passwd&…

【架构系列】RabbitMQ应用场景及在实际项目中如何搭建可靠的RabbitMQ架构体系

作者:后端小肥肠 创作不易,未经允许禁止转载。 1. 前言 RabbitMQ,作为一款高性能、可靠的消息队列软件,已经成为许多企业和开发团队的首选之一。它的灵活性和可扩展性使得它适用于各种应用场景,从简单的任务队列到复杂的分布式系统…

eNSP-动态路由(ospf协议)

一、拓扑结构搭建 二、主机配置 pc1 pc2 三、路由器配置 1.AR2配置 <Huawei>sys #进入系统视图 [Huawei]int g0/0/0 #进入接口 [Huawei-GigabitEthernet0/0/0]ip address 192.168.0.2 24 #设置ip地址 [Huawei-GigabitEthernet0/0/0]q #返回上一级 [Huawei]int g0/0/1 …

asp.net结课作业中遇到的问题解决2

目录 1、如何实现评论交流的界面 2、如果想要将文字添加到数据库中&#xff0c;而不是乱码&#xff0c;该怎么修改 3、如果想要添加的数据已经存在于数据库&#xff0c;就不允许添加了&#xff0c;该如何实现 4、想要实现某个模块下有好几个小的功能该如何实现 5、想要实现…

Unity 性能优化之数据面板(Statistics)(一)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、unity 统计数据面板&#xff08;Statistics&#xff09;1.Audio属性2.Graphics属性 二、什么是Draw Call&#xff1f;三、Unity3D stats也可以通过代…

大型语言模型的新挑战:AMR语义表示的神秘力量

DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享&#xff0c;与你一起了解前沿科技知识&#xff01; 引言&#xff1a;AMR在大型语言模型中的作用 在自然语言处理&#xff08;NLP&#xff09;的领域中&#xff0c;抽象意义表示&…

【Android学习】自定义文本框和输入监听

实现功能 以上代码可实现功能&#xff1a; 1 自定义文本框样式 2. 文本框触发形式转变 3. 文本框输入长度监听&#xff0c;达到最大长度关闭软键盘 4. password框触发检测phone框内容 1. drawable自定义形状 我创建了editor_focus.xml 和 editor_unfocus.xml&#xff0c;两者仅…

性能优化(一):ArrayList还是LinkedList?

引言 集合作为一种存储数据的容器&#xff0c;是我们日常开发中使用最频繁的对象类型之一。JDK为开发者提供了一系列的集合类型&#xff0c;这些集合类型使用不同的数据结构来实现。因此&#xff0c;不同的集合类型&#xff0c;使用场景也不同。 很多同学在面试的时候&#x…

3.2Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3框架-企业级应用- Vuex

Vuex简介 Vuex概述 Vuex是一个专门为Vue.js应用程序开发的状态管理模式, 它采用集中式存储管理所有组件的公共状态, 并以相应的规 则保证状态以一种可预测的方式发生变化. 试想这样的场景, 比如一个Vue的根实例下面有一个根组件名为App.vue, 它下面有两个子组件A.vue和B.vu…

巧记英语单词

页面 在输入框中填写英语单词的谐音 这样的话就进行了一次英语单词的记忆练习。 页面代码 <% layout(/layouts/default.html, {title: 英语单词管理, libs: [dataGrid]}){ %> <div class"main-content"><div class"box box-main">&l…

如何为 Nestjs 编写单元测试和 E2E 测试

前言 最近在给一个 nestjs 项目写单元测试&#xff08;Unit Testing&#xff09;和 e2e 测试&#xff08;End-to-End Testing&#xff0c;端到端测试&#xff0c;简称 e2e 测试&#xff09;&#xff0c;这是我第一次给后端项目写测试&#xff0c;发现和之前给前端项目写测试还…

练习题(2024/5/4)

1 二叉树的所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;["1->2->5","…

学习Rust的第26天:Rust中的cp

在本文中复刻了 cp 实用程序的功能&#xff0c;我想默认使其递归&#xff0c;因为每次我想复制时都输入 -R 文件夹都会觉得有点重复&#xff0c;本文代码将与前文代码保持相似&#xff0c;我们只会更改程序的核心功能和一些变量名称以匹配用例 Pseudo Code 伪代码 function cop…

STM32G474 CMAKE VSCODE 开发环境搭建

本篇博文尝试搭建 stm32g474 的开发环境 一. 工具安装 1. 关于 MinGW、OpenOCD、Zadig 这些工具的下载和安装见 JlinkOpenOCDSTM32 Vscode 下载和调试环境搭建_vscode openocd stm32 jlink-CSDN博客 2. 导出一个 STM32 的 CMAKE 工程&#xff0c;这里略过。 3. 安装 ninja …

C++:继承-继承权限

在C中&#xff0c;类的权限分为公有、私有和保护三种。这些权限控制了类的成员&#xff08;数据成员和成员函数&#xff09;对外部代码的可见性和访问性。 公有&#xff08;public&#xff09;权限&#xff1a; 在公有权限下声明的成员可以被类的外部代码直接访问&#xff1b;公…