概述

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实时操作系统的任务调度算法很easy,它包含时间片轮转算法和轮询算法。

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

再者,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 任务创建和优先级管理的基本过程

任务优先级管理全局变量

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

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

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

Nucleus PLUS任务调度的更多相关文章

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

    近些年来,随着嵌入式系统飞速的发展.嵌入式实时操作系统广泛地应用在制造工业.过程控制.通讯.仪器仪表.汽车.船舶.航空航天.军事.装备.消费类产 品等方面. Nucleus PLUS 是为实时嵌入式应 ...

  2. Nucleus PLUS系统架构和组件

    (一个)方法论和软件组件 1.软件组件(Software Component)定义 从一般意义上来说.组件(Component)是系统中能够明白辨识的组成部分,一个不透明的功能实现体.软件开发中,组件 ...

  3. Nucleus PLUS的启动、执行线程和中断处理

    nucleus系统是实时嵌入式操作系统,具有实时.任务抢先.多任务内核,当中95%的代码由C语言写成,极易移植.开放的源代码使得配置和裁剪方便,再加上体积小(所有二进制映像可仅20K).响应高速等特性 ...

  4. Nucleus PLUS简单介绍

    近些年来,随着嵌入式系统飞速的发展,嵌入式实时操作系统广泛地应用在制造工业.过程控制.通讯.仪器仪表.汽车.船舶.航空航天.军事.装备.消费类产 品等方面.今天嵌入式系统带来的工业年产值超过了1万亿美 ...

  5. nucleus plus学习总结

    前言:     最近一直都在看nucleus plus,之前看过一些linux内核的一些东西,但都是停留在文字上,代码看的很少,这个nucleus plus内核的代码量不大,看过source code ...

  6. Nucleus SE RTOS初始化和启动

    Nucleus SE RTOS初始化和启动 Nucleus SE RTOS initialization and start-up 对于任何类型的操作系统,都有某种类型的启动机制.具体的工作方式因系统 ...

  7. Nucleus 实时操作系统中断(下)

    Nucleus 实时操作系统中断(下) Nucleus RTOS兼容性 由于中断在Nucleus SE中的实现方式与Nucleus rto截然不同,因此不应期望有特定的兼容性.Nucleus RTOS ...

  8. .net 分布式架构之任务调度平台

    开源地址:http://git.oschina.net/chejiangyi/Dyd.BaseService.TaskManager .net 任务调度平台 用于.net dll,exe的任务的挂载, ...

  9. 免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)

    很多的软件项目中都会使用到定时任务.定时轮询数据库同步,定时邮件通知等功能..NET Framework具有“内置”定时器功能,通过System.Timers.Timer类.在使用Timer类需要面对 ...

随机推荐

  1. 洛谷P2422 良好的感觉

    题目意思就是:最大化一个区间的和与这个区间的最小值的乘积. 换一个角度看问题,如果我们穷举一个最小值 $ a_i $ ,然后往左右扩展,显然是对的,复杂度 $ O(n^2) $.所以我们要优化一下这个 ...

  2. AdvStringGrid 固定行、列

  3. Centos简介

    Centos作为主流的一种Linux操作系统,以后项目中,比如后期Redis,以及部署一些项目,会把Centos作为服务器操作系统,我们选用Centos,主要是免费,以及稳定. Centos详细介绍, ...

  4. 更新svn的客户端TortoiseSVN后 ,之前使用svn管理的文件的关联图标消失了

    说明:下面的解决方法及图片来自博客:装了SVN,你的关联图标变了没有? 解决办法:在同步的文件点击右键如下图   ...       现则Settings,出现的界面如下 ...            ...

  5. php 根据ip获取城市以及网络运营商名称(利用qqwry.dat)

    根据用户IP地址判定出所在城市以及网络运营商 qqwry.dat下载地址:http://files.cnblogs.com/guangxiaoluo/qqwry.rar  解压出来即可 //获取用户真 ...

  6. 30分钟LINQ教程的学习笔记

    原文章 : http://www.cnblogs.com/liulun/archive/2013/02/26/2909985.html 一.11个与LINQ有关的语言特性: [隐式类型.匿名类型.对象 ...

  7. CSUOJ 2031 Barareh on Fire

    Description The Barareh village is on fire due to the attack of the virtual enemy. Several places ar ...

  8. Python 学习经历分享

    如果说 Java 是亲儿子的话,那么 Python 应该就是干儿子了.看了一下所有关于 Python 的笔记,我发现原来我在 4 月份的时候就已经涉足 Python 了,但是到目前为止才真正算做出了一 ...

  9. Bzoj4548 小奇的糖果(链表+树状数组)

    题面 Bzoj 题解 很显然,我们只需要考虑单独取线段上方的情况,对于下方的把坐标取反再做一遍即可(因为我们只关心最终的答案) 建立树状数组维护一个横坐标区间内有多少个点,维护双向链表实现查询一个点左 ...

  10. JAVAEE——宜立方商城10:使用freemarker实现网页静态化、ActiveMq同步生成静态网页、Sso单点登录系统分析

    1. 学习计划 1.使用freemarker实现网页静态化 2.ActiveMq同步生成静态网页 2. 网页静态化 可以使用Freemarker实现网页静态化. 2.1. 什么是freemarker ...