edtext 从右边开始输入 安卓_FreeRTOS 从入门到精通6--详解任务管理下(对比PLC,安卓)...

f78e6c822e0a123c6e2d65f71cc13f9e.png

接着上一讲

奔腾的心:FreeRTOS 从入门到精通5--详解任务管理上​zhuanlan.zhihu.com
c5547872cda1c5eea2322338d5e6a343.png

在这一讲中我将要介绍任务的运行模式,同时与可编程控制器(PLC)以及安卓系统的运行模式进行比较。我在德国读书时专业是嵌入式开发,工作后从事的是西门子PCS7过程系统的编程,业余学习了安卓开发。在学习的过程中,我逐渐意识到单片机,PLC和智能手机本质上上都是一类控制器,很多对于系统开发的理念都是相近互通的,基于此便产生一种想法,想在介绍FreeRTOS的任务管理时,同时对比下PLC和安卓的任务管理机制。

首先,我们先看一下FreeRTOS的任务状态的转化图

9a4df6d179867344974c909b25fd4ba0.png
FreeRTOS的任务状态转化图

其中每个状态的含义如下

  • 阻塞状态(Blocked)当任务等待某个事件或信号的时候处于此状态
  • 挂起状态(Suspended)当任务被vTaskSuspend()函数禁止运行的时候处于此状态
  • 就绪状态(Ready)当任务没有被阻塞或者挂起等待运行的时候处于此状态
  • 运行状态(Running)当任务被内核调度执行的时候处于此状态

在系统初始化所有任务被创建的时候,任务一开始都处于就绪状态(Ready),然后内核调度器开始调度首先选择执行优先级最高的任务,此时被执行的任务处于运行状态(Running)。当任务执行延时命令或者等待某个同步事件的时候便交出了自己的运行权,此时将处于阻塞状态(Blocked)。在任务运行的时候,它可以通过vTaskSuspend()函数将其他任务或者自身挂起进入挂起状态(Suspended)。被挂起的任务只有通过vTaskResume()函数恢复成就绪状态(Ready)。

接下来,让我们看看程序在可编程逻辑器(PLC)中的运行机制。

3fc2938f781bc0bbc831484697aafa89.png
PLC程序的运行机制

在PLC中,一般任务都是写好后顺序执行的。在读取输入阶段,PLC扫描所有输入端子,并将各输入端的通/断状态存入相对应的输入映像寄存器中,刷新输入映像寄存器的值。CPU对用户程序按顺序进行扫描,逐条执行程序指令。在用户程序执行完毕后,PLC将输出映像寄存器中的通/断状态送到输出锁存器中,通过输出端子驱动用户输出设备或带动负载。在这里可以把PLC中运行的任务看作是优先级相同的任务,任务之间不会互相抢占运行的权利,内核调度器类似合作式调度(Co-operative Scheduling)- 按照预设的顺序先后执行控制任务。因为PLC程序的运行都是可预测的,所以PLC更适合对稳定性实时性要求更高的工业领域。

最后,让我们看看安卓系统中任务的运行模式,有个专有名词叫生命周期。在安卓编程中,每个活动(Activity)包含一个画面和对应的程序,这里可以类比成一个任务。活动通过OnCreate()函数创建,通过OnStart()函数启动,当被其他活动抢占之后会通过onPause()函数暂停并通过onStop()函数停止(此时活动将在手机屏幕上消失)。被停止的活动通过OnRestart()函数重新运行,或者通过onDestroy()函数被销毁。

dced65fd72916ac0c233b2185370d61b.png
活动的生命周期

FreeRTOS中任务的运行状态机制和安卓编程中活动的生命周期比较相似。FreeRTOS通过xTaskCreate()函数创建任务,相当于安卓的onCreate()函数;FreeRTOS通过vTaskSuspend()函数挂起任务,相当于安卓的onPause()函数;FreeRTOS通过vTaskResume()函数恢复任务到就绪状态,相当于安卓的onResume()函数;FreeRTOS通过vTaskDelete()函数删除任务,相当于安卓的onDestroy()函数。通过这些相似之处可以看到,学好FreeRTOS对于安卓开发也有裨益,而玩转了嵌入式和安卓编程,融会贯通硬件和软件开发,你将立于紫禁城之巅,成为每个产品经理最缺的那个程序员大神。

FreeRTOS的调度算法及配置

抢占式时间片调度(Prioritized Pre-emptive Scheduling with Time Slicing)

这是比较通用的调度方式,上一篇提到的温度检测系统采用的就是这种方式。内核调度器在每个时间片结束的时候执行一次,选择处于就绪状态的任务中优先级最高的任务置于下一个时间片执行。如果优先级相同的话则交替执行。此时,FreeRTOSConfig.h头文件的设置如下:

configUSE_PREEMPTION(允许抢占) 1

configUSE_TIME_SLICING(采用时间片) 1

抢占式无时间片调度(Prioritized Pre-emptive Scheduling without Time Slicing)

在这种调度方式下,因为没有采取时间片,所以调度器的执行开销会比较小。如果两个任务的优先级相同的话,在抢占式时间片调度下,两个任务会交替运行;然而在抢占式无时间片调度下,当前运行的任务会一直运行,直到它进入阻塞或者挂起状态,另一个相同优先级的任务才会运行。高优先级的任务会抢占低优先任务。此时,FreeRTOSConfig.h头文件的设置如下:

configUSE_PREEMPTION(允许抢占) 1

configUSE_TIME_SLICING(采用时间片) 0

合作式调度(Co-operative Scheduling)

这种调度模式下,当前执行任务将会一直运行,同时高优先级的任务不会抢占低优先级任务。内核调度只会在当前执行任务进入阻塞状态的时候才会执行,选择处于就绪状态的任务中优先级最高的任务进行执行。此时,FreeRTOSConfig.h头文件的设置如下:

configUSE_PREEMPTION(允许抢占) 0

configUSE_TIME_SLICING(采用时间片) 任意

在下一讲中,我将介绍FreeRTOS中队列管理的知识。队列管理(Queue Management)提供了任务之间,任务和中断之间的通讯机制。

奔腾的心:FreeRTOS 从入门到精通7--队列管理​zhuanlan.zhihu.com
2a2629f3b083d8ce85727a1f6e049ddc.png

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

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

相关文章

ps去水印教程_ps去水印教程,详细解析五种去水印的方法

平常我们从一些素材网站下载图片的时候,不免会带上一些水印,使图片的整体美感下降不少,今天教同学们五种去除水印的方法,相信你学习以后,有所收获,遇到喜欢的图片可以把不想要的水印去掉,不过水…

excel 图片转url_最全总结 | 聊聊 Python 办公自动化之 Excel(下)

聊聊 Python 数据处理全家桶(Memca 篇)点击上方“AirPython”,选择“加为星标”第一时间关注 Python 技术干货!1. 前言前面谈到 Python 处理 Excel 文件最常见的两种方式,即:xlrd/xlwt、openpyxl其中,xlrd/xlwt 这一组…

日志中出现乱码_合宙Luat | 乱码搞得一团糟?开源神器帮你轻松修复

鎰熸仼鐩搁亣缇庡ソ鐨勬椂鍏変笌澶у鐩镐即2021锛屾柊骞村揩涔愶紒相信大家在日常生活中,都见过类似上面的字符串。这些看起来不明所以的内容,通常被称作乱码。那么乱码是如何产生的,并且如何修复呢?我们接下来将一步步讲解。1你…

轮播高度_Qt编写自定义控件24-图片轮播控件

一、前言上一篇文章写的广告轮播控件,采用的传统widget堆积设置样式表做的,这次必须要用到更高级的QPainter来绘制了,这个才是最高效的办法,本控件参考雨田哥的轮播控件,经过大规模的改造而成,相比于原来的…

自定义按键_王者荣耀:自定义按键让你的百里守约百发百中

在王者荣耀中,有很多输出炸裂的射手,但是他们普遍手不够长!但是其中就有一位,他不仅手很长,而且打得还很疼!他就是刺客兼射手的——百里守约百里守约,他不是射手,是刺客!…

生成特征_使用gplearn自定义特征自动生成模块

背景:数据科学领域中,数据一直都是主要驱动力,特征工程作为其中重要一环,成为无论是kaggle类的数据竞赛,还是工业界应用中关注的重点。特征工程中有重要的一个环节叫做特征融合,好的特征融合能帮助构造当前…

2台服务器负载均衡后synchronized_一篇有趣的负载均衡算法实现

负载平衡(Load balancing)是一种在多个计算机(网络、CPU、磁盘)之间均匀分配资源,以提高资源利用的技术。使用负载均衡可以最大化服务吞吐量,可能最小化响应时间,同时由于使用负载均衡时,会使用多个服务器节点代单点服务&#xff…

mysql 重装之后_mysql重装之后 复制data

(哇,编程小白的第一篇博客丫,激动)Q one:mysql需要重装,数据该怎么办。方法一:数据表最好是导出成.sql文件,这样才比较安全。方法二:直接copy了data文件:在mysql安装盘下的programda…

vs2010 mysql linq to sql 系列_LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据...

LINQ和 LINQ to SQL 都已经不是一个新事物了,但是我接触的比较晚,本着绝知此事要躬行的态度,决定写这个系列。本文使用的测试环境是VS 2010,和sql server 2005数据库。第一篇 从CUD开始,如何使用LINQ to SQL插入…

redis session 超时时间_Shiro性能优化:解决Session频繁读写问题

点击上方蓝色字体,选择“标星公众号”优质文章,第一时间送达作者 | 张永恒来源 | urlify.cn/YjEZNj背景Shiro 提供了强大的 Session 管理功能,基于 Shiro 实现 Session 共享非常方便,只需要定制一个我们自己的SessionDAO&#x…

mysql too many connections_mysql too many connections 解决方法

1、mysql -u root -p 回车输入密码进入mysql2、show processlist;查看连接数,可以发现有很多连接处于sleep状态,这些其实是暂时没有用的,所以可以kill掉3、show variables like "max_connections";查看最大连接数,应该是…

qt更改类名_Qt编写自定义控件属性设计器

以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用场景需要…

sudo mysql压缩备份解压操作_高效管理文件之压缩及解压缩 .bz2 文件

对文件进行压缩,可以通过使用较少的字节对文件中的数据进行编码来显著地减小文件的大小,并且在跨网络的文件的备份和传送时很有用。 另一方面,解压文件意味着将文件中的数据恢复到初始状态。Linux 中有几个文件压缩和解压缩更具,比…

zygoteinit.java_源码跟踪之启动流程:从ZygoteInit到onCreate

InstrumentationSDK版本名称: PieAPI Level: 28一、源码调用时序图1. Activity的启动流程说明:其中ActivityThread中执行的scheduleTransaction方法在其父类ClientTransactionHandler中,发送了ActivityThread.H.EXECUTE_TRANSACTION,Activity…

小城交通大转型!苏州金龙助力杭州建德公交开新格局

新安江畔,密林丛生,一辆辆绿色巴士穿梭而行,杭州市首款纯电动无站立位公交车正在试运行中。 12月19日,杭州建德,23辆苏州金龙海格牌6米无站立位新能源纯电动公交车正式交付建德市公共交通运输有限公司。自此&#xff…

java虚拟机性能优化_死磕Java虚拟机-性能调优实战篇

Java命令分为如下三种1. 以java - 开头:标准参数2. 以java -X 开头:非标参数3. 以java -XX 开头:性能调优主要用这个开头的参数,但是无法找到相关参数的帮助文档,下面我教大家几个常用的命令-XX:UseSerialGC Seria…

java volatile 原子性_Java中volatile不能保证原子性的证明

Java并发编程之验证volatile不能保证原子性通过系列文章的学习,凯哥已经介绍了volatile的三大特性。1:保证可见性 2:不保证原子性 3:保证顺序。那么怎么来验证可见性呢?本文凯哥(凯哥Java:kaigejava)将通过代码演示来证…

mysql 漏洞如何修复_Mysql漏洞修复方法思路及注意事项

【系统环境】系统环境:Red Hat Enterprise Linux Server release 5.4 (Tikanga) 5.7.16 MySQL Community Server (GPL)【漏洞信息】漏洞信息报告,根据集团第三方软件扫描出对应数据库版本的漏洞信息,可以从DVE号跟当前数据库发布版本时间来判…

Java飞机大战敌机消失_Shoot 飞机大战,功能是子弹打在敌机上, 消失 且在内存中 , 小蜜蜂上同理 Games 游戏 247万源代码下载- www.pudn.com...

文件名称: Shoot下载 收藏√ [5 4 3 2 1 ]所属分类: Games开发工具: Java文件大小: 371 KB上传时间: 2015-12-01下载次数: 0提 供 者: 刘星详细说明:飞机大战,功能是子弹打在敌机上,子弹消失敌机消失且在内存中消失,打在小蜜…

日志分析告警实现java_关于Aborted connection告警日志的分析

前言:有时候,连接MySQL的会话经常会异常退出,错误日志里会看到"Got an error reading communication packets"类型的告警。本篇文章我们一起来讨论下该错误可能的原因以及如何来规避。1.状态变量Aborted_clients和Aborted_connects…