欣欣学习网,老工程师带你学习单片机技术,欢迎来坐坐。
首  页 | 学习NIOSII | 学习C51 | 学习CPLD | 51+CPLD实验板 | | | MY-RTOS

 系统简介
 系统启动
 创建任务
 等待与休眠
 使用互斥量
 使用信号量
 信号量组
 使用事件
 使用事件组
 消息队列
 动态内存管理
 只读内存管理
 临界段与内核锁
 任务复位与终止


玛雅实时操作系统(MY-RTOS)

等 待 与 休 眠


版权声明:玛雅实时操作系统(MY-RTOS)软件及其说明文档由 欣欣学习网 版主 Stoneway QI 创作,作者保留其版权。任何人可以免费在其产品设计或著作中使用或引用该软件及其说明文档,但要求保留原作品当中的版权声明,并注明引用段落的出处。

-- Stoneway QI 主页: http://www.xxworks.com 邮箱: Stonewayqi@hotmail.com

当任务没有事务需要处理时,可以把CPU交还给系统,这样可以提高系统整体的处理效能。有两个系统函数可以完成这样的功能,分别是OSSleep()和OSWaitTicks()。

函数OSSleep()的作用是将CPU交换给系统内核,等待下一次被调度。系统内核在收回CPU之后,会将任务剩余的时间片重新分配。当剩余的时间片小于一个系统节拍时,内核会将该剩余的时间片分配给下一个被调度的任务的同时,对该任务补充分配1个系统节拍的时间片。当剩余的时间片大于等于1个系统节拍时,内核直接将其分配给下1个被调度的任务,而不再追加新的时间片。如下图所示:

 
t1:S2的剩余时间片
t2:内核对S3追加的时间片
t3:S4的剩余时间片
t4:内核对S5追加的时间片
t5:S5的剩余时间片,对S6没有追加的时间片

系统函数OSSleep()没有入口参数和返回值,对其调用的示例代码如下:

void Task(void)
{
    ...    
    while(1)
    {
        ...
        OSSleep();  //将CPU交还给内核,等待下1次调度
        ...
    }
}                       (1)

当紧急任务在处于紧急优先级时调用了函数OSSleep(),系统会暂时将该任务的紧急信号清除,使其优先级降为常规优先级,以便其它常规优先级的任务得以被调度。当内核再次调度该任务时,会恢复其紧急信号,使其重新回到原来的紧急优先级上。

系统函数OSWaitTicks()的作用就是使任务进入等待状态,在等待了所设定的时长之后,继续运行。在此其间,任务只占用少量的CPU时间检测等待时间。当所设定的时长到达之后,对于紧急任务,系统内核会触发其紧急信号,以便其能尽快被调度,得以继续运行。所以,通常一个紧急任务在所等待的时间到达之后,能够立刻恢复运行,而常规任务要延后一段时间。该函数的入口参数是所要设定的时间长度,单位为系统节拍,它没有返回值。调用该函的示例代码如下:

void Task(void)
{
    ...
    ...    
    while(1)
    {
        ...
        OSWaitTicks(1000);  //等待1000个系统节拍
        ...
    }
}                       (2)

与函数OSSleep()类似,如果一个紧急任务在处于紧急优先级时调用了函数OSWaitTicks(),系统内核会清除该任务的紧急信号,使其优先级降为常规优先级,以便其它常规优先级的任务得以被调度。


管理员信箱: stonewayqi@hotmail.com

欣 欣 学 习 网

粤ICP备2023138008号