//
更多原创“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原理与实践》