Nucleus PLUS任务调度

概述

Nucleus Plus内核(Kernel)的主要目的是管理实时任务的竞争运行(共享CPU),为应用提供各种便利,快速响应外部事件。Nucleus Plus的系统结构如图1所示,可以看出线程控制是整个内核的核心,通过邮箱、队列、管道来实现任务之间的通信,通过信号量、事件组和信号实现任务间的同步。

线程控制部件用来管理实时任务和高级中断服务的执行,它是Nucleus 嵌入式实时操作系统最核心的部分。为了控制执行过程,任务通常被分配一个优先级。任务优先级的范围从0到255,优先级0的优先权最高。除非抢占标示位被置为无效,否则低优先级的任务将被高优先级就绪的任务抢占。为保证对外部事件的实时性响应,Nucleus设计了高级中断服务HISR,它的优先级范围从0到2,其中优先级0的级别最高。

任务调度线程就负责抢占式实时任务和HISR的调度管理。每个用户应用由多个任务组成,一个任务就是具有特定目的的半独立程序片段,任务处于五种状态之一--运行、就绪、挂起、终止、完成,如表1所示。任务具有不同的优先级,高优先级任务能够抢占低优先级任务,同优先级任务按照进入”就绪状态“的顺序调度,优先级从0-255递减。

表1 Nucleus任务的五种状态


状态意义


运行Executing


任务当前正在被CPU执行。


就绪Ready


任务就绪,但是另一个任务当前正在运行。


挂起Suspended


任务因为服务等待需求而体眠。当需求满足时,任务变为就绪状态。默认情况下,新创建的任务都处于


终止Terminated


任务被终止。当任务处于这种状态时,它将不再执行直到它被复位。


完成Finished


任务完成了.从入口函数中退出。任务处于这种状态时,它将不再执行直到受到复位。

(一)任务调度算法

Nucleus调度程序用来决定是否要进行任务切换,如果需要切换的话,切换到哪个进程等。Nucleus实时操作系统的任务调度算法非常简单,它包括时间片轮转算法和轮询算法。

时间片轮转算法是将相同优先级的任务都分配相同的时间片,当时间片用完后再转到下一个任务,轮流执行直到这个优先级的所有任务全部执行完毕,然后再转到下一个优先级。轮询算法是在本优先级内的所有任务按照就绪时间的先后 顺序执行,当这个优先级的全部任务都执行完毕后,再执行下一个优先级的任务。

再者,Nucleus实时操作系统具有可抢占性,进程调度的依据就是按照优先级从高到低顺序进行调度。当低优先级任务在运行时,高优先级任务就绪准备执行时则会抢占执行,迫使低优先级任务挂起。

Nucleus的调度时机包括:

(1)进程状态转换的时刻,即进程终止、进程睡眠;

(2)可运行队列中新增加一个进程时;

(3)当前进程的时间片用完;

(4)进程从系统调用返回到用户态;

(5)内核处理完中断后,进程返回到用户态。

(二)Nucleus PLUS任务管理

1,主要任务控制结构

Nucleus PLUS每一个任务都有一个控制结构体称为线程控制块Thread Control Block(TCB),任务支持动态的创建和删除,TC通过一个双向链表TCD_Created_Tasks_List管理所有的任务,全局变量TCD_Total_Tasks表示已创建的总任务数。

TCD_Priority_List是一个大小为256的TCB指针数组TC_TCB (*TCD_Priority_List)[256](数组大小与Nucleus PLUS优先级数相同),数组元素按任务优先级索引。数组中的每个元素都是某个优先级就绪任务链表的头。若某元素为空则表明那个优先级没有就绪任务。 对于每个优先级的就绪任务列表,TCB是以双向列表的形式存储。即Nucleus PLUS维护一个指针数组来调度不同优先级的任务链表。

图2 TCD_Priority_List

2,任务优先级管理

Nucleus在进行任务切换时需要计算最高优先级,为了快速的计算就绪任务中最高的优先级,Nucleus PLUS引入了一种优先级分组+查找表机制。

2.1 TCD_Priority_Groups

任务的优先级从0到255,0的优先级别最高,255的优先级别最低。256个优先级分成32组,每组对应8个级别。例如第0组对应优先级0~7、第1组对应 8~15、...。用32位整型变量TCD_Priority_Groups的每一位标示优先级组是否有任务进入就绪状态,某位为1表示改组至少有一个任务就绪。

图3 TCD_Priority_Groups

2.2 TCD_Sub_Priority_Groups[]

子优先级数组TCD_Sub_Priority_Groups[32]标示一个组内具体的8个优先级,数组元素为8位整型,每一位对应组内一个优先级。如TCD_Sub_Priority_Groups[0]表示第0组(优先级0-7)任务的就绪状态,第0位为1表明优先级0的任务就绪、第7位为1表明优先级7的任务就绪。

图4 TCD_Sub_Priority_Groups

若任务的优先级为Tc_priority,
该任务的子优先级掩码为:tc_sub_priority=1<<(tc_priority&7)。
该任务的优先级组掩码为:tc_priority_group=1<<((tc_priority)>>3)。

2.3 TCD_Lowest_Set_Bit[]

TCD_Lowest_Set_Bit[]是一个查找表(元素预先已计算出),该表是8位整型数据的序号和数据8个位中第一个为1的位的位置(从高往底数)的,例如TCD_Lowest_Set_Bit[n]=value,n指8位整型数的值(就是序号),value指的是8个位中第一个为1的位置(从低往高数)。如Unsigned Char 7的二进制是0000 0111,第一个为1的位位0,value=0,TCD_Lowest_Set_Bit[7] = 0。

如此便可以求得表TCD_Lowest_Set_Bit[256]。举例,8位整型数中位0为1的数据包括1、3、5、7、9、11、13、15,...,253,255,所以有:

TCD_Lowest_Set_Bit[1]= 0,
TCD_Lowest_Set_Bit[3]= 0,
TCD_Lowest_Set_Bit[5]= 0,
TCD_Lowest_Set_Bit[7]= 0,
...,
TCD_Lowest_Set_Bit[253]= 0,
TCD_Lowest_Set_Bit[255]= 0。  

2.4 任务创建和优先级管理的基本过程

任务优先级管理全局变量

UNSIGNED        TCD_Priority_Groups;
DATA_ELEMENT    TCD_Sub_Priority_Groups[TC_MAX_GROUPS];
UNSIGNED_CHAR  TCD_Lowest_Set_Bit[256] = {0,
 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0,
 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1,
 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0,
 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2,
 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0,
 1, 0, 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1,
 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3,
 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0,
 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1,
 0, 2, 0, 1, 0};
INT             TCD_Highest_Priority;//就绪状态任务的最高优先级  

i.创建一个task时(tcc.c)--TCC_Create_Task funtion

extern UNSIGNED         TCD_Priority_Groups;
extern DATA_ELEMENT     TCD_Sub_Priority_Groups[TC_MAX_GROUPS];
extern UNSIGNED_CHAR    TCD_Lowest_Set_Bit[];
extern INT              TCD_Highest_Priority;
task -> tc_priority = priority;
task -> tc_priority_head = &(TCD_Priority_List[priority]);
task -> tc_sub_priority = (DATA_ELEMENT) (1 << (priority & 7));//组内子优先级计算,0-7
priority =  priority >> 3;//优先级组计算,有32个组
task -> tc_priority_group = ((UNSIGNED) 1) << priority;//优先级组响应组标示位置1
task -> tc_sub_priority_ptr = &(TCD_Sub_Priority_Groups[priority]);//指向子优先级起始  

ii. 恢复运行一个task时(tcc.c)--TCC_Resume_Task fuction

TCD_Priority_Groups = TCD_Priority_Groups | (task -> tc_priority_group);
//组号保存到全局变量
*(task -> tc_sub_priority_ptr) = (*(task -> tc_sub_priority_ptr)) | task -> tc_sub_priority;
//组内值保存到全局变量   

iii.获取当前最高优先级(tcc.c)

if (TCD_Priority_Groups & TC_HIGHEST_MASK)
      index =  0;
else if (TCD_Priority_Groups & TC_NEXT_HIGHEST_MASK)
  index =  8;
else if (TCD_Priority_Groups & TC_NEXT_LOWEST_MASK)
  index =  16;
else
  index =  24;
  index =  index + TCD_Lowest_Set_Bit[(INT)((TCD_Priority_Groups >> index) & TC_HIGHEST_MASK)];//获取组号中1的最低排位,取值范围0~31
  temp =  TCD_Sub_Priority_Groups[index];//与priority_group对应,有32个Sub_Priority_Groups,通过index查找到相应的Sub_Priority_Groups
  TCD_Highest_Priority = (index << 3) + TCD_Lowest_Set_Bit[temp];//获取到实际的最高优先级  

获取到实际的最高优先级后,将最高优先级的任务挂入Tcd_priority_list[]、完成调度后,该任务位会被清空,接着再次循环获取下一个任务优先级。

Nucleus PLUS任务调度

时间: 2024-10-24 14:35:27

Nucleus PLUS任务调度的相关文章

嵌入式实时操作系统Nucleus PLUS综述

近些年来,随着嵌入式系统飞速的发展.嵌入式实时操作系统广泛地应用在制造工业.过程控制.通讯.仪器仪表.汽车.船舶.航空航天.军事.装备.消费类产 品等方面. Nucleus PLUS 是为实时嵌入式应用而设计的一个抢先式多任务操作系统内核,其95%的代码是用ANSIC写成的.因此很便于移植并可以支持大多数类型的处理器. 又因Nucleus PLUS源码开放.开发/移植方便.功能模块丰富.易于裁剪而获得广大的应用. 本专栏系列介绍了Nucleus PLUS,包含Nucleus系统架构.启动过程.任

Nucleus PLUS系统架构和组件

(一)组件和软件组件方法学 1,软件组件(Software Component)的定义 从一般意义上来说,组件(Component)是系统中可以明确辨识的组成部分,一个不透明的功能实现体.软件开发中,组件是对数据和方法的简单封装,它具有约定式规范的接口.组件具有面向对象的特征,具有功能独立性.高度的可重用性.与语言和平台无关性等特点.软件组件是软件系统中具有一定意义的.相对独立的构成部分,是一个通过规定的接口提供一组服务代码的执行单元,这个执行单元的特点是高内聚.低偶合.组件的接口和组件的实现相

Nucleus PLUS应用系统示例

这个Nucleus PLUS系统应用示例包括application_initialization和六个任务,任务在application_initialization中创建.这个示例系统体现了Nucleus PLUS的任务调度和执行过程.任务间通信和同步(信号量.事件组). Application_Initialize位于29-70行.示例系统的所有系统对象(任务.队列.信号量.事件组)都在该函数中创建.在板级初始化程序(INT_ Initialize)结束后,系统开始调用操作系统初始化程序(I

Nucleus PLUS简介

近些年来,随着嵌入式系统飞速的发展,嵌入式实时操作系统广泛地应用在制造工业.过程控制.通讯.仪器仪表.汽车.船舶.航空航天.军事.装备.消费类产 品等方面.今天嵌入式系统带来的工业年产值超过了1万亿美元.当前嵌入式操作系统有数百种,比较流行的有Nucleus Plus,QNX,Lynx OS,Psos,VRTX,VXWorks,Windows CE等.它们各有特色,用户可以根据自身的软硬件环境的要求,选择合适的操作系统.本文介绍了实时多任务嵌入式操作系统Nucleus PLUS. (一)Nucl

Nucleus PLUS的启动、运行线程和中断处理

nucleus系统是实时嵌入式操作系统,具有实时.任务抢先.多任务内核,其中95%的代码由C语言写成,极易移植,开放的源码使得配置和裁剪方便,再加上体积小(全部二进制映像可仅20K).响应快速等特性,使得Nucleus PLUS得到广泛应用.另外,所谓的实时指的是对外部或者内部的事件在正确的时间内必须得到正确的响应,而不仅仅指的是"立即能够响应". (一)Nucleus PLUS启动流程 INT_Initialize 子程序在Nucleus PLUS 系统中是最先运行的.负责所有与目标

开源分布式任务调度平台Cuckoo-Schedule

1         概述 1.1      平台概述 Cuckoo-Schedule是基于Quartz-Schedule的轻量级任务调度框架,具有易学习.易上手.开发高效稳定的特点.Demo地址:http://cuckoo.hellosr.com,测试用户:guest,密码:123456. Cuckoo-Schedule对调度模块与执行模块进行解耦,调度模块支持集部署.任务分组.任务依赖.权限管理.邮件告警.调度日志记录等功能,并提供WEB页面对任务进行管理,支持任务实时调度情况的查看.变更以及

任务调度框架-Quartz.Net

使用Quartz.Net依赖于以下3个组件:Common.Logging.dll.Common.Logging.Core.dll.Quartz.dll 简单封装 1 using Quartz; 2 using Quartz.Impl; 3 using System; 4 using System.Collections.Generic; 5 using System.Linq; 6 using System.Text; 7 using System.Threading.Tasks; 8 9 na

java计划任务调度框架quartz结合spring实现调度的配置实例代码分享

点击链接加入群[JavaEE(SSH+IntelliJIDE+Maven)]:http://jq.qq.com/?_wv=1027&k=L2rbHv 一:quartz简介 OpenSymphony 的Quartz提供了一个比较完美的任务调度解决方案. Quartz 是个开源的作业调度框架,定时调度器,为在 Java 应用程序中进行作业调度提供了简单却强大的机制. Quartz中有两个基本概念:作业和触发器.作业是能够调度的可执行任务,触发器提供了对作业的调度 二:quartz spring配置详

java sql编辑器 动态报表 数据库备份还原 quartz定时任务调度 自定义表单 java图片爬虫

获取[下载地址]   QQ: 313596790   [免费支持更新] 三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体 [新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统] A 集成代码生成器(开发利器)+快速构建表单;            QQ:313596790 freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块 B 集成阿里巴巴数据库连接池druid;