嵌入式操作系统_第4章 ucOS-II - 任务任务控制块及链表
嵌入式实时操作系统uCOS-II_吴永忠
1.1.1.1嵌入式应用的起源
1946.2.15 ENIAC (Electronic Numerical Integrator And Computer)
长30.48米,宽1米,30个操作台重达30吨 耗电量150千瓦 造价48万美元。 它包含了17,468 真空管,7,200水晶 二极管, 1,500 中转, 70,000 电阻器, 10,000 电容器, 1500继电器,6000多个开关 每秒执行5000次加法或400次乘法,是继电器计 算机的1000倍、手工计算的20万倍。
BC NG
1.1嵌入式系统的基本概念
1.1.1 嵌入式系统的发展概况
1.1.1.1 嵌入式应用的起源 1.1.1.2 计算机技术的分化 1.1.1.3 两大分支的发展方向
1.1.2 嵌入式系统的定义 1.1.3 嵌入式系统的特点
BC NG
1.1嵌入式系统的基本概念
1.1.1 嵌入式系统的发展概况
计算机技术的分化----后PC时代
在早期,由于嵌入式应用范围比较狭窄,大多用于工业控 制领域,人们还可以勉强将通用计算机通过改装、加固、 定制专业软件等方法,嵌入到大型系统中去实现嵌入式应 用,但随着经济、技术的高速发展,嵌入式应用越来越广 泛,已经深入到我们生活中的方方面面,比如:小到彩电、 空调、洗衣机、手机,大到飞机、导弹、汽车等等,嵌入 式应用对计算机的功能、体积、功耗、价格、重量、可靠 性等方面的要求越来越苛刻,通过改造通用计算机的传统 方法远远不能胜任。 因此,嵌入式计算机不得不脱离通用计算机系统走上了独 立发展的道路。这就形成了现代计算机两大分支并行发展 的时期,也称为后PC时代。
在单片机的发展道路上,曾出现过两种探索模式,即“Σ模式”和 “创新模式”。
嵌入式实时操作系统ucosII
10
学习嵌入式操作系统
学习一种实时操作系统RTOS,如uc/OS,掌握实时系统的 概念和设计方法;
嵌入式系统以应用为中心,应用时选择“适用”的操作系 统;
知道如何剪裁操行系统; 嵌入式Linux、eCos; 自己“写”RTOS——一种学习态度; 由于嵌入式系统自身的特点,采用的程序设计语言是汇编
许多早期的嵌入式系统开发者认为嵌入式系统不需要操作系统,但现在除了 最简单的系统外,越来越多的嵌入式系统都引入了操作系统,比如中断驱动系统 在引入嵌入式操作系统之后,系统的可靠性、安全性、可扩展性、功能性、灵活 性、可管理性都大大提高。当然,我们这里所讲的嵌入式操作系统不一定是UcOS、 VxWorks、WinCE、Linux等通用产品,也包括开发者自己编写的专用嵌入式操作 系统。
语言、C/C++语言、JAVA语言。所用的编译器应与处理 器相适应。
11
RTOS在嵌入式系统中的位置
应用
FS C/C++ 设备驱动
RTOS
KERNEL 调试工具
其它组件 TCP/IP 设备I/O
BSP(板级支持包) 嵌入式硬件平台
12
第二讲 C/OS –II及任务
µC/OS-II的特点 µC/OS-II文件结构与内核 µC/OS-II任务及其存储结构 µC/OS-II任务控制块与任务堆栈 µC/OS-II系统的任务、空闲任务与统计任务
实时嵌入式操作系统的种类繁多,大体上可分为两种,商用型和免费型。 商用型的实操作系统功能稳定、可靠,有完善的技术支持和售后服务,但往往
价格昂贵,如Vxworks、QNX、WinCE、Palm OS等。 免费型的实时操作系统在价格方面具有优势,目前主要有Linux、eCos和
嵌入式实时操作系统uCOS-II(就绪算法)
OSTCBTbl[1]
OSTCBStkPtr
OSTCBTbl[0]
OSTCBStkPtr
OSTCBNext
OSTCBTbl[2]
OSTCBStkPtr OSTCBNext
OSTCBTbl[n]
OSTCBStkPtr OSTCBNext NULL
OSTCBNext
NULL
20
任务控制块数组与指针
OSTCBFreeList
OSTCBPrioTbl[ ]
[0] [4] [5]
NULL
… &OSTCBTBL[1] &OSTCBTBL[2]
…
[OS_LOEEST_PRIO] &OSTCBTBL[0]
OS_TaskIdle
15
任务控制块数组与指针
OSTCBPrioTbl[
]
任务的优先级资源由操作系统提供,uc/OS-II 有64各优先级,优先级的高低按照编号从0(最高) 到63(最低)排序。由于用户实际使用的优先级的 个数通常少于64个,所以为节约系统资源,可以通 过定义系统常量OS_LOWEST_PRIO的值来限制优 先级编号的范围。
OSTCBTbl[2]
OSTCBStkPtr OSTCBNext
OSTCBTbl[n]
OSTCBStkPtr OSTCBNext NULL
NULL
13
任务控制块数组与指针
OSTCBPrioTbl[
]
任务控制块优先级表,专门用来存放指向各任 务控制块的指针,并按任务的优先级别将这些指针存 放在数组的各个元素里,这样系统在访问一个任务的 任务控制块时,就不必遍历任务控制块链表了。只要 知道任务的优先级,就可以迅速地从该数组中找到它 的任务控制块。
嵌入式实时操作系统(μCOS-II)原理与应用-目录与正文-最新版第四部分D
.OSTCBOpt 存放有关任务的附加信息。
当用户将OS_TASK_CREATE_EXT_EN设为1 时,这个变量才有效。
通过设置该选项,可起用任务栈检查功能。
例如:作为参数传给OSTaskCreateExt()。
μC/OS-Ⅱ目前只支持 3 个选择项:OS_TASK_OTP_STK_CHK, OS_TASK_OPT_STK_CLR 和OS_TASK_OPT_SAVE_FP 。
OS_TASK_OTP_STK_CHK 用于告知TaskCreateExt(),在任务建立的时候任务栈检验功能得到了允许。
S_TASK_OPT_STK_CLR 表示任务建立的时候任务栈要清零,只有在用户需要有栈检验功能时,才需要将栈清零。
如果不定义OS_TASK_OPT_STK_CLR,而后又建立、删除了任务,栈检验功能报告的栈使用情况将是错误的。
假如任务一旦建立就决不会被删除,且用户初始化时,已将RAM 清过零,就不需要再定义OS_TASK_OPT_STK_CLR,这样可以节约程序执行时间。
传递了OS_TASK_OPT_STK_CLR 将增加TaskCreateExt()函数的执行时间,因为要将栈空间清零。
栈容量越大,清零花的时间越长。
最后一个选择项OS_TASK_OPT_SAVE_FP 通知TaskCreateExt(),任务要做浮点运算。
如果微处理器有硬件的浮点协处理器,则所建立的任务在做任务调度切换时,会保存浮点寄存器的内容。
.OSTCBId 用于存储任务的识别码。
该变量现在没有使用,留给将来扩展用。
.OSTCBNext 和.OSTCBPrev 用于任务控制块OS_TCBs 的双向使用表链接,该链表在时钟节拍函数OSTimeTick()中使用,用于刷新各个任务的任务延迟变量.OSTCBDly。
OSTCBNext、OSTCBPrev:用于将任务控制块OS_TCB插入到空闲链表;或在任务建立的时候链接到双向使用链表中;或在任务删除的时候从链表中被删除。
嵌入式实时操作系统(μCOS-II)原理与应用-目录与正文-最新版第四部分E
根据给定的优先级通过设定就续表,使任务进入就绪态(参见程序清单L3.1.7)的例子:●假设要使优先级为12的任务进入就绪状态,12(1100b)即任务的标识号,就是要将OSRdyTbl[1]的第4位置1,且将OSRdyGrp的第1位置1。
依照算法,将该任务放入就绪表的相应数学表达式为:OSRdyGrp |=0x02 ;OSMapTbl[12>>3]OSRdyTbl[1] |=0x10 ;OSMapTbl[4]●而要让优先级为21的任务进入就绪态,21(10101b)即任务的标识号,就是要将OSRdyTbl[2]的第5位置1,且将OSRdyGrp的第2位置1。
依照算法,将该任务放入就绪表的相应数学表达式为:OSRdyGrp |=0x04 ;OSMapTbl[21>>3]OSRdyTbl[2] |=0x20 ;OSMapTbl[5]从上面的计算可知:若要将OSRdyGrp及OSRdyTbl[]的第n位置1,可通过分别把OSRdyGrp及OSRdyTbl[]的值与2n 相或来实现。
在μC/OS-Ⅱ中,已经把2n的n=0-7的8个值先计算好作为常数存在数组OSMapTbl[7]中了,这正是前面的表3.1 OSMapTbl[]: OSMapTbl[0] = 20 = 0x01(0000 0001)OSMapTbl[1] = 21 = 0x02(0000 0010)……OSMapTbl[4] = 24 = 0x10(0001 0000)……OSMapTbl[7] = 27 = 0x80(1000 0000)(4)任务调度器调度是内核的主要职责之一,就是要决定该轮到哪个任务运行了。
在时间片轮转调度法中,当两个或两个以上任务有同样优先级,内核允许一个任务运行事先确定的一段时间片,然后切换给另一个任务。
所以,也叫做时间片调度。
内核在满足以下条件时,把CPU控制权交给下一个处于就绪态的任务:●当前任务已无事可做●当前任务在时间片还没结束时已经完成了。
嵌入式实时操作系统(μCOS-II)原理与应用-目录与正文-最新版第一部分
目录学习情境一、嵌入式系统概述及集成环境的搭建与使用 (1)一、知识要点:嵌入式系统概述 (1)1.嵌入式系统基本概念 (1)2.嵌入式系统的特点 (2)3.嵌入式系统的应用领域 (3)(1)工业控制领域 (3)(2)信息家电 (4)(3)交通管理、环境监测、医疗仪器 (4)(4)嵌入式Internet应用 (4)(5)军事国防领域 (5)4.嵌入式系统的发展 (6)5.嵌入式系统的开发流程 (7)6.嵌入式系统的调试 (10)(1)在线仿真器(ICE)方式 (10)(2)在线调试器(ICD)方式 (11)(3)监控器方式 (11)7.基于μCOS-Ⅱ的嵌入式系统软件体系结构 (11)二、技能要求:嵌入式系统交叉开发环境的搭建 (2)1.交叉开发环境 (2)2.使用集成开发环境进行软件开发的流程 (2)3.ARM ADS集成开发工具及其组成 (3)(1)ADS集成开发工具 (3)(2)ADS集成开发工具的组成 (3)案例1.ADS 1.2的安装 (4)案例2.ADS集成开发环境的使用 (5)(1)新建工程 (5)(2)配置新建工程 (6)(3)添加文件,完成编译与链接,并生成目标文件.......... 错误!未定义书签。
案例3.其它工具的使用 .............................................................................. 错误!未定义书签。
(1)仿真器的连接与使用................................ 错误!未定义书签。
(2)超级终端的设置及映像下载.......................... 错误!未定义书签。
(3)Source Insight代码编辑器的使用.................... 错误!未定义书签。
学习情境二、嵌入式平台的接口驱动................................................................... 错误!未定义书签。
UCOSII操作系统课程设计
UCOSII操作系统课程设计一、课程目标知识目标:1. 理解UCOSII操作系统的基本原理和核心概念,包括任务管理、时间管理、通信与同步机制;2. 掌握UCOSII的移植方法和配置过程,学会在不同硬件平台上搭建UCOSII 操作系统环境;3. 学会使用UCOSII提供的API进行多任务编程,了解实时操作系统的任务调度和资源管理策略。
技能目标:1. 能够运用C语言在UCOSII环境下编写多任务应用程序,实现任务间的同步与通信;2. 能够分析并解决实际嵌入式系统开发中与操作系统相关的问题,提高系统稳定性和可靠性;3. 掌握UCOSII调试技巧,能够运用调试工具对操作系统运行状态进行跟踪和分析。
情感态度价值观目标:1. 培养学生对操作系统知识的好奇心和探索精神,激发学习兴趣和热情;2. 培养学生具备良好的团队合作精神和沟通能力,提高解决实际问题的能力;3. 增强学生的创新意识,鼓励他们在实际项目中积极尝试和应用所学知识。
课程性质:本课程为高年级专业课,以实际应用为导向,注重理论与实践相结合。
学生特点:学生已具备一定的C语言编程基础和嵌入式系统知识,具有较强的学习能力和实践能力。
教学要求:教师需采用项目驱动教学法,引导学生通过实际案例掌握UCOSII 操作系统的应用与开发。
在教学过程中,关注学生的个体差异,提供个性化指导,确保课程目标的实现。
同时,注重培养学生的自主学习能力和创新能力,为将来的职业发展打下坚实基础。
二、教学内容1. UCOSII操作系统概述:介绍实时操作系统的基本概念、特点及应用场景,引出UCOSII的背景、架构和优势。
教材章节:第一章 实时操作系统概述2. UCOSII内核原理:讲解UCOSII的核心组件,包括任务管理、时间管理、通信与同步机制等。
教材章节:第二章 UCOSII内核原理3. UCOSII移植与配置:介绍在不同硬件平台上移植和配置UCOSII的方法,以实际案例为例进行讲解。
嵌入式实时操作系统uC OS-2教程(吴永忠)章 (4)
第4章 中断处理与时间管理
4.1 中断处理的基本概念 4.2 μC/OS-Ⅱ的中断处理 4.3 μC/OS-Ⅱ的时钟节拍 4.4 μC/OS-Ⅱ的时间管理 习题
第4章 中断处理与时间管理
4.1 中断处理的基本概念
4.1.1 中断 中断定义为CPU对系统内外发生的异步事件的响应。异步
中断响应考虑的是系统在最坏情况下的响应中断时间,而 不是平均时间。如某系统100次中有99次在100 μs之内响应中 断,只有一次响应中断的时间是250 μs,只能认为中断响应 时间是250 μs。
第4章 中断处理与时间管理
4.1.4 中断恢复时间 中断恢复时间(Interrupt Recovery)定义为CPU返回到被
第4章 中断处理与时间管理 在前后台系统中:
中断延迟
=
MAX
最长指令 时间
,关 最中 长断 时的 间
+
中断向量 距转时间
在不可剥夺型和不可剥夺内核中:
中断延迟 = MAX
最长指令 时间
,中用断户时关间
,中内断核时关间 +
中断向量 跳转时间
第4章 中断处理与时间管理
4.1.3 中断响应 中断响应定义为从中断发生起到开始执行中断用户处理程
特点是中断优先级高、延迟时间短、响应快、不能被嵌套、不 能忍受内核的延迟,一般常应用于紧急事件处理,如掉电保护 等。非屏蔽中断的规则如下:
(1) 在非屏蔽中断处理程序中,不能处理临界区代码、不 能使用内核提供的服务。
(2) 在非屏蔽中断处理程序中,参数的传递必须用全程变 量,且全程变量的字节长度必须能够一.6 μC/OS-Ⅱ的中断处理过程示意图
第4章 中断处理与时间管理
《嵌入式操作系统UCOSII原理及应用》任哲—学习笔记
《嵌入式操作系统UCOSII原理及应用》任哲—学习笔记第一章嵌入式实时操作系统的概念1.计算机操作系统:对计算机系统资源进行管理,并向计算机用户提供若干服务。
OR:计算机操作系统是计算机硬件的一个软件包装,它为应用程序设计人员提供了一个更便于使用的虚拟计算机。
2.操作系统功能:1)处理器的管理:(1)中断管理;(2)对处理器工作进行调度;2)存储的管理:3)设备的管理:4)文件的管理:5)网络和通信的管理:6)提供用户接口:3.嵌入式系统:对对象进行自动化控制而使其具有智能化并可嵌入对象体系中的专用计算机系统。
4.嵌入式操作系统:运行在嵌入式硬件平台上,对整个系统及其所操作的部件、装置等资源进行统一协调、指挥和控制的系统软件。
5.实时操作系统:(1)多任务系统;(2)任务切换时间与系统中的任务数无关;(3)中断延时的时间可预知并尽可能短。
第二章uC/OS-II中的任务1.uC/OS-II操作系统内核的主要工作就是对任务进行管理和调度。
2.UC/OS-II的任务组成部分:(1)任务程序代码:任务的执行部分;(2)任务堆栈:保存任务工作环境;(3)任务控制块:保存任务属性。
3.uC/OS-II的两种任务:用户任务:由应用程序设计者编写的任务。
系统任务:系统提供的任务。
4.任务的状态:(1)睡眠状态:是否配置或剥夺任务控制块的配置情况;(2)就绪状态:任务就绪表进行就绪登记,等待优先级,具备运行充分条件;(3)运行状态:获得CPU使用权限,任何时候只有一个任务处于运行状态。
(4)等待状态:正在运行的任务,需要等待一段时间或一件事件发生在运行,暂时交出CPU使用权。
5.用户任务代码结构:任务的执行代码通常是一个无限循环结构,并且在这个循环中可以响应中断,这种结构叫做超循环结构。
6.OSTakCreate()用来创建任务的函数;OSStart()用来启动各项任务的函数,启动后,任务就交由操作系统来管理和调度了。
uCOS-II嵌入式实时操作系统原理与移植
1,决定是否进行上下文切换 2,保存当前执行进程的上下文
包括程序计数器PC、通用寄存器、 与任务有关的数组、表格、链等。
uC/OS-II采用可
剥夺实时内核,
含义是最高优先
0
级任务一旦就绪,
总能得到CPU使
1
用权。
系统保留4个
2
最高优先级
3
4
5
执行该任务
6
7
……
uC/OS-II 的中断(ISR)
任务2—TCB--就绪—任务堆栈
任务3--TCB--等待—任务堆栈
任务4--TCB --睡眠—任务堆栈
uC/OS-II的任务之间通信
任务之间共享的信息成为事件,同一时刻只能有一个任务使 用共享信息,因此为每个事件构建一个事件控制块ECB来保 证任务之间安全共享信息。事件控制块总数由OS_CFG.H中的 OS_MAX_EVENTS定义。事件包括信号量、邮箱、消息队列。
内存组配置文件 储存器映射MMU初始化与操作 Nand flash控制器初始化与操作
与CPU相关的配置选项 开机画面BMP文件 开机画面BMP文件 开机画面BMP文件 初始化mini2440目标板 定义任务优先级、堆栈大小及函数原型声明 初始化操作系统定时器0 开机画面BMP文件
关于信号量和等待的API功能函数
//任务循环
{
OSPrintf("\nEnter Main Task\n");
OSTimeDly(OS_TICKS_PER_SEC); //将任务延迟一段时间,进入等待态
}
}
uC/OS-II的任务都运行在无限循环中。
欢迎访问机电技术博客:/spurtltl@126/
uCOS-II嵌入式操作系统介绍与移植
OSStartHighRd
1、该函数是在OSStart函数中调用 2、负责从最高优先级任务的TCB中获得该任务的堆
栈指针sp,并依次将cpu现场恢复,这时系统就将 控制权交给用户创建的该任务进程,直到该任务被 阻塞或者被其他更高优先级的任务抢占cpu 3、该函数仅在多任务启动时被执行一次,用来启 动之前创建的第一个,也就是最高优先级的任务执 行
3、可从网站上获 得全部源码及其在各种体系结构平 台上的移植范例。
uC/OS-II特点
1、uC/OS-II内核具有可抢占的实时 多任务调度功能
2、提供了许多系统服务,如信号量、 消息队列、邮箱、内存管理、时间 函数等
3、这些功能可以根据不同的需求进 行裁减。
uC/OS-II的移植
ARM处理器相关宏定义
1、退出临界区
#defineOS_ENTER_CRITICAL() ARMDisableInt()
2、进入临界区
#defineOS_EXIT_CRITICAL() ARMEnableInt()
堆栈增长方向
1、堆栈由高地址向低地址增长,这个也 是和编译器有关的,当进行函数调用时, 入口参数和返回地址一般都会保存在当 前任务的堆栈中,编译器的编译选项和 由此生成的堆栈指令就会决定堆栈的增 长方向。
#define OS_STK_GROWTH 1
OS_CPU.c的移植
1、任务堆栈初始化 2、系统hook函数 3、中断级任务切换函数
任务堆栈初始化OSTaskStkInit
1、由OSTaskCreate或OSTaskCreateExt调用 2、用来初始化任务的堆栈并返回新的堆栈指针stk。
退出/进入临界区函数 ARMDisableInt/ARMEnableInt
嵌入式实时操作系统ucosII
嵌入式实时操作系统ucosIIucosII是一款源代码公开、可免费使用的嵌入式实时操作系统。
它是由德国嵌入式系统专家brosse于1992年编写完成的,主要适用于嵌入式系统的开发。
ucosII具有源代码短小精悍、可移植性好、稳定性高等优点,被广泛应用于各种嵌入式系统中。
源代码短小精悍:ucosII的源代码只有几百KB,相对于其他RTOS来说,其代码量较小,易于理解和修改。
可移植性好:ucosII采用了可移植性的设计方法,可以在不同的处理器和编译器上进行移植和优化。
稳定性高:ucosII在各种嵌入式系统中得到了广泛应用,其稳定性和可靠性得到了充分的验证。
支持多任务:ucosII支持多任务处理,可以同时运行多个任务,提高系统的效率和响应速度。
实时性:ucosII具有较高的实时性,可以满足各种实时性要求高的应用场景。
可扩展性:ucosII具有较好的可扩展性,可以根据需要进行功能扩展和优化。
系统内核:包括任务调度、任务管理、时间管理、内存管理等核心功能。
中断处理程序:处理各种中断请求,包括硬件中断、软件中断等。
系统API:提供了一套完善的API函数,方便应用程序的开发和调试。
调试和测试工具:包括各种调试和测试工具,如内存检查工具、性能分析工具等。
ucosII被广泛应用于各种嵌入式系统中,如工业控制、智能家居、智能交通、航空航天等。
其应用场景涵盖了消费类电子产品、医疗设备、通信设备、汽车电子等领域。
ucosII作为一款源代码公开、可免费使用的嵌入式实时操作系统,具有短小精悍、可移植性好、稳定性高等优点。
它广泛应用于各种嵌入式系统中,为应用程序的开发提供了便利和支持。
其可扩展性和实时性也使得它在各种领域中具有广泛的应用前景。
随着嵌入式系统的广泛应用,对嵌入式操作系统的需求也日益增长。
uCOSII是一种流行的实时嵌入式操作系统,具有轻量级、实时性、可扩展性等优点。
本文将介绍如何在AT91平台上实现uCOSII的移植。
ucos-ii工作原理
ucos-ii工作原理uC/OS-II(Micro C/Operating System-II)是一种用于嵌入式系统的实时操作系统。
它的工作原理可以简单归纳为以下几个步骤:1. 任务管理:uC/OS-II使用优先级调度算法管理多个任务。
每个任务都有一个优先级,高优先级的任务会优先执行。
uC/OS-II通过一个任务控制块(TCB)来管理每个任务的信息,包括任务的状态、堆栈信息、优先级等。
2. 中断处理:uC/OS-II可以处理多种类型的中断。
当发生中断时,uC/OS-II会根据中断类型进行相应的处理,并且可以自动切换到中断服务程序(ISR)进行执行。
中断服务程序中的代码通常是短小且高效的,用于处理特定的中断事件。
3. 任务切换:uC/OS-II使用抢占式的任务调度方式,因此任务切换可以发生在任何时刻。
当一个任务的时间片用尽或者有更高优先级的任务需要执行时,uC/OS-II会保存当前任务的上下文信息,并切换到下一个任务的执行。
任务切换时,uC/OS-II会保存当前任务的栈指针等信息,并从下一个任务的栈指针中恢复相应的上下文,以使下一个任务继续执行。
4. 事件同步:uC/OS-II提供了多种事件同步机制,如信号量、事件标志、消息邮箱等,用于任务之间的同步和通信。
这些机制可以帮助任务之间按照一定的顺序进行执行,实现数据共享和互斥访问等功能。
5. 内存管理:uC/OS-II提供了内存管理功能,可以动态分配和释放内存块。
这种内存管理机制可以帮助节省内存空间,提高系统的效率。
总而言之,uC/OS-II通过任务管理、中断处理、任务切换、事件同步和内存管理等机制,实现了对嵌入式系统的实时调度和资源管理,以提供稳定、可靠的操作系统支持。
chap 04 ucOS-II嵌入式实时操作系统内核分析 - 简
程),μC/OS-II就是一个能对这些小任务的运行进行管理和调度的
多任务操作系统。
在多任务系统中,任务是设计者实现应用系统的基本形式,
也是μC/OS-II系统进行调度的基本单元。
4.2.2 μc/OS-II的任务管理
void YourTask(void pdata)
{
for ( ; ; ) { /*用户代码*/
系统为任务配备 了任务控制块且 在任务就绪表中 进行了就绪登记, 这时任务的状态 叫做就绪状态。
处于就绪状态的 任务如果经调度 器判断获得了 CPU的使用权, 则任务就进入运 行状态
4.2.2 μc/OS-II的任务管理
3.任务管理 μC/OS-II可以管理最多64个任务。任务管理包括创建任务、
删除任务、改变任务的优先级及挂起和恢复任务等。 (1)建立任务
1.任务切换
(1)任务级的任务切换 OS_TASK_SW() ① 保存当前运行的任务的CPU寄存器值到该任务的堆栈。 ② 将要运行的高优先级的任务的寄存器值从堆栈恢复到CPU 寄存器。 ③ 进行TCB的切换,并运行任务。
(2)中断级的任务切换 OSIntCtxSw()
2.就绪表
每个就绪的任务都放在就绪表中 就绪表有两个变量:OSRdyGrp和OSRdyTbl[] OSRdyGrp中,将任务按优先级分组,八个为一组。 OSRdyGrp的每一位代表每组任务是否有进入就绪态的任务。 优先级判定表OSUnMapTbl[],OSUnMapTbl[]是常量表 。
void {
}
void OSTimeTick (void) { …… OSTimeTickHook( ); …… OSTime++; //记录节拍数 OSTickISR(void) …… if (OSRunning = = TRUE) { ptcb = OSTCBList; 保存CPU寄存器; != OS_IDLE_PRIO) while (ptcb->OSTCBPrio { 调用OSIntEnter( ); ); //记录中断嵌套层数 OS_ENTER_CRITICAL( if (ptcb->OSTCBDly != 0) if (OSIntNesting = = 1; { { if (--ptcb->OSTCBDly = = 0) //任务的延时时间减一 { OSTCBCur->OSTCBStkPtr = SP; //保存堆栈指针 if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) = = OS_STAT_RDY) } { OSRdyGrp |= ); 调用OSTimeTick(ptcb->OSTCBBitY; //节拍处理 OSRdyTbl[ptcb->OSTCBY] 清除中断; |= ptcb->OSTCBBitX; } else 开中断; { ptcb->OSTCBDly = 1; } 调用OSIntExit( ); //中断嵌套层数减一 } } 恢复CPU寄存器; ptcb = ptcb->OSTCBNext; 中断返回; OS_EXIT_CRITICAL( ); } }
嵌入式系统教学课件:ucos-ii代码总结分析
/*任务的状态*/
INT8U OSTCBPrio;
/*任务的优先级*/
其他……
} OS_TCB;
21
栈指针
OSTCBStkPtr:指向当前任务栈顶的指针 ,每个任务可以有自己的栈,栈的容量可 以是任意的;
OS:栈的容量,用可容纳的指
统计任务OSTaskStat(),提供运行时间统计。每 秒钟运行一次,计算当前的CPU利用率。其优先级 是OS_LOWEST_PRIOR-1,可选。
19
任务控制块TCB
任务控制块 OS_TCB是描述一个任务的核 心数据结构,存放了它的各种管理信息 ,包括任务堆栈指针,任务的状态、优 先级,任务链表指针等;
OSTaskCreateExt() 提问:C/OS-II中的任务是进程还是线程?
15
任务主函数
一个任务通常是一个无限循环(返回值类型void)
void MyTask(void *pdata) {
while (1) {
do something; waiting; do something; } }
绝大部分 C/OS-II的源码是用移植性很强的ANSI C写的。和微处理器 硬件相关的那部分是用汇编语言写的。汇编语言写的部分已经压到最 低限度,使得 C/OS-II便于移植到其他微处理器上。 C/OS-II可以在 绝大多数8位、16位、32位以至64位微处理器、微控制器 、数字信号处 理器(DSP)上运行。
一旦任务建立了,任务控制块OS_TCB将 被赋值。
20
任务控制块TCB
typedef struct os_tcb
{
栈指针;
INT16U OSTCBId;
/*任务的ID*/
uCOS-II任务及其结构
uCOS-II任务及其结构
正如前⾯所介绍,在uC/OS-II中,任务包括任务控制块、任务堆栈以及任务代码组成,
其中任务控制块包括程序控制块+链表(前⼀篇内容):指向前⼀个任务控制块的指针,后⼀⼽任务控制块的指针,指向任务指针,指向任务堆栈的指针以及任务的优先级等等,
任务堆栈是⽤来保存任务的环境,
任务代码即为需要执⾏的任务内容,
介绍下线程与进程的定义:
线程,不占有私有空间的任务
进程,占有私有任务的任务
在uC/OS-II中,任务可分为⽤户任务和系统任务,系统中,最多可以含有64个任务(包括系统任务和⽤户任务),其中⼀个具体的时刻只可以存在⼀个任务占⽤CPU(运⾏状态),⽽其他任务只可以出于其他状态,系统任务的状态主要有:
睡眠状态:没有配备任务控制块或被剥夺了任务控制块
就绪状态:配备了任务控制块且在任务就绪表中登记
运⾏状态:处于就绪状态且获得了CPU的使⽤权,
等待状态:正在运⾏的任务,需要等待⼀段时间或者需要等待⼀个事件的触发再运⾏,此时CPU的使⽤权将让给其他的任务:使该任务进⼊等待状态,
中断服务状态:⼀个正在运⾏的任务⼀旦响应中断申请就会中⽌运⾏,转⽽执⾏中断服务程序(需要保存断点)
任务代码是⼀个⽆限循环结构,并且在循环中可以响应中断,这种结构是超循环结构,⽤户任务是需要调度才会被执⾏的,操作系统在管理⽤户任务的同时会处理⼀些内部事务(系统任务),为了使CPU在没有⽤户任务可执⾏时,有事可做,uC/OS-II提供了⼀个空闲任务(OSTaskIdle())的系统任务(简单说就是任务运⾏次数计数器),还包含统计任务(CPU使⽤率),即每秒计算⼀次CPU在单位时间内被使⽤的时间,并把计算结果以百分⽐形式存放在OSCPUsage中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if(n%0x10==0) printf("\n");
printf("%3d" , tab[n]); } printf("\n"); }
小结
系统通过查找任务就绪表来 获取待运行任务的优先级
优先级
任务切换过程
其实,调度 器在进行调 度时,在这 个位置还要 进行一下判 断:究竟是 待运行任务 是否为当前 任务,如果 是,则不切 换;如果不 是才切换, 而且还要保 存被中止任 务的运行环
OSRdyGrp D7 D6 D5 D4 D3 D2 00 1 0 1 0
D1 D0 00
OSRdyTbl[y ] D7 D6 D5 D4
0110
D3 D2 00
D1 D0 00
y = OSUnMapTal[OSRdyGrp];
x= OSUnMapTal[OSRdyTbl[y]];
D7 D6 D5 D4 D3 D2 D1 D0 prio=29 0 0 0 1 1 1 0 1
先保护被中 止任务的断
点数据
后恢复待运 行任务的断
点数据
不要企图用PUSH和POP指令来使程序计数 器PC压栈和出栈,因为没有这样的指令。
只好需一变次要通由中一宏断下或O了S_者。TA一SK次_S调W(用)来来使引发 中断动作和过OS程Ct调xS用w指( 令) 可以使PC压栈; 中断返回指令可以执使行P任C出务栈切。换工作
3.4任务就绪表 及
任务调度
多任务操作系统的核心工作就是任务调 度。
所谓调度,就是通过一个算法在多个任 务中确定该运行的任务,做这项工作的函数 就叫做调度器。
μC/OS_II进行任务调度的思想是 “近 似地每时每刻总是让优先级最高的就绪任务 处于运行状态” 。为了保证这一点,它在 系统或用户任务调用系统函数及执行中断服 务程序结束时总是调用调度器,来确定应该 运行的任务并运行它 。
或
y = OSUnMapTbl[OSRdyGrp]; prio = (INT8U)((y << 3)
+ OSUnMapTbl[OSRdyTbl[y]]);
优先级判定表OSUnMapTbl[256] (os_core.c)
举例: 如OSRdyGrp的值为
00101000B,即0X28,则 查得 OSUnMapTbl[OSRdyGrp] 的值是3,它相应于 OSRdyGrp中的第3位置1;
};
优先级判定表OSUnMapTbl[256]
OSUnMapTbl[]这个数组的生成原则:先把 一个数用二进制表示,然后从低位往高位 数,返回第一次碰到1的位置。比如: OSUnMapTbl[0x111100(60)] = 2。可 以看到,如果要表示8位数的对应关系, 则数组的大小为2^8=256。这也是为什么 OSRdyTbl[],OSRdyGrp采用8位的原因。
多任务操作系统的核心工作就是任 务调度。
所谓调度,就是通过一个算法在多
个任务中任确务定该就运行绪的表任务,做这项工
μC/OS_II进行任务调度 及 作的函数就叫做调度器。 μC/OS_II进行任务调度的思想是
的依据就是任务就绪表 任务调度 “近似地每时每刻总是让优先级最高的 就绪任务处于运行状态” 。为了保证 这一点,它在系统或用户任务调用系统 函数及执行中断服务程序结束时总是调 用调度器,来确定应该运行的任务并运 行它 。
OSRdyGrp | =OSMapTbl[prio>>3]; OSRdyTbl[prio>>3] | = OSMapTbl[prio&0x07];
如果要使一个优先级别为prio的任务脱离就绪 状态则可使用如下类似代码:
if((OSRdyTbl[prio>>3]&=~OSMapTbl[prio&0x07])== 0)
再从代码生成的角度看看是如何得到这个 表的?
编程生成优先级判定表OSUnMapTbl[256]
#include <stdio.h> int main(void) {
int i,t,n; int tab[256]={0}; for(i=0;i<8;i++)
for(t=1;(t<<i)<256;t++) tab[t<<i]=i;
OSRdyGrp&=~OSMapTbl[prio>>3];
在就绪表中查找最高优先级任务
已经知道OSRdyGrp和OSRdyTbl 求优先级最高的任务的优先级,也就是先求 OSRdyGrp的从最低位找,第一个为1的位 置y;再求OSRdyTbl[y]的从最低位找,第 一个为1的位置x;prio=y*8+x; char OSRdyGrp,OSRdyTbl[8]; 如何编程实现?
X OSRdyTbl[prio>>3]
| = OSMapTbl[prio&0x07];
OSRdyGrp
OSRdyTbl[3 ]
D7 D6 D5 D4 D3 D2 D1 D0 D7 D6 D5 D4 D3 D2 D1 D0
1
1பைடு நூலகம்
把prio为29的任务置为就绪状态
在程序中,可以用类似下面的代码把优先 级别为prio的任务置为就绪状态:
图5-6 在就绪表中查找最高优先级别任务的过程
从任务就绪表中获取优先级别最高的就绪任务可用如下 类似的代码:
y = OSUnMapTal[OSRdyGrp]; //D5、D4、D3位
x = OSUnMapTal[OSRdyTbl[y]]; //D2、D1、D0位
prio = (y<<3)+x;
//优先级别
为了能够使系统清楚地知道,系统中 哪些任务已经就绪,哪些还没有就绪, μC/OS_II在RAM中设立了一个记录 表,系统中的每个任务都在这个表中 占据一个位置,并用这个位置的状态 (1或者0)来表示任务是否处于就绪 状态,这个表就叫做任务就绪状态表, 简称叫任务就绪表
任务就绪表就是一个二维数组OSRdyTbl[ ]
typedef struct os_tcb { OS_STK *OSTCBStkPtr; //指向任务堆栈栈顶的指针
…… struct os_tcb *OSTCBNext;//指向后一个任务控制块的指针 struct os_tcb *OSTCBPrev; //指向前一个任务控制块的指针
…… INT16U INT8U INT8U
6 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
7 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 y
任务就绪表的示意图
D7 D6 D5 D4 D3 D2 D1 D0 prio=29 0 0 0 1 1 1 0 1
OSRdyGrp | =OSMapTbl[prio>>3]; Y
while(i=0;i<8;i++){ if(OSRdyGrp%2!=0) break; else OSRdyGrp=OSRdyGrp/2;
}y=i; while(i=0;i<8;i++){
if(OSRdyTbl[y]%2!=0) break; else OSRdyTbl[y]=OSRdyTbl[y]/2; }x=i; prio=y*8+x;
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 2
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 3
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 4
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
5 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
OSTCBDly; //任务等待的时限(节拍数) OSTCBStat; //任务的当前状态标志 OSTCBPrio; //任务的优先级别
…… } OS_TCB;
当进行系统初始化时,初始化函 数会按用户提供的任务数为系统创建 具有相应数量的任务控制块并把它们 链接为一个链表。
由于这些任务控制块还没有对应 的任务,故这个链表叫做空任务块链 表。即相当于是一些空白的身份证。
任务控制块链表
空任务控制块链表
当应用程序调用函数OSTaskCreate( )创 建一个任务时,这个函数会调用系统函数 OSTCBInit ( )来为任务控制块进行初始 化。这个函数首先为被创建任务从空任务 控制块链表获取一个任务控制块,然后用 任务的属性对任务控制块各个成员进行赋 值,最后再把这个任务控制块链入到任务 控制块链表的头部
为加快访问任务就绪表的 速度,系统定义了一个变 量OSRdyGrp来表明就绪表 每行中是否存在就绪任务。
OSRdyGrp D7 D6 D5 D4 D3 D2 D1 D0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 x 7 6
OSRdyTbl[ ] 5 43 2 1 0
0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1
根据就绪表获得 获 待得 运待 行运 任行 务任 的务任 的 务任 控务 制控 块制 指块 针
处理器的SP=任 务块中保存的SP
恢复待运行任务 的运行环境
处理器的PC=任 务堆栈中的断点 地址
如何获得待运行 任务的任务控制
块?
任务切换宏 OS_TASK_SW( )
任务切换就是中止正在运行的任务 (当前任务),转而去运行另外一个 任务的操作,当然这个任务应该是就 绪任务中优先级别最高的那个任务
嵌入式实时操作系统
μC/OS-II
信息学院