μcos-II任务延时

    μcos-II中运行的程序是多任务的,但每次只能有一个任务获得CPU使用权然后运行程序,而每个任务自身却又都是无限循环的,那么问题就来了,既然每个任务都是无限循环的,那么一旦高优先级任务获得了CPU使用权后,低优先级任务是怎么得到执行的呢?

    这就涉及到了任务延时的问题,为了保证任务能够进行切换,高优先级任务就得在自己执行的程序里面调用延时函数,例如OSTimeDly()函数,使当前的任务在运行到延时函数的时候,让出CPU的使用权,使得CPU去执行其它的任务。通过这样的方法,使得低优先级任务可以得到执行,OSTimeDly()函数代码如下:

void  OSTimeDly (INT16U ticks)  
{  
#if OS_CRITICAL_METHOD == 3                      //中断函数被设定为模式3  
    OS_CPU_SR  cpu_sr;  
#endif      
  
  
    if (ticks > 0) {   
	    //如果延时设定为0值,表示不想对任务延时,返回调用任务  
        OS_ENTER_CRITICAL();        //关闭中断  
        if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {  
		     /* Delay current task        */  
            OSRdyGrp &= ~OSTCBCur->OSTCBBitY;  
        }  
        //非0值会使得任务延时函数OSTimeDly()将当前任务从就绪表中移除  
        OSTCBCur->OSTCBDly = ticks;    //接着,这个延时节拍数会被保存在当前任务的OS_TCB中  
        OS_EXIT_CRITICAL();     //打开中断  
        OS_Sched();             //既然任务已经不再处于就绪任务,(任务调度),任务调度程序会执行下一个优先级最高的就绪任务  
    }  
} 
    μcos-II中运行的程序是多任务的,但每次只能有一个任务获得CPU使用权然后运行程序,而每个任务自身却又都是无限循环的,那么问题就来了,既然每个任务都是无限循环的,那么μcos-II系统是怎么做到任务之间能够相互切换的呢?
    这就涉及到了任务延时的问题,为了保证任务能够进行切换,每个任务就得在自己执行的程序里面调用延时函数,例如OSTimeDly()函数,使当前的任务在运行到延时函数的时候,让出CPU的使用权,使得CPU去执行其它的任务。通过这样的方法,使得任务间可以进行不断地切换,OSTimeDly()函数代码如下:

INT8U OSTimeDlyResume (INT8U prio)  
{  
	OS_TCB *ptcb;  
	if (prio >= OS_LOWEST_PRIO) { /*优先级判别*/  
		return (OS_ERR_PRIO_INVALID);  
	}  
	OS_ENTER_CRITICAL();  
	ptcb = OSTCBPrioTbl[prio]; /*任务必须存在才能恢复 */  
	if (ptcb == (OS_TCB *)0) {  
		OS_EXIT_CRITICAL();  
	return (OS_ERR_TASK_NOT_EXIST); /*任务优先级指针表中没有此任务*/  
	}  
	if (ptcb == OS_TCB_RESERVED) {  
		OS_EXIT_CRITICAL();  
	return (OS_ERR_TASK_NOT_EXIST); /*任务还是不存在,该任务块被其他任务占用*/  
	}  
	if (ptcb->OSTCBDly == 0u) { /*任务是否被延时,或设置了超时,若没有,本函数将无的放矢*/  
		OS_EXIT_CRITICAL();  
	return (OS_ERR_TIME_NOT_DLY); (1)  
	}  
	ptcb->OSTCBDly = 0u; /*OSTCBDly被强行设置为0*/  
	if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) (2)  
	/*都是我们熟悉的数据结构,如果任务在等待事件的发生*/  
	{  
		ptcb->OSTCBStat&= ~OS_STAT_PEND_ANY; /*清OSTCBStat中的事件等待标志*/ (3)  
		ptcb->OSTCBStatPend=OS_STAT_PEND_TO; /*指示不再等待的原因是因为超时*/  
	} 
	else {  
		/*对于只是时间延时的任务*/  
		ptcb->OSTCBStatPend = OS_STAT_PEND_OK;/*结束等待的原因是等待结束了(恢复了延时的任务)*/  
	}  
	/*如果任务不是被挂起,对被挂起的任务一定要用OSTaskResume 来恢复*/  
	if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { (4)  
		/*以下使任务就绪*/  
		OSRdyGrp |= ptcb->OSTCBBitY;  
		OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;  
		OS_EXIT_CRITICAL();  
		/*被恢复的任务可能是比现在运行的任务具有更高的优先级,因此在这里执行一次任务调度,不需要等到  
		时钟中断*/  
		OS_Sched();  
	} 
	else {  
		OS_EXIT_CRITICAL(); /*任务是被挂起的,不允许使用本函数恢复*/  
	}  
	return (OS_ERR_NONE);  
} 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
几年前,邵贝贝教授将MicroC/OS-II The Real-Time Kernel一书译成了中文,并在中国出版,说明该书的价值得到了更多人的认可。2002年上半年,笔者出版了这本书的第2版本,对书的内容和书后所附的源代码都做了大量的改动。笔者相信,翻译第2版本的工作量决不会少于第1版本。感谢邵教授百忙中抽时间完成这一繁琐的工作。 过去几年中,一直有很多中国用户与笔者保持着通信联系。中国用户对嵌入式系统、特别是对μC/OS-II表现出极大的兴趣。多数通信交往来自学术界,随着基地在中国的电子产品制造业的发展,他们对μC/OS-II的兴趣也越来越浓厚。 对于大专院校的学生,μC/OS-II是实时操作系统(RTOS)的极好教材。试着用一用RTOS,获得一些RTOS的使用经验,不需要花什么钱,μC/OS-II是在校学生完成研究生论文和本科生毕业设计的绝好工具。μC/OS-II可以使读者专注于自己的研究课题,而不必为程序结构花很多时间。有大量移植范例可以从Micrium的??(www.micrium.com)上免费下载。μC/OS-II的性能可以与许多高端商业软件产品媲美,某些性能比它们还要好。 μC/OS-II已经在世界范围内得到广泛使用,包括诸多领域,如手机、路由器、集线器、不间断电源、飞行器、医疗设备及工业控制等。实际上,μC/OS-II已经通过了非常严格的测试,并且得到了美国航空管理局(Federal Aviation Administration)的认证,可以用在飞行器上。这说明μC/OS-II是稳定可靠的,可用于与人性命攸关的安全紧要(safety critical)系统;当然,也可用于非安全紧要系统。 μC/OS-II一直在不断地向前发展。书的出版有个过程,书出版时,书中描述的可能已不是当前的最新版本;故我请邵教授在翻译这本书时,仍用μC/OS-II的V2.52版本,以同原书版本一致。笔者建议,如果读者只想学习μC/OS-II,仍应使用V2.52版本。如果想将μC/OS-II嵌入到商业产品中,请与我们Micrium公司(或我们的中国代理)联系,以获得使用许可证并得到最新版本。关于使用许可证,可直接向以下地址申请:licensing@micrium.com,请附上用户姓名、公司名以及联系电话。 关于μC/OS-II今后升级方面的设想是多方面的,请关注Micrium网站。笔者打算今后将μC/OS-II可以管理的任务数目增加到250个,进一步改进调度算法,使之效率更高。将来的μC/OS-II可以在任务或中断服务子程序中直接给别的任务发消息,而不必通过诸如消息队列等。也还会给μC/OS-II增加一些新的功能函数。 1999年,笔者注册了一家名为Micrium的公司,目的是开发并销售类似μC/OS-II的软件。目前可提供的其他软件产品还有: ●μC/GUI (嵌入式用户图形界面); ●μC/FS (嵌入式文件系统)。 Micrium计划中的产品也都是专门面向嵌入式系统应用的。所有产品都提供源代码,其中大多数软件的质量也同μC/OS-II一样好。 多年来,我一直参加美国的嵌入式系统年会(Embedded System Conference),并在会上做两三次讲演。我也打算参加一次中国的嵌入式系统年会,或许我们能在会上见面。 如果发e-mail给我,我会尽力给予回复;但是请用英文书写,以谅解我不懂中文。不必顾虑自己的英文不够好,总比我的中文要好得多吧。 如同笔者从写书得到乐趣,愿读者从阅读此书中得到更多的乐趣。 μC/OSII是著名的、源码公开的实时内核,是专为嵌入式应用设计的,可用于各类8位、16位和32位单片机或DSP。从μC/OS算起,该内核已有10余年应用史,在诸多领域得到了广泛应用。   本书是MicroC/OSII The Real Time Kernel一书的第2版本,在第1版本(V2.0)基础上做了重大改进与升级。通过对μC/OSII源代码的分析与描述,讲述了多任务实时的基本概念、竞争与调度算法、任务间同步与通信、存储与定时的管理以及如何处理优先级反转问题;介绍如何将μC/OSII移植到不同CPU上,如何调试移植代码。在所附光盘中,给出已通过FAA安全认证的μC/OSII V2.52的全部源码以及可在PC机上运行的移植范例。   本书可用做高等院校嵌入式实时系统课程教材或工程师培训教材,也可供嵌入式应用开发人员研究与使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值