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

下载本文档

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

文档简介

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

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

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

任务B任务C

所有任务相同对待,分时运行。调度算法时间片轮询1优先级调度2带优先级调度的时间片轮询3+

低优先级+

中优先级+

高优先级任务A

任务B任务C

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

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

这样,在任务控制块中不仅不需要保存时钟任务剩余的时钟节拍,而且也不必编写计算任务的剩余时间和设置任务时间片的代码。TinyOS51从V1.0到V1.1的改变变TinyOS51V1.0TinyOS51v1.1任务调度函数tnOsSched()__tnOsSched()任务延时函数无tnOsTimeDly()时钟节拍处理函数无tnOsTimeTick()TinyOS51V1.0和TinyOS51V1.1的API不同点提供操作系统统的一种基本本服务——延时服务,延延时以时钟节节拍为单位。。在TinyOS51中,时钟节拍拍中断由用户户实现,在时时钟节拍中断断处理函数中中调用tnOsTimeTick()。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.启动系统*/voidmain(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测试变量全局局变变量量定定义义函数数实实现现目录录3任务务控控制制块块45内部部变变量量初初始始化化创建建任任务务12概述述整体体规规划划任务务控控制制块块TinyOS51V1.1增加加了了延延时时服服务务功功能能,,因因此此,,在在TCB中增增加加了了一一个个记记录录时时间间的的成成员员uiTicks。#define__TN_TASK_FLG_DEL0x00//任务务被被删删除除#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];//任务务控控制制块块数数组组与任任务务控控制制块块相相关关代代码码::目录录4内部部变变量量初初始始化化56创建建任任务务启动动多多任任务务环环境境23整体体规规划划任务务控控制制块块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初始化函数数代码:目录录5创建任务67启动多任务务环境任务调度34任务控制块块内部变量初初始化通常,为了了提高可移移植性,采采用一个宏宏或函数来来编写实现现开中断和和关中断程程序。由于于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;//允许中断}目录录6启动多任务务环境78任务调度时钟节拍中中断45内部变量初初始化创建任务tnOsStart()在TinyOS51V1.1中,如果不不允许中断断,则时钟钟节拍中断断服务程序序不会运行行,因此,,在tnOsStart()中增加允许许中断的代代码。voidtnOsStart(void){EA=1;//允许中断longjmp(__GtcbTask[0].jbTaskContext);//执行0号任务}tnOsInit()中__GthTaskCur=0,即当前运行行任务为0号任务。目录录7任务调度89时钟节拍中中断longjmpInIsr()56创建任务启动多任务务环境__tnOsSched()tnOsSched()开/关中断代码码__tnOsSched()TinyOS51V1.0TinyOS51V1.1任务调度函函数__tnOsSched()中也要操作作TCB,因此也需需要加入开开/关中断代代码包含含临界区区。另外外,__tnOsSched()不再提供供给任务务直接调调用,仅仅供内部部调用,,因此添添加前缀缀“__”。保护临界界资源目录录8时钟节拍拍中断9longjmpInIsr()任务延时时67启动多任任务环境境任务调度度10如果uiTicks不为0,则uiTicks--,即缩短短延时时时间。未未使用任任务状态态标志判判断任务务是否处处于延时时状态。。这是因因为TinyOS51更高的版版本具有有超时功功能,需需要使用用uiTicks来判断任任务是否否超时。。如果uiTicks为0,则将任任务设置置为就绪绪状态。。为了向向上兼容容超时代代码,即即区分系系统服务务是正常常返回还还是超时时返回,,未直接接将任务务设置为为就绪状状态,而而使用““|=”操作。。时钟节拍拍中断大多数操操作系统统中的延延时管理理和中断断服务程程序中的的任务切切换功能能,分别别是用两两个函数数实现的的,由于于TinyOS51V1.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对于80C51来说,规规定:一一般函数数返回使使用RET指令,而而中断返返回使用用RETI指令。由由于longjmp()函数是使使用RET指令返回回的,如如果在时时钟节拍拍中断中中继线使使用longjmp(),则任务务切换后后CPU会认为中中断仍未未退出,,同级中中断(包包括自身身)将被被屏蔽,,从而造造成整个个系统执执行错误误。因此此必须将将longjmp()函数改为为longjmpInIsr()。时钟节拍拍中断大多数操操作系统统中的延延时管理理和中断断服务程程序中的的任务切切换功能能,分别别是用两两个函数数实现的的,由于于TinyOS51V1.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目录录9longjmpInIsr()任务延时时删除任务务78任务调度度时钟节拍拍中断1110中断中切切换任务务在中断中中切换任任务,不不能再使使用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指令令。。目录录任务务延延时时删除除任任务务78时钟钟节节拍拍中中断断longjmpInIsr()1110任务务延延时时函函数数tnOsTimeDly()voiddelay(unsignedintuiDly){unsignedinti,

j;for(i=0;i<uiDly;i++){ for(j=0;j<1000;j++){ }}}CPU处于空转状态,效率太低。传统延时voidtnOsTimeDly(unsignedintuiTick){if(uiTick!=0){ EA=0; __GtcbTasks[__GthTaskCur].ucTaskStat

=__TN_TASK_FLG_DLY; __GtcbTasks[__GthTaskCur].uiTick=uiTick; EA=1;}__tnOsSched();__GtcbTasks[__GthTaskCur].ucTaskStat

=__TN_TASK_FLG_RDY;

//延时结束}任务延时切换换到到其其他他任任务务运运行行设置置延延时时时时间间,,让让时时钟钟节节拍拍处处理理函函数数tnOsTimeTick()更新新剩剩余余的的延延时时时时间间。。目录录删除除任任务务任务务延延时时78时钟钟节节拍拍中中断断longjmpInIsr()1011删除除任任务务函函数数tnOsTaskDel()与V1.0版本本相相比比,,TinyOS51V1.1版本本在在tnOsTaskDel()函数数中中增增加加了了初初始始化化uiTicks和开开/关中中断断代代码码。。voidtnOsTaskDel(TN_OS_TASK_HANDLEthTask){……….EA=0;__GtcbTasks[thTask].ucTaskStat=__TN_TASK_FLG_DEL;__GtcbTasks[thTask].uiTicks=0;EA=1;if(thTask==__GthTaskCur){__tnOsSched();}}9、静夜夜四无无邻,,荒居居旧业业贫。。。1月-231月-23Sunday,January1,202310、雨雨中中黄黄叶叶树树,,灯灯下下白白头头人人。。。。20:31:0920:31:0920:311/1/20238:31:09PM11、以我我独沈沈久,,愧君君相见见频。。。1月-2320:31:0920:31Jan-2301-Jan-2312、故人江江海别,,几度隔隔山川。。。20:31:0920:31:0920:31Sunday,January1,202313、乍见见翻疑疑梦,,相悲悲各问问年。。。1月-231月-2320:31:0920:31:09January1,202314、他乡生白白发,旧国国见青山。。。01一月月20238:31:09下下午20:31:091月-2315、比不了了得就不不比,得得不到的的就不要要。。。。一月238:31下午午1月-2320:31January1,202316、行动动出成成果,,工作作出财财富。。。2023/1/120:31:0920:31:0901January202317、做前,能够够环视四周;;做时,你只只能或者最好好沿着以脚为为起点的射线线向前。。8:31:09下午8:31下下午20:31:091月-239、没没有有失失败败,,只只有有暂暂时时停停止止成成功功!!。。1月月-231月月-23Sunday,January1,202310、很多多事情情努力力了未未必有有结果果,但但是不不努力力却什什么改改变也也没有有。。。20:31:0920:31:0920:311/1/20238:31:09PM11、成功就是日日复一日那一一点点小小努努力的积累。。。1月-2320:31:1020:31Jan-2301-Jan-2312、世间间成事事,不不求其其绝对对圆满满,留留一份份不足足,可可得无无限完完美。。。20:31:1020:31:1020:31Sunday,January1,202313、不不知知香香积积寺寺,,数数里里入入云云峰峰。。。。1月月-231月月-2320:31:1020:31:10January1,202314、意志坚坚强的人人能把世世界放在在手中像像泥块一一样任意意揉捏。。01一一月20238:31:10下午午20:31:101月-2315、楚塞塞三湘湘接,,荆门门九派派通。。。。。一月238:31下下午午1月-2320:31January1,202316、少年年十五五二十十时,,步行行夺得得胡马马骑。。。2023/1/120:31:1020:31:1001January202317、空山

温馨提示

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

评论

0/150

提交评论