嵌入式实时操作系统的任务管理及任务调度
- 格式:docx
- 大小:109.61 KB
- 文档页数:7
控制系统中的实时操作系统与嵌入式系统在控制系统中,实时操作系统(RTOS)和嵌入式系统(Embedded System)起着至关重要的作用。
它们通过协同工作,为各种应用提供高效的控制和管理。
本文将探讨实时操作系统和嵌入式系统的特点、功能以及它们在控制系统中的应用。
一、实时操作系统的特点和功能实时操作系统是一种专用的操作系统,其最主要的特点是能够满足严格的时间约束和实时要求。
相比于一般的操作系统,实时操作系统需要具备以下几个关键特点:1. 高实时性:实时操作系统需要能够及时响应外部事件的发生,以满足对系统实时性的要求。
它能够在给定的时间范围内完成任务,并保证任务的及时性。
2. 可预测性:实时操作系统需要能够在确定的时间范围内执行任务,并提供可预测的性能。
这对于需要对事件进行精确控制的应用非常重要,如航空航天、医疗设备等。
3. 可靠性:实时操作系统需要具备高度的可靠性,能够保证任务的正确执行并防止系统崩溃或死锁的发生。
对于一些关键应用,如核能、交通信号灯等,系统的可靠性尤为重要。
4. 多任务处理:实时操作系统能够同时处理多个任务,确保任务之间的优先级和时序关系的正确性。
它能够根据不同的任务要求,分配系统资源,实现任务的协调和调度。
5. 低延迟:实时操作系统需要具备较低的延迟,以保证任务的实时性和响应性。
它能够快速地处理任务请求,并及时地提供响应。
二、嵌入式系统的特点和功能嵌入式系统是一种集成度高、功耗低、功能强大的特殊计算机系统。
它通常用于特定的应用领域,并且嵌入到其他设备中以实现特定的功能。
嵌入式系统具备以下几个关键特点:1. 紧凑性:嵌入式系统通常具有小体积、低成本和低功耗的特点。
它需要满足在有限的硬件资源和空间条件下实现功能的需求。
2. 可靠性:嵌入式系统需要具备高可靠性,能够在恶劣的环境条件下正常工作。
它需要具备抗干扰能力,以防止外部因素对系统的影响。
3. 实时性:嵌入式系统通常需要满足实时性的要求,能够即时响应外部事件。
嵌入式操作系统FreeRTOS的原理与实现-新品速递在嵌入式领域中,嵌入式实时操作系统正得到越来越广泛的应用。
采用嵌入式实时操作系统(RTOS)可以更合理、更有效地利用CPU的资源,简化应用软件的设计,缩短系统开发时间,更好地保证系统的实时性和可靠性。
由于RTOS需占用一定的系统资源(尤其是RAM资源),只有μC/OS-II、embOS、salvo、FreeRTOS等少数实时操作系统能在小RAM单片机上运行。
相对于C/OS-II、embOS等商业操作系统,FreeRTOS操作系统是完全的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行,其版本为2.6版。
1 FreeRTOS操作系统功能作为一个轻量级的操作系统,FreeRTOS提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。
FreeRTOS内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于就绪态的、优先级的任务先运行。
FreeRT0S内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用时间。
FreeRTOS的内核可根据用户需要设置为可剥夺型内核或不可剥夺型内核。
当FreeRTOS被设置为可剥夺型内核时,处于就绪态的高优先级任务能剥夺低优先级任务的CPU使用权,这样可保证系统满足实时性的要求;当FreeRTOS被设置为不可剥夺型内核时,处于就绪态的高优先级任务只有等当前运行任务主动释放CPU的使用权后才能获得运行,这样可提高CPU的运行效率。
2 FreeRTOS操作系统的原理与实现2. 1任务调度机制的实现任务调度机制是嵌入式实时操作系统的一个重要概念,也是其技术。
对于可剥夺型内核,优先级高的任务一旦就绪就能剥夺优先级较低任务的CPU 使用权,提高了系统的实时响应能力。
rtthread任务调度原理rt-thread是一个开源的实时操作系统,广泛应用于嵌入式系统中。
它具有高效的任务调度机制,能够有效地管理和调度系统中的各个任务。
本文将从任务调度的原理和实现方式两个方面介绍rt-thread任务调度的工作原理。
一、任务调度的原理rt-thread采用的是抢占式的优先级调度算法。
此算法通过为每个任务分配优先级,并根据优先级来决定任务的执行顺序。
具体来说,rt-thread将任务划分为两种类型:线程和实时线程。
线程是最基本的任务单元,通过线程来实现系统中不同功能的并发执行。
每个线程都有自己的优先级,优先级高的线程在系统空闲时会被优先执行。
线程的调度是通过rt-thread内核中的调度器来完成的。
实时线程是一种特殊的线程,它具有固定的周期和执行时间要求。
为了满足实时线程的要求,rt-thread引入了时钟滴答机制,以固定的时间间隔来调度实时线程的执行。
时钟滴答机制是rt-thread 的核心功能之一,它通过硬件定时器来实现,确保实时线程能够按时执行。
任务调度的过程是在时钟滴答中完成的。
每当时钟滴答到来时,调度器会根据当前任务的状态和优先级来选择下一个要执行的任务,并进行上下文切换。
上下文切换是指将当前任务的上下文保存起来,并恢复下一个任务的上下文,使其能够继续执行。
二、任务调度的实现方式rt-thread任务调度的实现方式主要包括任务控制块、就绪队列和调度器三个部分。
任务控制块(TCB)是rt-thread中用于管理任务的数据结构,它包含了任务的状态、优先级、堆栈等信息。
每个任务都有一个对应的任务控制块,通过任务控制块可以对任务进行管理和调度。
就绪队列是用来保存所有处于就绪状态的任务的数据结构,它按照任务的优先级进行排序。
当任务进入就绪状态时,会被插入到就绪队列中的适当位置。
调度器会从就绪队列中选择优先级最高的任务进行执行。
调度器是rt-thread中的核心组件,它负责任务的调度和上下文切换。
嵌入式系统中的实时调度与优化算法随着科技的不断发展,嵌入式系统可以越来越广泛地应用于各个领域,比如工业自动化、智能家居等等。
在嵌入式系统中,实时性是非常重要的特征之一,也是实现嵌入式系统的关键。
因此,在设计嵌入式系统时,我们需要考虑如何实现实时调度和优化算法。
实时调度实时调度是指在嵌入式系统中合理分配系统资源,以保证任务在规定的时间内完成。
在实时调度中,我们需要考虑处理器负载、任务优先级、任务执行时间等因素,以优化系统性能。
有几种常见的实时调度算法。
1.简单循环调度算法简单循环调度算法是一种较为基础的调度算法,其思想是按照一定的顺序,周期性地执行任务,可以满足一些简单的嵌入式系统的需求。
但是,这种算法的执行效率较低,难以应对复杂的嵌入式系统。
2.静态优先级调度算法静态优先级调度算法是根据任务的优先级,确定任务执行的顺序,执行优先级高的任务,并只在其完成后执行优先级低的任务。
这种调度算法可以确保高优先级的任务及时地完成,但是可能会因为某个任务的优先级过高而导致系统崩溃。
3.动态优先级调度算法动态优先级调度算法根据任务的实际情况来确定任务的优先级,可以在保证较高优先级任务得到优先执行的同时,避免了静态优先级调度算法可能出现的崩溃问题。
但是,这种算法执行效率较低,可能会出现任务饥饿现象。
优化算法为了使嵌入式系统的性能得到优化,我们需要使用一些优化算法来降低系统的开销。
优化算法在嵌入式系统中有着广泛的应用,在不同的领域中,我们需要采用不同的优化算法。
1.舍弃法舍弃法就是抽取一部分有用的数据,而不考虑其他数据。
在许多嵌入式系统中,我们需要对传感器的数据进行处理。
通过采用舍弃法,我们可以在降低系统开销的同时,更好地处理数据。
2.最小生成树算法最小生成树算法是一种求解无向连通图的最小生成树的方法。
在图像处理领域中,我们经常需要对图片进行最小生成树算法,以达到更好的图片压缩效果。
3.贪心算法贪心算法是一种选择当前最优解的算法。
⼏种嵌⼊式实时操作系统的分析与⽐较VxWorks、µClinux、µC/OS-II和eCos是4种性能优良并被⼴泛应⽤的实时操作系统。
本⽂通过对这4种操作系统的主要性能进⾏分析与⽐较,归纳出它们的选型依据和适⽤领域。
1 4种操作系统的介绍(1)VxWorksVxWorks是美国WindRiver公司的产品,是⽬前嵌⼊式系统领域中应⽤很⼴泛,市场占有率⽐较⾼的嵌⼊式操作系统。
VxWorks实时操作系统由400多个相对独⽴、短⼩精悍的⽬标模块组成,⽤户可根据需要选择适当的模块来裁剪和配置系统;提供基于优先级的任务调度、任务间同步与通信、中断处理、定时器和内存管理等功能,内建符合POSIX(可移植操作系统接⼝)规范的内存管理,以及多处理器控制程序;并且具有简明易懂的⽤户接⼝,在核⼼⽅⾯甚⾄町以微缩到8 KB。
(2) µC/OS-IIµC/OS-II是在µC-OS的基础上发展起来的,是美国嵌⼊式系统专家Jean J.Labrosse⽤C语⾔编写的⼀个结构⼩巧、抢占式的多任务实时内核。
µC/OS-II 能管理64个任务,并提供任务调度与管理、内存管理、任务间同步与通信、时间管理和中断服务等功能,具有执⾏效率⾼、占⽤空间⼩、实时性能优良和可扩展性强等特点。
(3)µClinuxµClinux是⼀种优秀的嵌⼊式Linux版本,其全称为micro-control Linux,从字⾯意思看是指微控制Linux。
同标准的Linux相⽐,µClinux的内核⾮常⼩,但是它仍然继承了Linux操作系统的主要特性,包括良好的稳定性和移植性、强⼤的⽹络功能、出⾊的⽂件系统⽀持、标准丰富的API,以及TCP/IP⽹络协议等。
因为没有MMU内存管理单元,所以其多任务的实现需要⼀定技巧。
(4)eCoseCos(embedded Configurable operating system),即嵌⼊式可配置操作系统。
rtx51 tiny原理RTX51 Tiny是一款基于RTX51内核的微型嵌入式操作系统。
本文将介绍RTX51 Tiny的原理及其应用。
一、RTX51 Tiny的原理RTX51 Tiny是由Keil公司开发的一款嵌入式实时操作系统。
它的设计目标是在51系列单片机上提供简单、灵活、高效的多任务管理和资源调度功能。
RTX51 Tiny使用了一种基于优先级的抢占式调度算法,能够实现多个任务之间的快速切换,从而提高系统的响应速度和并发处理能力。
RTX51 Tiny的核心是一个可重入的内核,它提供了任务管理、时间管理、资源管理和通信机制等基本功能。
任务管理器负责任务的创建、删除和切换,时间管理器实现了系统时钟的管理和定时器的功能,资源管理器用于管理共享资源的访问,通信机制则提供了任务间的消息传递和事件通知功能。
RTX51 Tiny的任务是用户定义的函数,可以是独立的任务或者中断服务函数。
每个任务都有一个优先级,优先级高的任务会优先执行。
当系统启动时,RTX51 Tiny会自动创建一个空闲任务,它的优先级最低,用于处理系统空闲时的任务。
RTX51 Tiny采用了一种事件驱动的方式进行任务调度。
当一个任务完成了它的工作或者等待某个事件发生时,它会主动让出CPU,将控制权交给调度器。
调度器会从就绪队列中选择优先级最高的任务执行,直到它完成了工作或者时间片用完。
RTX51 Tiny还提供了一些常用的服务函数,如延时函数、信号量函数、邮箱函数等,方便用户进行任务的同步与通信。
用户可以通过这些服务函数来实现任务间的协作和数据交换。
二、RTX51 Tiny的应用RTX51 Tiny广泛应用于各种嵌入式系统中,特别是对实时性要求较高的应用场景。
以下是一些常见的应用领域:1. 工业自动化:RTX51 Tiny可以用于控制系统中的任务调度和数据处理,实现复杂的自动控制算法和实时监控功能。
2. 智能家居:RTX51 Tiny可以用于家庭自动化系统中的任务管理和设备控制,实现智能家居的各种功能,如安防、照明和能源管理等。
嵌入式操作系统原理一、嵌入式操作系统的概念嵌入式操作系统是一种运行在嵌入式系统上的操作系统,其主要功能是管理和控制硬件资源,提供给应用程序一个良好的运行环境。
嵌入式操作系统通常包含任务调度、内存管理、设备驱动、文件系统等功能模块,以提供各种系统服务。
与一般计算机操作系统相比,嵌入式操作系统有着更高的实时性和可靠性需求。
二、嵌入式操作系统的特点1.高度实时性:嵌入式设备通常需要对外部环境做出及时响应,因此嵌入式操作系统需要具备高度实时性,能够准确响应和处理各种事件。
2.可嵌入性:嵌入式操作系统需要能够方便地移植到不同的硬件平台上,因此具备可嵌入性非常重要。
3.低功耗:嵌入式设备通常具有较低的功耗要求,嵌入式操作系统需要通过各种优化手段来降低系统的功耗。
4.小尺寸:嵌入式设备通常具有较小的存储容量,嵌入式操作系统需要具备小尺寸的特点,以节约存储空间。
三、嵌入式操作系统的功能模块1.任务调度:嵌入式操作系统需要具备任务调度的功能,能够合理分配系统资源,保证系统的实时性和可靠性。
常见的任务调度算法有优先级调度、轮询调度和抢占式调度等。
2.内存管理:嵌入式操作系统需要具备内存管理的功能,能够有效地管理系统的内存资源,包括动态内存分配和回收、内存保护和内存映射等。
3.设备驱动:嵌入式操作系统需要具备设备驱动的功能,能够管理和控制各种外部设备,包括传感器、执行器、通信接口等。
4.文件系统:嵌入式操作系统通常会包含文件系统的功能,能够提供对外部存储设备的读写访问,方便应用程序管理数据和配置文件。
5.网络支持:嵌入式操作系统通常需要具备网络支持的功能,能够提供网络通信的能力,包括TCP/IP协议栈、网络接口驱动等。
四、嵌入式操作系统的工作原理1.初始化:系统启动时,嵌入式操作系统会对硬件进行初始化,并设置系统的各种参数和配置,准备好系统运行的环境。
2.任务调度:嵌入式操作系统会根据任务的优先级和调度算法,决定将哪个任务分配给CPU执行,并根据实时性要求进行任务切换和调度。
ucosiii操作系统工作原理ucosiii是一个实时嵌入式操作系统,它的工作原理是基于任务管理和时间管理。
本文将从任务管理、时间管理等方面详细介绍ucosiii的工作原理。
一、任务管理ucosiii通过任务管理来实现多任务的并行执行。
在ucosiii中,每个任务都是一个独立的执行单元,具有自己的任务控制块(TCB)。
任务控制块中保存了任务的状态、堆栈指针和优先级等信息。
ucosiii通过任务调度器来决定哪个任务获得执行权。
在ucosiii中,任务的优先级决定了任务的执行顺序。
优先级高的任务具有更高的执行优先级,优先级低的任务具有较低的执行优先级。
ucosiii采用优先级抢占式调度算法,当一个优先级更高的任务就绪时,ucosiii会暂停当前任务的执行,切换到优先级更高的任务执行。
二、时间管理ucosiii通过时间管理来实现任务的调度和时间的划分。
在ucosiii 中,时间被划分为时间片和时间延迟。
时间片是指每个任务获得的最大执行时间。
当一个任务的时间片用完后,ucosiii会暂停该任务的执行,切换到下一个任务执行。
时间片的大小可以根据任务的需求和系统性能进行调整。
时间延迟是指任务在执行过程中需要暂停一段时间。
ucosiii提供了延迟函数来实现时间延迟。
任务可以使用延迟函数来暂停自己的执行,等待一段时间后再继续执行。
ucosiii通过定时器来实现延迟函数的功能。
三、任务间通信ucosiii提供了一系列的同步和通信机制来实现任务间的数据传递和协作。
其中最常用的机制是信号量和消息队列。
信号量是一种计数器,用来控制对共享资源的访问。
任务可以使用信号量来同步对共享资源的访问,避免资源竞争和冲突。
消息队列是一种用来存储和传递消息的缓冲区。
任务可以使用消息队列来发送和接收消息,实现任务间的数据传递和通信。
ucosiii还提供了其他的同步和通信机制,如互斥锁、事件标志组和邮箱等,可以根据具体的需求选择合适的机制。
rtos常用任务调度方法RTOS(Real-Time Operating System)即实时操作系统,是一种专门用于实时应用的操作系统。
在RTOS中,任务调度是其核心功能之一,它负责管理和调度不同任务的执行顺序和优先级。
下面将介绍几种常用的任务调度方法。
1. 优先级调度优先级调度是RTOS中最基本的任务调度方法。
每个任务都会被分配一个优先级,优先级高的任务会先被调度执行。
当多个任务具有相同优先级时,采用循环调度的方式,依次轮流执行每个任务。
2. 时间片轮转调度时间片轮转调度是一种公平的任务调度方法。
每个任务被分配一个固定的时间片,当时间片用完后,该任务会被挂起,然后下一个任务开始执行,以此类推。
当所有任务都执行完一轮后,再次按顺序执行,直到所有任务完成。
3. 最短剩余时间优先调度最短剩余时间优先调度是一种动态优先级调度方法。
每个任务的优先级根据其剩余执行时间来确定,剩余执行时间越短,优先级越高。
当一个任务抢占CPU执行后,如果有更短剩余执行时间的任务到达,则会被优先执行。
4. 最早截止时间优先调度最早截止时间优先调度是一种静态优先级调度方法。
每个任务的优先级根据其截止时间来确定,截止时间越早,优先级越高。
当多个任务同时就绪时,选择具有最早截止时间的任务先执行。
5. 抢占式调度抢占式调度是一种任务调度方式,允许任务在任意时间点抢占CPU。
当一个优先级更高的任务到达时,它可以立即抢占正在执行的任务,然后执行自己。
这种调度方式可以保证高优先级任务的及时响应,但也会增加任务切换的开销。
6. 合作式调度合作式调度是一种任务调度方式,任务必须主动释放CPU控制权,才能让其他任务执行。
每个任务都有一个执行时间限制,如果任务未能在规定时间内主动放弃CPU,则会导致系统无响应。
合作式调度适用于资源有限的嵌入式系统,可以避免任务抢占带来的开销。
以上是几种常用的RTOS任务调度方法。
每种方法都有其适用的场景和优缺点。
基于嵌入式实时操作系统的程序设计基于嵌入式实时操作系统的程序设计【序言】嵌入式实时操作系统(RTOS)是一种为嵌入式系统开发而设计的操作系统。
它专注于处理实时任务和事件,并提供了严格的时间限制保证。
在嵌入式系统中,实时性和可靠性是至关重要的,因此选择适当的RTOS和进行有效的程序设计非常重要。
本文将从简单到复杂,从概述RTOS的基本概念开始,逐渐深入探讨基于嵌入式实时操作系统的程序设计。
【目录】1. 嵌入式实时操作系统简介1.1 实时操作系统基本概念1.2 嵌入式实时操作系统的特点1.3 常见的嵌入式实时操作系统2. 嵌入式实时操作系统的程序设计2.1 任务和任务管理2.1.1 任务的创建与销毁2.1.2 任务的调度与优先级2.2 中断处理2.2.1 中断的优先级与响应2.2.2 中断服务程序的编写2.3 事件驱动编程2.3.1 事件的定义与触发2.3.2 事件处理函数的设计2.4 资源管理与同步2.4.1 临界区的保护2.4.2 信号量的应用2.5 定时器和时钟管理2.5.1 定时器的配置与使用2.5.2 时钟的同步与校准3. 基于嵌入式实时操作系统的案例研究 3.1 防护装置控制系统3.1.1 系统需求分析3.1.2 RTOS的选择与配置3.1.3 系统任务设计与实现3.2 机器人导航系统3.2.1 功能需求分析3.2.2 RTOS的适配与调试3.2.3 程序架构与模块设计【正文】1. 嵌入式实时操作系统简介1.1 实时操作系统基本概念嵌入式实时操作系统(RTOS)是一种专注于处理实时任务和事件的操作系统。
实时任务被分为两类:硬实时任务和软实时任务。
硬实时任务对任务的响应时间和执行时间有严格的要求,而软实时任务对实时性要求相对较弱。
RTOS通过提供时间限制和调度算法来保证任务的及时执行。
1.2 嵌入式实时操作系统的特点嵌入式实时操作系统具有以下几个特点:高实时性、可靠性、低功耗、良好的可伸缩性和可配置性等。
1、嵌入式实时操作系统简介 1.1英文名Embedded Real-time Operation System,简写为RTOS。 1.2.1定义:当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。(注:在工业控制、军事设备、航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。我们常常说的嵌入式操作系统都是嵌入式实时操作系统。比如μC/OS-II、eCOS和Linux。故对嵌入式实时操作系统的理解应该建立在对嵌入式系统的理解之上加入对响应时间的要求。)
1.2.2 IEEE定义:嵌入式系统是“用于控制、监视或者辅助操作机器和设备的装置”。 1.2.3一般定义:以应用为中心、以计算机技术为基础、软件硬件可裁剪、功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
1 . 3分类:VxWorks,uC/OS-Ⅱ,uClinux,eCos,RTXC等。 2、嵌入式实时操作系统的任务管理 2.1 任务管理:是嵌入式实时操作系统的核心和灵魂,决定了操作系统的实时性能。它通常包含优先级设置、多任务调度机制和时间确定性等部分。
2.1.1 优先级设置:嵌入式操作系统支持多任务,每个任务都具有优先级,任务越重要,赋予的优先级应越高。优先级的设置分为静态优先级和动态优先级两种。静态优先级指的是每个任务在运行前都被赋予一个优先级,而且这个优先级在系统运行期间是不能改变的;动态优先级则是指每个任务的优先级(特别是应用程序的优先级)在系统运行时可以动态地改变。
2.1.2 多任务调度机制:任务调度主要是协调任务对计算机系统资源的争夺使用。对系统资源非常匮乏的嵌入式系统来说,任务调度尤为重要,它直接影响到系统的实时性能。通常,多任务调度机制分为基于优先级抢占式调度和时间片轮转调度。(1)基于优先级抢占式调度:系统中每个任务都有一个优先级,内核总是将CPU分配给处于就绪态的优先级最高的任务运行。如果系统发现就绪队列中有比当前运行任务更高的优先级任务,就把当前运行任务置于就绪队列中,调入高优先级任务运行。系统采用优先级抢占方式进行调度,可以保证重要的突发事件及时得到处理。(2)时间片轮转调度:让优先级相同的处于就绪状态的任务按时间片使用CPU,以防止同优先级的某一任务长时间独占CPU。在一般情况下,嵌入式实时操作系统采用基于优先级抢占式调度与时间片轮转调度相结合的调度机制。
2.1.3 时间的可确定性:嵌入式实时操作系统甬数调用与服务的执行时间应具有可确定性。系统服务的执行时间不依赖于应用程序任务的多少。基于此特征,系统完成某个确定任务的时间是可预测的。
2 . 2 任务管理机制:在内核的设计过程中,最先应考虑的是任务的状态以及迁移时序,然后根据此状态设计相应的队列,如就绪队列、等待队列等。内核时钟也依赖任务的状态。可以看出,任务管理实现的核心和基础是任务状态和迁移时序。
2.2.1任务状态:在多任务状态中,任务要参与资源的竞争,只有在所需资源得到满足的情况下才能得到执行。然而,任务拥有的资源情况是不断变化的,这将导致任务状态也表现出不断变化的特性。不同的实时内核实现方式对状态的定义不尽相同,但都包括以下三种基本状态:(1)等待:任务在等待I/O完成或者等待某事件的发生;(2)就绪:任务已经得到需要运行的资源,并等待获得处理器资源;(3)执行:任务获得处理器和其他所有需要的资源,相关代码正在被运行。在单处理器系统中,任何时候只有一个任务处于运行状态。如果没有任何任务需要运行,那么内核会运行一个空闲任务。任何一个可以执行的任务都必须处于就绪状态,实时内核会从所有就绪的任务中,使用合适的调度策略选择一个运行。当一个任务请求I/O操作,或者等待信号量将会处于等待状态。
2.2.2任务状态转移:在一定条件下,任务会在不同的状态之间进行转化,称为任务状态迁移,如图1所示。
图1 任务状态迁移图
图2 实际实现的任务状态转换图 图2在描述任务状态迁移的同时,也描述了任务的生存周期,任务的生命期从新建态时开始直到结束态时结束。在给定的时刻,任务的状态一定处在这六种状态之一。新建状态是指任务被创建的过程,在这个过程中主要工作有:为任务分配TCB和栈空间以及其他资源。当任务创建完成以后,任务就具备运行的能力了,与此同时,任务进入就绪状态,并等待调度器为它分配运行的机会。当任务得到运行的机会,任务开始执行。处于运行态的任务会在任意时刻由运行态进入休眠态、就绪态或结束状态。其中进入休眠态是任务的主动过程,这主要是任务调用了内核提供的休眠函数,任务在休眠状态,如果没有其他任务唤醒它,它将永远休眠下去直到系统关闭,这种方式也可用于任务同步。等待状态主要由两种原因引起,一种是等待某事件的发生,如等待信号量;第二种为任务主动等待多少个tick。最后,任务可以将自己杀死进入结束态。
图3 任务状态迁移示意图 图3描述了三个任务状态迁移过程。图中包含三个任务和一个调度程序。调度程序确定下一个需要投入运行的任务,因此调度程序本身也占用一定的处理时间。
3、嵌入式实时操作系统的任务调度 3. 1 任务调度:调度是内核的主要职责之一,调度的主要任务就是要决定该轮到哪个任务运行。多数实时内核采用基于优先级调度的算法。基于优先级的调度算法是指,每个任务根据重要程度被赋予一定的优先级,CPU总是让处在就绪态的优先级最高的任务运行。然而,究竟何时让高优先级任务掌握CPU的使用权,有两种不同的情况,这取决于内核的类型(是可剥夺型的还是可剥夺型内核)。当调度程序决定新的任务获得CPU的使用权时,这时内核将执行任务切换。任务切换过程为:首先保存当前任务的上下文,即CPU寄存器中的全部内容。这些内容可以保存在任务的自己的栈中,也可以保存在TCB中。然后,将需要运行的任务的上下文从该任务的栈中重新装入CPU的寄存器,并开始运行。任务切换过程增加了应用程序的额外负荷。CPU的内部寄存器越多,额外负荷就越重。
3. 2 调度算法 3.2.1时间片轮转调度算法:当两个或两个以上任务有同样优先级,内核允许一个任务运行事先确定的一段时间,该段时间叫做时间片,然后切换给另一个任务。内核在满足以下条件时,把CPU控制权交给下一个就绪态的任务:①当前任务运行的时间片到期; ②当前任务在时间片还没结束时已经完成了。 3.2.2 基于优先级的调度算法:每个任务都赋予优先级。任务越重要,赋予的优先级就越高。优先级的分配方式可分为静态分配和动态分配的方式。静态优先级是指应用程序执行过程中诸任务的优先级不变。在静态优先级系统中,各个任务以及它们的时间约束在程序编译时是已知的。动态优先级指应用程序执行过程中,任务的优先级是可变的。
Linux采取的调度策略结合了这几种调度方案。在Linux系统中,调度算法最基本的一类就是基于优先级的调度。优先级高的任务先运行,相同优先级的任务按照轮转方式进行调度。Linux也实现了基于动态优先级的调度方法。一开始,利用静态优先级的方法设置任务的优先级,然而它允许调度程序根据需要来提升、降低优先级。
3. 3 调度器实现:在整个任务管理中,任务调度无疑是系统的核心,任务调度通常由内核中的调度器实现。调度器的实现与任务运行状态迁移,任务队列有密切的联系,可以说任务运行状态迁移和任务队列决定了调度器的实现。调度器的主要作用是在就绪队列中选择优先级最高的任务运行,如果优先级最高的任务不止一个,则选择队头的任务运行。虽然整个调度器的功能可以用上面的几句话概括,但调度器的实现远远没有那么简单,主要困难来源下面的原因:①.确定调度器运行的时机;②.中断处理程序完了后,是执行当前任务,还是马上调度;③.调度器的性能;④.调度中伴随着任务上下文的切换,尤其对处理器架构有关的上下文,应该设计良好的接口以便移植。
对于实时系统来说,中断处理程序执行完毕后,应该马上执行调度,这是因为中断常常伴随着有新的任务处于就绪队列中,在这些任务中可能会有高优先级的任务就绪,所以在实时内核中要求必须支持在中断后马上进行任务调度。不管是在实时系统,还是在其他系统中,调度器性能显得非常重要,常常要求调度器的时间复杂度至少应该为线性,当然常数是最好的。对于不同的处理器架构,其提供的寄存器,状态寄存器都有很大的区别,调度器应该留出良好的接口给不同的处理器,以便以后方便移植。
在实现调度器时,基本上考虑了上面的几个基本问题。根据任务状态迁移、内核队列等方面的内容,在byCore中实现了一个叫scheduler( )的调度程序。在scheduler( )中调用几个与硬件相关的函数,这几个函数主要用于实现任务硬件上下文的切换,这部分代码用汇编完成,并且与处理器有关。图4描述了scheduler( )的算法流程图。
图4 scheduler( )的算法流程图 该调度程序的算法非常简单,首先,在允许调度的情况下,如果有高优先级任务就绪,则进行任务切换。任务切换会发生在两种处理器模式下,一种是处理器处于正常的运行态,另一种发生在中断态中。因此,内核使用两组函数分别处理这两种情况。在两种处理器状态下都有“启动新任务”和“新旧任务切换”函数接口实现最后的任务切换工作,这两组函数与处理器有关,并由汇编实现。“启动新任务”的主要功能是将任务的初始上下文复制给处理器的各个寄存器,这包括通用寄存器、堆栈指针寄存器、状态寄存器和指令指针寄存器等。这些初始值在新任务创建时被初始化。启动新任务发生的时机有两种情况,第一种情况是内核初始化完毕后,启动第一个任务;第二种情况为任务主动结束后,当前任务指针被置位NULL