嵌入式基础知识-系统调度

news2024/11/27 12:34:25

系统调度是操作系统重要功能,在嵌入式开发,也要了解系统调度的基本原理。对于嵌入式Linux开发,一般使用多线程和多进程开发,对于运行RTOS的嵌入式系统,一般使用多任务开发。这些线程、进程、任务的调度,有许多相似之处。

1 进程的三种状态

  • 执行态(Run):进程占用CPU资源,对于单核处理器,任一时刻只能有一个进行处于执行态
  • 就绪态(Ready):进程本身具备运行条件,但由于处理机的个数少于可运行进行从个数,暂未运行,等待处理机资源
  • 等待态(Wait):也称挂起态(Suspended)、阻塞态、封锁态(Blocked)、睡眠态(Sleep)。该状态时,进行不具备运行条件,即使分给它处理机也不能运行。

  • (a):某个运行条件不能满足(如等待资源)
  • (b):等待条件消失(如等待的资源已经获得满足)
  • ©:就绪队列中的进程获得CPU的使用权
  • (d):进程资源放弃CPU使用权,或被强制剥夺CPU使用权

2 进程切换

进程切换是指,操作系统为了控制进程的执行,必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行,也称为任务切换,或上下文切换。

或者说,进程切换就是从正在运行的进程中收回处理器,再使待运行的进程占用处理器。

结合上面介绍的进程三种状态,有如下分析:

  • 当一个进程从运行态变成了阻塞态或就绪态,或完成工作被撤销,则该进程不再占用CPU,操作系统会进行进程调度,从就绪队列中重新选择一个进程执行
  • 当一个进程从就绪态变成运行态,则意味着操作系统将之前运行的进行切换,当前的进行开始占用CPU
  • 当一个进程从阻塞态变成就绪态,则该进程只是进入就绪队列,不会引起进程调度

3 AUTOSAR任务状态

AUTOSAR(Automotive Open System Architecture),中文是“汽车开放系统架构”,是一家致力于制定汽车电子软件标准的联盟.

AUTOSAR中定义的任务有两个类别:

  • 基础任务:只有运行、阻塞、就绪三个状态。
  • 扩展任务:在基础任务的基础上,多了一个等待状态。

各任务状态的特点如下:

  • 运行态:在任何一个时间点只有一个任务处于运行状态
  • 就绪态:所有任务都要转换为就绪态后才能转换为运行态,调度器决定哪一个就绪的任务将是下一个执行的任务
  • 阻塞态:处于阻塞态的任务是被动的,可以被激活
  • 等待态:处于等待态的任务将不能继续执行,它将等待至少一个事件发生

  • (a) 触发:一个新任务被设置成就绪状态
  • (b) 启动:一个就绪任务被调度器选择去执行
  • © 被抢占:调度器决定去执行另一任务,使得运行态任务进行就绪态
  • (d) 挂起:运行态任务通过调用系统服务使其转为阻塞态
  • (e) 等待:通过一个系统服务引起状态转换到等待态,等待任务等待一个事件,以能够继续操作
  • (f) 激活:至少一个任务等待的事件发生

4 RTOS任务切换

RTOS(Real Time Operating System),实时操作系统,指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统。

RTOS属于多任务系统,与进程切换的思想类似,多个任务也会进行任务的调度与上下文切换。

任务上下文是任务控制块(TCB)的组成部分,上下文切换由RTOS内部完成,并且上下切换时间是影响RTOS性能的重要指标。

下图为FreeRTOS的任务调度示意图。

  • 1 任务创建完成后进入就绪态,表明任务已准备就绪,随时可以运行,只等待调度器进行调度。
  • 2 发生任务切换时,就绪列表中最高优先级的任务被执行,从而进入运行态。
  • 3 有更高优先级任务创建或者恢复后,会发生任务调度。
  • 4 正在运行的任务发生阻塞(挂起、延时、读信号量等待)时,该任务会从就绪列表中删除,任务状态由运行态变成阻塞态,然后发生任务切换,运行就绪列表中当前最高优先级任务。
  • 5 阻塞的任务被恢复后(任务恢复、延时时间超时、读信号量超时或读到信号量等),此时被恢复的任务会被加入就绪列表;如果此时被恢复任务的优先级高于正在运行任务的优先级,则会发生任务切换,将该任务将再次转换任务状态,由就绪态变成运行态。
  • 6、7、8 任务可以通过调用vTaskSuspend() API 函数都可以将处于任何状态的任务挂起,被挂起的任务得不到CPU的使用权,也不会参与调度,除非它从挂起态中解除。
  • 9 把一个挂起状态的任 务恢复的唯一途径就是调用vTaskResume() 或vTaskResumeFromISR() API 函数,如果此时被恢复任务的优先级高于正在运行任务的优先级,则会发生任务切换,将该任务将再次转换任务状态,由就绪态变成运行态。

5 总结

本篇介绍了系统调度的基础知识,包括进程的三种基本状态,进程切换,AUTOSAR与RTOS的任务切换基础知识。

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

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

相关文章

RS232转Profinet网关怎么设置

大家好,今天我要给大家带来一个很有意思的案例分享。你们猜猜,这回我们要用远创智控的一款神奇的网关YC-RSPN-002做什么呢?没错,我们要把一台扫码枪设备通过这个RS232转PROFINET网关,接入到一台西门子S7-1200PLC的Prof…

在这个高度自动化的时代,为什么自动化测试取代不了手功测试?

在这个高度自动化的时代,为什么自动化测试取代不了手功测试?06:1101自动化测试和手工测试的概念 自动化测试和手工测试都是软件测试的两种基本方法。 自动化测试是基于脚本或工具自动执行测试用例的过程。测试人员可以使用自动化测试工具来编写测试脚本…

【美团面试】软件测试面试题

一、设计登录界面测试用例 功能测试(Function test) 0. 什么都不输入,点击提交按钮,看提示信息。(非空检查) 1.输入正确的用户名和密码,点击提交按钮,验证是否能正确登录。(正常输入&#xff0…

C语言 替换gets函数

目录 替换gets函数gets()用处gets()的危险之处gets()的几种替代方法一、用%c循环输入直到遇到换行结束二、用getchar()循环输入直到遇到换行结束三、scanf的另一种用法四、c中的getline()方法五、解决方案使用fgets代替 替换gets函数 gets()用处 gets从标准输入设备读字符串函…

noSQL的小练习

目录 Redis: 1、 string类型数据的命令操作: 2、 list类型数据的命令操作: 3、 hash类型数据的命令操作: MongoDB: 1. 创建一个数据库 名字grade 2. 数据库中创建一个集合名字 class 3. 集合中插入若…

Redis分片集群有什么作用?怎样读取和存储信息

分片集群主要解决的是,海量数据存储的问题,集群中有多个master,每个master保存不同数据,并且还可以给每个master设置多个slave节点,就可以继续增大集群的高并发能力。同时每个master之间通过ping监测彼此健康状态&…

Selenium中如何抓取网络请求响应及WebSocket信息

目录 获取Chrome性能日志 获取请求及响应信息 我们在使用Selenium测试Web或Electronjs/Cef框架应用时,有时候操作一个元素需要判断是否发送了请求以及请求的参数是否正确 我们可以通过,开启Chrome的性能日志来然后配合driver.get_log("performan…

qgis添加地理地图书签,快速定位到想要的位置

我们打开qgis软件,一般这个功能区域默认在左侧的中间位置,如图: 如果没有的话,我们需要调出来,在软件上方的菜单栏的空白处,右键显示面板调试框,勾选空间书签管理器面板,即可&…

6.3.4 利用Wireshark进行协议分析(四)----ARP协议解析

6.3.4 利用Wireshark进行协议分析(四)----ARP协议解析 我们知道对于单跳网络内部的数据传输,使用的是网络接口层的技术,比如以太网技术,以太网将报文数据封装在数据帧中进行传送,帧头指明发送方网卡的地址…

初学者必看!PLC转型C#上位机编程学习路线和方法

一.通过线上学习C#,机器视觉,运动控制卡,工程案例,我迈向工控软件开发的转型之路 大家好,我是华山编程培训中心的学员——李工,今天分享下我是如何从电气工程师成功转型上位机开发的经历,希望我…

【10】STM32·HAL库开发-MAP文件解析 | STM32启动过程

目录 1,MAP文件浅析(了解)1.1MAP文件概念和作用1.2MAP文件组成1.3MAP文件实操 2.STM32启动过程(了解)2.1STM32启动模式(F1/F4/F7/H7)(也称自举模式)2.1.1STM32启动模式&a…

MybatisPLus3-Activerecord

不用注入数据层对象&#xff0c;就可以实现对数据的访问和操作 具体步骤 1.实体类继承Model<实体类名> 2.mapper接口继承BaseMapper<类名> 3.通过实例化实体对象&#xff0c;就可以通过对象调用CRUD的方法 增 删除/修改/查找的方式都和上面一样

《TCP IP网络编程》第六章

《TCP IP网络编程》第六章&#xff1a;基于 UDP 的服务端/客户端 UDP 套接字的特点&#xff1a; 通过寄信来说明 UDP 的工作原理&#xff0c;这是讲解 UDP 时使用的传统示例&#xff0c;它与 UDP 的特点完全相同。寄信前应先在信封上填好寄信人和收信人的地址&#xff0c;之后…

力扣142. 环形链表 II

题目 给定一个链表的头节点head&#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回null。 链接&#xff1a;142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 题解 方法一&#xff1a;设置两个指针&#xff0c;一个指针指向链表头结点&#…

重生之我要学C++第一课

时隔三月&#xff0c;继C语言之后&#xff0c;博主学成C归来&#xff0c;欲重开博客&#xff0c;与诸位分享经验&#xff0c;共同学习&#xff0c;今天就开始我们的c第一课——入门篇。 既然要开始学习c&#xff0c;就要了解 什么是c&#xff1a; C 语言是结构化和模块化的语言…

Vue2 ➔ Vue3 都做了哪些改变?

不是吧&#xff0c;兄弟&#xff0c;Vue3 都出来多久了&#xff0c;你还对这个感兴趣&#xff0c;说&#xff01;是不是没好好卷&#xff1f;&#x1f60f; 俺也一样 &#x1f602;&#xff0c;Vue3 出来之后只是简单了解了一下&#xff0c;然后还是转头一直在写 Vue2。当然&a…

如何升级iOS17/iPadOS17公测版?iOS17公测版升级教程

苹果官方发布了iOS 17/iPadOS 17系统首个公测版更新&#xff0c;其版本号及更新内容与iOS 17 beta 3一致&#xff0c;版本号为21A5277j。 对于想升级iOS 17/iPadOS 17 公测版的用户&#xff0c;可以参考本教程进行操作。 升级注意事项&#xff1a; 1. 为防止意外情况&#xf…

AlignPS中的TOIM损失

本文介绍了CVPR2021行人重识别领域中一篇名为AlignPS论文中的TOIM损失函数 论文链接&#xff1a;https://arxiv.org/abs/2109.00211 代码链接&#xff1a;GitHub - daodaofr/AlignPS: Code for CVPR 2021 paper: Anchor-Free Person Search TOIM TOIM Loss OIM Loss Trip…

【STM32零基础入门教程02】STM32环境获取及搭建

(14条消息) 【STM32零基础入门教程01】STM32入门基础知识_小超电子笔记的博客-CSDN博客 工欲善其事必先利其器&#xff0c;在上一章了解完STM32的一些基础知识之后&#xff0c;我们需要对使用的环境进行获取和安装。 一、MDK&#xff08;KEIL&#xff09;的获取 Keil是一种…

CCF 202209-2 何以包邮? (01背包动态规划练习)

一、先温习一下01背包问题 有N件物品和一个容量为V的背包。第i件物品的体积是c[i]&#xff0c;价值是w[i]。求解将哪些物品装入背包可使价值总和最大。 条件汇总 -------- 背包限制容量&#xff1a;Z 此时背包容量&#xff1a;C 物品&#xff1a;1 , i ... …