uC/OS-II 学习笔记之:任务挂起与恢复,调度器上锁与解锁!

一、任务挂起的概念:将任务的运行状态转为等待态(或称阻塞态)的过程叫做任务的挂起,任务被挂起后它的运行就停止了!

(1)任务挂起函数:OSTaskSuspend(INT8U prio)//prio为任务的优先级别

用户任务可调用OSTaskSuspend()来挂起自身或者其它任务(当然不能用它来挂起空闲任务了),

被挂起的任务在恢复前就不会在运行了。

(2)任务恢复函数:OSTaskResume(INT8U prio)//prio为任务的优先级别

被函数OSTaskSuspend()挂起的任务只能在其它任务(除自身外的任务)中通过调用OSTaskResume()函数使其恢复为就绪状态。

(3)任务挂起函数与恢复函数的简单使用:

//任务n,串口发送
void Usart(void *pdata)
{
char USART_DX_BUF[] = "abcdefg";
char i = 0;
int j = 0;
while (1)
{
for (i=0; i<7; ++i)
{
USART1->DR = USART_DX_BUF[i];
while ((USART1->SR & 0X40) == 0);
if (50 == j)
{
OSTaskSuspend(1);//将优先级别为1的任务挂起
}
else if (200 == j)
{
OSTaskResume(1);//将优先级别为1的任务恢复
j = 0;
}
j++;
}
OSTimeDlyHMSM(0, 0, 0, 100);
}
}

解析:此函数就是在任务n中将优先级别为1的任务挂起,当变量j从0自增到50时,就将优先级别为1的任务挂起,从50自增到200时,再将该任务恢复;j在50到200这个范围内时,该任务是不会运行的!

(4)在此值得一提的是,被挂起的任务并非处于挂起态,而是处于等待态(或阻塞态)。被挂起的任务在恢复后就直接进入运行态了,而任务因为中断使其失去CPU的控制权限才会进入挂起态,处于挂起态的任务除非中断结束后其优先级仍是最高的,否则它将不会立即获得运行。(对此不理解的同学请猛击文章开头的连接,参考我的关于可剥夺型内核的文章)

二、调度器上锁的概念:调度器上锁后,任务调度就不再进行。假设是在任务n中将调度器上锁,那么系统就只运行任务n,将调度器解锁后,其它任务才会得到系统的调度而运行!

(1)调度器上锁函数:OSSchedLock(void)//形参为空

(2)调度器解锁函数:OSSchedUnlock(void)//形参为空

(3)调度器上锁函数与调度器解锁函数的简单使用:

//任务n,串口发送
void Usart(void *pdata)
{
char USART_DX_BUF[] = "abcdefg";
char i = 0;
int j = 0;
while (1)
{
for (i=0; i<7; ++i)
{
USART1->DR = USART_DX_BUF[i];
while ((USART1->SR & 0X40) == 0);
if (50 == j)
{
OSSchedLock();//任务调度器上锁
}
else if (1000 == j)
{
OSSchedUnlock();//任务调度器解锁
j = 0;
}
j++;
}
OSTimeDlyHMSM(0, 0, 0, 100);
}
}

解析:在此函数中,当j处于50到1000这个范围内时,系统仅运行任务n,其它任务都不会获得运行!

参: 任哲 《嵌入式实时操作系统uC/OS-II原理及应用》
参: 卢有亮 《嵌入式实时操作系统uC/OS原理与实践》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值