时间片轮询多任务操作系统教材_第1页
时间片轮询多任务操作系统教材_第2页
时间片轮询多任务操作系统教材_第3页
时间片轮询多任务操作系统教材_第4页
时间片轮询多任务操作系统教材_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

5.4时间片轮询多任务操作系统时间片轮询多任务操作系统教材第1页目录1概述2整体规划3任务控制块4内部变量初始化5创建任务6开启多任务环境longjmpInIsr()

9任务调度7时钟节拍中止8任务延时10删除任务11时间片轮询多任务操作系统教材第2页运行任务难以得知其它任务状态,任务切换时机难以把握。假如一个任务死掉,势必造成整个系统死掉。协作式多任务系统任务协作式多任务系统特点安全性复杂性协作式多任务系统中,任务切换需正在运行任务主动让出CPU,这不但带来一些安全隐患,而且使程序设计相当复杂。任务调度任务调度交给操作系统,引入调度算法时间片轮询多任务操作系统教材第3页调度算法时间片轮询1优先级调度2带优先级调度时间片轮询3时间片轮询多任务操作系统教材第4页调度算法时间片轮询1tt任务运行时间时间片轮询系统中任务运行情况在时间片轮询操作系统中,CPU执行时间被划分为若干时间片,然后让处于就绪状态任务,按次序轮番占用CPU。当初间片用完时,即使任务未执行完,系统也剥夺此任务CPU使用权力。时间片长度Δt普通为1~10ms

优先级调度2带优先级调度时间片轮询3任务A

任务B任务C

全部任务相同对待,分时运行。时间片轮询多任务操作系统教材第5页调度算法时间片轮询1优先级调度2带优先级调度时间片轮询3+

低优先级+

中优先级+

高优先级任务A

任务B任务C

t高优先级任务先运行t高优先级任务抢占低优先级任务不一样任务不一样对待,优先级高任务先运行。时间片轮询多任务操作系统教材第6页调度算法时间片轮询1优先级调度2带优先级调度时间片轮询3这种调度算法情况较复杂,类型较多,自己去学习了解。时间片轮询多任务操作系统教材第7页任务切换时机分配给任务时间片已到任务主动请求调度12任务在调用操作系统提供“管理”类服务(如删除任务等)和“等候”类服务(如延时、获取信号量、等候消息等)时,会主动请求调度。操作系统采取一个周期性中止来管理时间片,在这个中止服务函数中,判断运行任务是否用完了时间片。中止中切换任务使用时间片轮询调度操作系统中,会在两种下进行任务切换。时间片轮询多任务操作系统教材第8页目录2整体规划1概述34任务控制块内部变量初始化时间片轮询多任务操作系统教材第9页时间片轮询操作系统规划时间片轮询调度算法时间片轮询多任务操作系统协作式多任务系统TinyOS51V1.0TinyOS51V1.1

TinyOS51V1.1采取最简单时间片轮询调度算法,在每个时钟节拍中止时调度,即分配给任务时间片为一个时钟节拍。

这么,在任务控制块中不但不需要保留时钟任务剩下时钟节拍,而且也无须编写计算任务剩下时间和设置任务时间片代码。时间片轮询多任务操作系统教材第10页TinyOS51从V1.0到V1.1改变TinyOS51V1.0TinyOS51v1.1任务调度函数tnOsSched()__tnOsSched()任务延时函数无tnOsTimeDly()时钟节拍处理函数无tnOsTimeTick()TinyOS51V1.0和TinyOS51V1.1API不一样点提供操作系统一个基本服务——延时服务,延时以时钟节拍为单位。在TinyOS51中,时钟节拍中止由用户实现,在时钟节拍中止处理函数中调用tnOsTimeTick()。时间片轮询多任务操作系统教材第11页voidtask0(void){TMOD=(TMOD&0xF0)|0x01;TL0=0x00;//TH0=0x00;//初始化timer0,即TR0=1;//初始化时钟节拍ET0=1;//中止。TF0=0;//while(1){__GucTask0++;}}/**一个简单任务,无限循环中让*__GucTask0++。*/voidtask1(void){while(1){__GucTask0++;}}/**用户实现时钟节拍中止服务函数,*并调用tnOsTimeTick()。*/voidtimer0ISR(void)__interrupt1{tnOsTimeTick();}/**1.初始化系统*2.创建任务*3.开启系统*/void

main(void){tnOsInit();tnOsTaskCreate(task0,__GucTaskStks[0];tnOsTaskCreate(task1,__GucTaskStk[1]);tnOsStart();}资源配置与示例任务函数task0()和task1()时钟节拍中止服务函数timer0ISR()main函数main()staticidataunsignedchar__GucTaskStk[2][32];staticunsignedchar__GucTask0;staticunsignedchar__GucTask1;//分配任务堆栈//任务0测试变量//任务1测试变量全局变量定义函数实现时间片轮询多任务操作系统教材第12页目录3任务控制块45内部变量初始化创建任务12概述整体规划时间片轮询多任务操作系统教材第13页任务控制块

TinyOS51V1.1增加了延时服务功效,所以,在TCB中增加了一个统计时间组员uiTicks。#define__TN_TASK_FLG_DEL

0x00

//任务被删除#define__TN_TASK_FLG_RDY0x01

//任务就绪#define__TN_TASK_FLG_DLY0x02

//任务延时structtn_os_tcb{jmp_bufjbTaskContext;

//任务上下文unsignedcharucTaskStat;

//任务状态unsignedintuiTicks;

//任务延时时间};typedefstructtn_os_tcbTN_OS_TCB;staticdataTN_OS_TCB__GtcbTasks[TN_OS_MAX_TASKS];

//任务控制块数组与任务控制块相关代码:时间片轮询多任务操作系统教材第14页目录4内部变量初始化56创建任务开启多任务环境23整体规划任务控制块时间片轮询多任务操作系统教材第15页tnOsInit()voidtnOsInit(void){TN_OS_TASK_HANDLEthTask;

//操作任务for(thTask=0;thTask<TN_OS_MAX_TASKS;thTask++){__GtcbTasks[thTask].ucTaskStat=__TN_TASK_FLG_DEL;

//任务初始处于删除状态

__GtcbTasks[thTask].uiTicks=0;

//设置初值}

__GthTaskCur=0;

//初始运行0号任务}因为TCB增加了一个uiTicks,则在tnOsInit()中进行初始化。OS初始化函数代码:时间片轮询多任务操作系统教材第16页目录5创建任务67开启多任务环境任务调度34任务控制块内部变量初始化时间片轮询多任务操作系统教材第17页通常,为了提升可移植性,采取一个宏或函数来编写实现开中止和关中止程序。因为TinyOS51仅适合80C51系列单片机,故直接使用“EA=0”和“EA=1”。创建任务函数tnOsTaskCreate()因为tnOsTaskCreate()要操作TCB,而时钟节拍中止中也要操作TCB,所以tnOsTaskCreate()中操作TCB代码为临界区代码,要防止被时钟节拍中止打断。

TinyOS51中采取开/关中止方式处理此问题。TN_OS_TASK_HANDLEtnOsTaskCreate(void(*pfuncTask)(void), idataunsginedchar*pucStk){TN_OS_TASK_HANDLEthRt;for(thRt=0;thRt<TN_OS_MAX_TASKS;thRt++){

EA=0;

//禁止中止 if(__GtcbTasks[thRt].ucTaskStat==__TN_TASK_FLG_DEL){

setTaskJmp(pfuncTask,pucStk,__GtcbTasks[thRt].jbTaskContext);__GtcbTask[thRt].ucTaskStat=__TN_TASK_FLG_RDY;

EA=1;

//允许中止 returnthRt; }

EA=1;

//允许中止}时间片轮询多任务操作系统教材第18页目录6开启多任务环境78任务调度时钟节拍中止45内部变量初始化创建任务时间片轮询多任务操作系统教材第19页tnOsStart()

在TinyOS51V1.1中,假如不允许中止,则时钟节拍中止服务程序不会运行,所以,在tnOsStart()中增加允许中止代码。voidtnOsStart(void){ EA=1;

//允许中止 longjmp(__GtcbTask[0].jbTaskContext);

//执行0号任务}tnOsInit()中__GthTaskCur

=

0,即当前运行任务为0号任务。

时间片轮询多任务操作系统教材第20页目录7任务调度89时钟节拍中止longjmpInIsr()

56创建任务开启多任务环境时间片轮询多任务操作系统教材第21页__tnOsSched()tnOsSched()开/关中止代码__tnOsSched()TinyOS51

V1.0

TinyOS51

V1.1

任务调度函数__tnOsSched()中也要操作TCB,所以也需要加入开/关中止代码包含临界区。另外,__tnOsSched()不再提供给任务直接调用,仅供内部调用,所以添加前缀“__”。保护临界资源时间片轮询多任务操作系统教材第22页目录8时钟节拍中止9longjmpInIsr()

任务延时67开启多任务环境任务调度10时间片轮询多任务操作系统教材第23页假如uiTicks不为0,则uiTicks--,即缩短延时时间。未使用任务状态标志判断任务是否处于延时状态。这是因为TinyOS51更高版本含有超时功效,需要使用uiTicks来判断任务是否超时。假如uiTicks为0,则将任务设置为就绪状态。为了向上兼容超时代码,即区分系统服务是正常返回还是超时返回,未直接将任务设置为就绪状态,而使用“|=”操作。时钟节拍中止大多数操作系统中延时管理和中止服务程序中任务切换功效,分别是用两个函数实现,因为TinyOS51

V1.1是纯粹时间片轮询操作系统,非时钟节拍中止中止服务程序不进行任务切换操作,所以将二者合二为一。for(thTask=0;thTask<TN_OS_MAX_TASKS;thTask++){ if(__GtcbTasks[thTask].uiTicks!=0){ __GtcbTasks[thTask].uiTicks--;//缩短延时时间 if(__GtcbTasks[thTask].uiTicks==0){ __GtcbTasks[thTask].ucTaskStat

|=__TN_TASK_FLG_RDY;

//设置任务就绪状态位 } }}}延时管理1任务切换2时间片轮询多任务操作系统教材第24页对于80C51来说,要求:普通函数返回使用RET指令,而中止返回使用RETI指令。因为longjmp()函数是使用RET指令返回,假如在时钟节拍中止中继线使用longjmp(),则任务切换后CPU会认为中止仍未退出,同级中止(包含本身)将被屏蔽,从而造成整个系统执行错误。所以必须将longjmp()函数改为longjmpInIsr()。时钟节拍中止大多数操作系统中延时管理和中止服务程序中任务切换功效,分别是用两个函数实现,因为TinyOS51

V1.1是纯粹时间片轮询操作系统,非时钟节拍中止中止服务程序不进行任务切换操作,所以将二者合二为一。for(thTask=0;thTask<TN_OS_MAX_TASKS;thTask++){thTmp2++;if(thTmp2>=TN_OS_MAX_TASKS){thTmp2=0;}if((__GtcbTasks[thTmp2].ucTaskStat&__TN_TASK_FLG_RDY)!=0){cTmp1=setjump(__GtcbTask[__GthTaskCur].jbTaskContext);//保持上下文if(cTmep1==0){__GthTaskCur=thTmp2;longjmpInIsr(__GtcbTasks[thTmp2].jbTaskContext);//中止中切换上下文}}}延时管理1任务切换2时间片轮询多任务操作系统教材第25页目录9longjmpInIsr()

任务延时删除任务78任务调度时钟节拍中止1110时间片轮询多任务操作系统教材第26页中止中切换任务

在中止中切换任务,不能再使用longjmp(),因为中止需要使用专用返回指令RETI,非RET指令。charlongjmpInIsr(jmp_bufBuf)__naked{unsignedcharucSpSave;//用于保留堆栈指针变量dataunsignedchar*pucBuf=(datavoid*)0;//指向上下文信息存放位置指针pucBuf=(dataunsignedchar*)jbBuf;ucSpSave=*pucBuf++;bp=*pucBuf++;*((dataunsignedchar*)((char)(ucSpSave)))=*pucBuf++;*((dataunsignedchar*)((char)(ucSpSave–1)))=*pucBuf;SP=ucSpSave;DPL=1;_asmRETI_endasm;}将DPL设置为1,使返回值为1。因为SDCC51要求:char类型返回值保留在DPL中。采取__naked修饰,表示此函数是无保护,即编译器不会生成此函数起始和结尾代码。使用者将完全控制这个过程,这里用于加入RETI指令。时间片轮询多任务操作系统教材第27页目录任务延时删除任务78时钟节拍中止longjmpInIsr()

1110时间片轮询多任务操作系统教材第28页任务延时函数tnOsTimeDly()

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论