您好,欢迎访问三七文档
第一章实时操作系统基础1.4基于优先级的不可剥夺内核1.内核:主要功能是进行任务调度。内核中最核心的基本服务就是调度的核心—任务切换。2.基于优先级的调度算法:在uC/OS中,可以同时有64个就绪任务,每个任务都有各自的优先级。优先级用无符号整数表示,从0~63,取值越大则优先级越低。uC/OS总是调度就绪了的、优先级最高的任务获得CPU的控制权。3.不可剥夺型内核和可剥夺型内核1.5同步与通信1.同步:有时候,一个任务完成的前提是需要另一个任务给出一个结果,任务之间的这种约束性的合作机制称为任务间的同步。2.互斥:共享资源称为临界资源,这种访问共享资源的排他性就是互斥。临界资源可以是全局变量,也可以是指针、缓冲区或链表等其他数据结构,也可以是如打印机、硬盘等硬件。要做到互斥访问临界资源,操作系统可以有多种方法,uC/OS采用的方法有关中断、给调度器上锁和使用信号量等。3.临界区:每个任务中访问共享资源的那段程序称为临界区。临界区不允许任务切换。为保证系统的实时性,临界区代码必须尽量短,能够在限定时间内完成。4.任务事件:事件就是操作系统运行过程中发生的事情。事件处理的对象主要有信号量、互斥信号量、事件标志组、邮箱、消息队列。5.信号量:信号量标识了共享资源的有效可被访问次数。6.互斥信号量:互斥信号量用于互斥资源的访问及在使用互斥信号量管理需要解决的优先级反转问题(采用优先级继承机制)。7.事件标志组:事件标志组管理的条件组合可以是多个事件都发生,也可以是多个事件中有任何一个事件发生,还可以是多个事件都没有发生或多个事件中有任何一个事件没有发生。8.消息邮箱:邮箱中的内容不是信件本身,而是指向消息内容的地址。9.消息队列:消息队列是由多个消息邮箱组合形成的,是消息邮箱的集合,实质上是消息邮箱的队列。同样是采用事件控制块来指示消息的位置和标记等待消息的任务。不同的是,消息队列自身有消息控制块这样的数据结构,事件控制块中指示的不再是消息的地址,而是消息控制块的地址,使用消息控制块可以先进先出的方式管理多条信息。1.6时钟、中断和内存管理1.中断:中断是实时地处理内部或外部事件的一种内部机制。中断源称为异步事件,处理异步事件所使用的程序是中断服务程序。2.时钟中断服务:在uC/OS中,通过对硬件的设置,使在10~200ms的时间间隔内产生一次时钟中断,在该时钟中断服务程序中,对延时的任务进行延时计数,检查系统中是否有高优先级任务就绪而没有得到运行,相应进行任务调度。3.内存管理:uC/OS中采用分区的方式管理内存,即将连续的大块内存按分区来管理,每个分区又包含数个内存块,每个内存块大小相同。uC/OS采用内存控制块来管理内存。内存控制块记录了内存分区的地址、分区中内存快的大小和数量,以及控制块的数量等信息。第二章任务管理操作系统内核运行后,进行一次初始化操作OSInit,对操作系统的重要数据结构如任务控制块、事件控制块。就绪表等进行初始化,并创建两个系统任务(统计任务和空闲任务)。然后创建一个TaskStart任务,该任务用于设置时钟中断服务程序,接着调用OSStart启动多任务,开始真正多任务地执行。2.1任务管理数据结构任务管理数据结构包括任务控制块、任务空闲链表和任务就绪链表、任务优先级指针表、任务堆栈等,是uC/OS-II内核的核心部分之一。这些数据的内容完全反映了任务的运行情况。1.任务优先级:优先级是任务的唯一标志。各个任务的优先级必须不同,因此uC/OS以优先级作为事件的标志,作为任务管理的主键。任务的优先级可以是0~63,优先级62和63被统计任务和空闲任务占用,数字越小,优先级越高。2.任务优先级指针表:任务优先级指针表是用来获取某优先级的任务的任务控制块地址。任务优先级指针表的定义如下:OS_TCB*OSTCBPrioTbl[OS_LOWEST_PRIO+1]假如创建一个优先级为5的任务,在取得任务控制块的地址之后,需要简单地把该地址赋值给OSTCBPrioTbl[5]。那么以后在根据优先级查找任务控制块的时候,不需要遍历就绪链表,因为OSTCBPrioTbl[5]中就是这个任务控制块的地址。3.任务控制块(OSTCBTbl):任务控制块是任务管理的核心数据结构,操作系统在启动的时候,首先要在内存中创建一定数量的任务控制块。任务控制块的数量等于操作系统能同时管理的最多任务数。每个任务都有自己的任务控制块。OS_STK*OSTCBStkPtr任务堆栈的指针void*OSTCBExtPtr扩展块的指针★OS_STK*OSTCBStkBottom任务堆栈的栈底地址INT32U*OSTCBStkSize任务堆栈的大小INT16UOSTCBOpt扩展的选项INT16UOSTCBId任务IDstructos_tcb*OSTCBNext指向下一个任务控制块的指针OSTCBNextstructos_tcb*OSTCBPrev指向上一个任务控制块的指针OSTCBPrevOS_EVENT*OSTCBEventPtr指向事件控制块的指针★OS_EVENT**OSTCBEventMultiPtr多事件控制块指针★viod*OSTCBMsg消息地址★OS_FLAG_NODE*OSTCBFlagNode事件标志节点★OS_FLAGSOSTCBFlagsRdy事件标志★INT32UOSTCBDly任务延时时间INT8UOSTCBStat任务状态INT8UOSTCBStatPend事件等待标志INT8UOSTCBPrio任务优先级INT8UOSTCBX任务优先级低3位INT8UOSTCBY任务优先级右移3位INT8UOSTCBBitX优先级在就绪表中的位置INT8UOSTCBBitY任务在就绪组中的位置BOOLEANOSTCBDelReq任务删除请求标志★INT32UOSTCBCtxSwCtr切换到该任务的次数★INT32UOSTCBCyclesTot任务运行的总的时间周期INT32UOSTCBCyclesStartOS_STK*OSTCBStkBase任务堆栈的起始地址INT32UOSTCBStkUsed任务堆栈中使用过的空间数INT8U*OSTCBTaskName任务名称★INT32UOSTCBRegTbl[OS_TASK_REG_TBL_SIZE]★★:表示条件编译(a)uC/OS将任务控制块划分为两个链表:就绪链表和空闲链表。创建任务的时候就从空闲链表中取出一个空闲的任务控制块。(b)Tybedefstructos_tcb{;}OS_TCB;定义了新的类型OS_TCB,代表结构体structos_tcb。(c)uC/OS-II是以结构体数组的形式生成了任务控制块的实体,声明如下:OS_TCBOSTCBTbl[OS_MAX_TASKS+OS_N_SYS_TASKS],在定义了结构体的实体后,控制块的0地址就存储了任务堆栈的栈顶地址。(d)任务控制块实体的声明的程序代码定义了系统任务总数个任务控制块数组,于是这些控制块对应的数组元素为OSTCBTbl[0]~OSTCBTbl[OS_MAX_TASKS+OS_N_SYS_TASKS-1],它们占用连续的内存空间。(e)任务状态(OSTCBStat)取值范围宏取值含义OS_STAT_RDY0x00任务未等待事件且未挂起OS_STAT_SEM0x01任务等待信号量OS_STAT_MBOX0x02任务等待邮箱OS_STAT_Q0x04任务等待消息队列OS_STAT_SUSPEND0x08任务挂起OS_STAT_MUTEX0x10任务等待互斥信号量OS_STAT_FLAG0x20任务等待事件标志(f)#defineOS_STAT_PEND_ANY(OS_STAT_SEM|OS_STAT_MBOX|OS_STAT_Q|OS_STAT_MUTEX|OS_STAT_FLAG)(g)任务控制块事件等待标志OSTCBStatPend宏说明OS_STAT_PEND_OK因为事件发生,等待结束OS_STAT_PEND_ABORT事件等待失败OS_STAT_PEND_TO超时时间到,等待结束4.空闲链表和就绪链表:(1)创建一个新任务,前提条件就是系统中还有空闲任务块。(2)这两个链表在操作系统的初始化程序OSInit中创建的。(3)OSTCBFreeList永远指向空闲链表的表头,如果为0,说明没有空闲任务控制块了;OSTCBList永远指向就绪链表的表头,如果它为0,说明没有就绪任务了。(4)空闲表是单向链表,就绪表是双向链表。向就绪链表中插入一个任务控制块,放在就绪链表的表头。5.任务堆栈:为了满足任务切换或响应中断时保存CPU寄存器中的内容,以及存取任务私有数据的需要,每个任务都有自己的堆栈。(1)任务堆栈在操作系统中的定义如以下程序所示:#defineTASK_STK_SIZE512typedefunsignedintOS_STK;OS_STKTaskStk[OS_MAX_TASKS][TASK_STK_SIZE];TASK_STK_SIZE是每个任务堆栈的大小,根据具体情况做移植时需修改此值。OS_MAX_TASKS是用户任务的数量,根据移植的系统需要进行修改。统计任务和空闲任务的堆栈是单独定义的,分别是OSTaskStatStk和OSTaskIdleStk。(2)任务堆栈根据地址的增长方向,分为向下增长型和向上增长型。(3)如果堆栈是向下增长的,也就是高地址向低地址增长,栈顶为TaskStk[0][511],栈底为TaskStk[0][0]。(4)如果堆栈是向上增长的,也就是低地址向高地址增长,栈顶为TaskStk[0][0],栈底为TaskStk[0][511]。(5)由此可知,在任务控制块中,OSTCBStkPtr是指向任务堆栈栈顶的指针,OSTCBStkBottom是指向任务堆栈栈底的指针,OSTCBStkSize是任务堆栈的大小,如果OSTCBStkPtr与OSTCBStkBottom相等,说明堆栈已经满了。6.任务就绪表和就绪组:(1)就绪组和就绪表定义的相关代码如下:typedefunsignedcharINT8U#defineOS_RDY_TBL_SIZE((OS_LOWEST_PRIO)/8+1);INT8UOSRdyGrp;INT8UOSRdyTbl[OS_RDY_YBL_SIZE];(2)优先级为Prio的任务就绪,设置其在就绪表和就绪组中的位置,程序如下:OSRdyGrp|=OSMapTbl[prio3];OSRdyTbl[prio3]|=OSMapTbl[prio&0x07];(3)查找表OSMapTbl[]INT8UconstOSMapTbl[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};(4)查找程序代码如下:y=OSUnMapTbl[OSRdyGrp];OSPrioHighRdy=(INT8U)((y3)+OSUnMapTbl[OSRdyTbl[y]]);(5)取消当前优先级在就绪表和就绪组中的位置,程序如下:y=OSTCBCur-OSTCBY;OSRdyTbl[y]&=(OS_PRIO)~OSTCBCur-OSTCBBitX;if(OSRdyTbl[y]==0u){OSRdyGrp&=(OS_PRIO)~OSTCBCur-OSTCBBitY;}2.2任务控制块初始化:0S_TCBInit1.任务控制块的初始化是在创建任务的时候必须要执行的操作,对任务控制块和一些相关的数据结果进行了处理。2.任务控制块初始化函数:0S_TCBInit。该函数属于操作系统内部函数,不应该在外部调用。3.函数声明:INT8U0S_TCBInit(INT8Uprio,被创建任务的优先级OS_STK*ptos,任务堆栈栈顶的地址OS_STK*pbos,任务堆栈栈底的地址INT16Uid,任务IDINT32Ustk_size,堆栈的大小void*pext,任务控制块的扩展块地址INT16Uopt)其他的选项4.函数返回值
本文标题:操作系统笔记
链接地址:https://www.777doc.com/doc-4685821 .html