任务就绪表的结构与操作(uC/OS-II)

一、任务就绪表的结构

每个任务被赋予不同的优先等级,从0级到最低优先级OS_LOWEST_PRIO,包括0和OS_LOWEST_PRIO在内。当uC/OS-II初始化时,最低优先级OS_LOWEST_PRIO总是被赋给空闲任务idle task。

注意:最多任务数目OS_MAX_TASKS和最低优先级数是没有关系的。应用程序可以有10个任务,而仍然可以有32个优先级的级别(如果将最低优先级别数设为31的话)。

每个就绪的任务都放在就绪表中,就绪表中有2个变量OSRdyGrp和OSRdyTbl[]。在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRdyTbl[]中相应元素的相应位也置为1。如图:

就绪表OSRdyTbl[]数组的大小取决于OS_LOWEST_PRIO。

#define  OS_RDY_TBL_SIZE   ((OS_LOWEST_PRIO) / 8 + 1)   /* Size of ready table                         */
OS_EXT  INT8U             OSRdyGrp;                        /* Ready list group                         */
OS_EXT  INT8U             OSRdyTbl[OS_RDY_TBL_SIZE];       /* Table of tasks which are ready to run    */

为确定下一次该哪个优先级的任务运行了,uC/OS-II中调度器总是将最低优先级的任务在就绪表中相应位置1。

二、任务就绪表的操作

系统对就绪表主要有三个操作:登记、注销和从就绪表的就绪任务中得知具有最高优先级任务的标识。

1、登记

使任务进入就绪态,即在就绪表中将该任务的对应位置1。

任务优先级的低3位用于确定在OSRdyTbl[]的位置,接下来3位用于确定在OSRdyGrp中的位置。

2、注销

使一个任务脱离就绪态,即在就绪表中将该任务的对应位置0。

3、最高优先级就绪任务的查找

为了找到进入就绪态的优先级最高的任务,并不需要从OSRdyTbl[0]开始扫描整个就绪任务表,只需查找优先级判定表OSUnMapTbl[]。OSUnMapTbl[]表中的数值表示的是一个8bit的数据最低位为1的位置,例如:1000 0000 最低位为1的位置是在第7位,那么OSUnMapTbl[128]的值就是7;1000 0010 最低位为1的位置是在第1位,那么OSUnMapTbl[130]的值就是1。

 1 INT8U  const  OSUnMapTbl[] = {
 2     0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x00 to 0x0F                             */
 3     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x10 to 0x1F                             */
 4     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x20 to 0x2F                             */
 5     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x30 to 0x3F                             */
 6     6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x40 to 0x4F                             */
 7     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x50 to 0x5F                             */
 8     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x60 to 0x6F                             */
 9     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x70 to 0x7F                             */
10     7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x80 to 0x8F                             */
11     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x90 to 0x9F                             */
12     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xA0 to 0xAF                             */
13     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xB0 to 0xBF                             */
14     6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xC0 to 0xCF                             */
15     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xD0 to 0xDF                             */
16     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xE0 to 0xEF                             */
17     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0        /* 0xF0 to 0xFF                             */
18 };
1 y = OSUnMapTbl[OSRdyGrp];        /* Find highest priority‘s task priority number   */
2 x = OSUnMapTbl[OSRdyTbl[y]];
3 OSPrioHighRdy = (INT8U)((y << 3) + x);
时间: 2024-10-12 22:30:14

任务就绪表的结构与操作(uC/OS-II)的相关文章

DDL——对数据库表的结构进行操作的练习

-- 这是DDL,对数据库表的结构进行操作的练习 -- 1 创建数据库 create database emp; -- 2,删除数据库 drop database emp; -- 3,显示数据库 show databases -- 4,显示数据库创建语句 show create DATABASE emp; -- 5,创建表 use emp; create table classinfo( cid int(11),-- '班级ID' cname VARCHAR(32),-- '班级名称' Actu

数据结构与算法-线性表顺序存储结构删除操作的实现

这一章节我们来看一下线性表顺序存储结构删除操作的简单实现 package com.ray.testobject; public class Test { private Object[] list; public Object[] getList() { return list; } /** * 初始化list * * @param num * 元素个数 */ private void iniList(int num) { list = new Object[num]; for (int i =

uC/OS II 任务切换原理

今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引发一次中断,自动将CS.IP寄存器压入堆栈,再利用中断返回,将新任务的任务断点指针弹出到CPU的CS.IP寄存器中,实现任务切换.虽然明白个大概,但是其中的细节却有点模糊,为什么调用IRET中断返回指令后,弹入CPU的CS.IP寄存器的断点指针是新任务的断点指针,而不是当前任务的,UCOS II是如

uC/OS II 函数说明 之–OSTaskCreate()与OSTaskCreateExt()

1. OSTaskCreate()    OSTaskCreate()建立一个新任务,能够在多任务环境启动之前,或者执行任务中建立任务.注意,ISR中禁止建立任务,一个任务必须为无限循环结构.        源码例如以下: #if OS_TASK_CREATE_EN > 0                    /* 条件编译,是否同意任务的创建               */INT8U  OSTaskCreate (void (*task)(void *pd), /* 函数指针,void *

Mysql-数据库及数据表结构和操作

1.数据库系统:数据库系统是用来维护和管理数据库的系统工具,数据库系统拥有自己的用户名和密码 1.1.显示该系统中的数据库:Show databases; 1.2.创建数据库:Create database : 1.3.删除该系统中的某个数据库:Drop database 数据库名 2.MySql的表:在mySql关系型数据库中,表是最基本的单元,在每个数据表中主要由以下部分构成:表名.列明,列数据类型.列约束. 对于表的操作有如下: 2.1.数据表的创建: CREATE TABLE 表名( 属

表的操作-建立表-删除表-修改表的名字-修改列的名字及数据类型-删除/添加主键-在表的最后增加一列-查看表的结构

USE db; -- 列出查看当前数据库中的所有表 SHOW TABLES; SHOW TABLES LIKE 's%'; CREATE TABLE 表名 ( 列名 类型 修饰 约束, sid INT(3) UNSIGNED ZEROFILL PRIMARY KEY AUTO_INCREMENT sgender ENUM('男','女','保密') DEFAULT '男' )ENGINE=MYISAM DEFAULT CHARSET=utf8; -- 建立表 CREATE TABLE IF NO

mysql数据库连接状态,不要做修改数据库表结构的操作;数据库迁移操作;

在开发过程中,python的flask框架使用sqlalmysql连接mysql数据库. 在程序连接数据量过程中,不要修改数据表的结构.比如在连接状态中使用下面的软件修改数据表结构,这个软件立即就会卡死,这个使用停止flask的连接,就可以从卡死状态中恢复过来,正常执行下去. 如图,通过Dump SQL File可以把数据库的表结构和数据拷贝下来,或者只要表结构.然后通过Execute SQL File,把这些数据表及里面的数据导入到另一个数据库 原文地址:https://www.cnblogs

数据结构——线性表顺序存储结构

 关于线性表 线性表是零个或者多个数据元素的集合.它主要有以下三个特征: 1:线性表的数据元素之间是有顺序的. 2:线性表中数据元素个数是有限的. 3:线性表中数据元素数据类型是相同的. 关于线性表的操作,主要有 创建线性表.销毁线性表.清空线性表.将元素插入线性表.将元素从线性表中删除.获取线性表中某个位置的元素.获取线性表的长度. 线性表主要有两种存储结构: 1:线性表的顺序存储结构,c语言中的数组及采用这种方式. 2:线性表的链式存储结构. 关于顺序存储结构 定义: 是指用一段地址连续的内

数据库及表、列的操作,常用函数

数据库及表.列的操作,常用函数 一.数据库的建立 格式:CREATE DATABASE "数据库文件名 " 修改数据库 格式:ALTER DATABASE "数据库文件名"{} 删除数据库 DROP DATABASE "数据库文件名" 二.建立表的结构 注释:下划线表示可有可无 1.CREATE TABLE "数据库名"."表名" (  列名 数据类型 null/not null primary,    列