在大多OS里都存在Idle线程或任务,同样uCos也不例外,为什么估计很少有人细研究。为什么设立Idle? 能不能去了?
首先看看uCos中关于Idle的代码做个介绍:
config.h里对Idle的配置:
#define OS_LOWEST_PRIO 7 /* 最低优先级,OS_LOWEST_PRIO即空闲任务优先级(0 ~ 63) */
#define OS_TASK_IDLE_STK_SIZE 32 /* 空闲任务栈容量 单位类型:OS_STK * */
在Core.c文件里的OSInit()调用OS_InitTaskIdle();来创建OS_TaskIdle任务,OS_InitTaskIdle();封装了
CreateTask()的不同创建方法,有带ID名,有不带ID名的。
在Core.c文件里的OS_TaskIdle线程体
void OS_TaskIdle (void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
pdata = pdata; /* Prevent compiler warning for not using 'pdata' */
for (;;)
{
OS_ENTER_CRITICAL();
OSIdleCtr++;
OS_EXIT_CRITICAL();
#if OS_TASK_IDLE_HOOK_EN > 0 /* Allocate storage for CPU status register */
OSTaskIdleHook(); /* Call user definable HOOK */
#endif
}
}
- 空闲任务
- 描述:这个函数是uCOS-II内部函数,uCOS-II总要建立一个空闲任务,这个任务在没有其它任务进入
- 绪态时投入运行。这个空闲任务永远设为最低优先级,即OS_LOWEST_PRIO.空闲任务不可能 被应用软件删除。
之所以设立Idle是因为当用户任务都不行用cpu时有Idle回收,应为cpu总德有一个任务,或是有一个入口让cpu
停止工作。这种情况是在用户任务都处于挂起或是延时时,那么以uCos的调度器结构来说总有一个任务才能调度
这个任务就是Idle. 所以在Idle里不能将Idle自己挂起或是延时。否则系统将会崩溃。为了验证这个说法举例说明问题:
建立两个用户任务,统计任务不使用,加上Idle一共3个任务,3个任务同是用OSTimeDly();即所有任务都放弃CPU
连Idle也放弃。
/* 用户任务1 */
void MainTask (void *pArg)
{
OSSetupTask(Task0, 2);
while(1)
{
pArg = pArg;
OSTimeDly(50000);
}
}
/* 用户任务 */
void Task0 (void *pArg)
{
int cnt;
cnt = 0;
while(1)
{
pArg = pArg;
OSTimeDly(50000);
cnt++;
if(cnt == 100)
while(1);
}
}
OSTaskIdleHook()
{
OSTimeDly(100);
OSTimeDly(50);
}
在stm32运行是直接是HardFault伺候。
所以在uCos里Idle永远是就绪态,不要在OSTaskIdleHook()中调用可以使任务挂起的PEND函数,
Idle能不能去了?答案是可以的,但是得修改调度器的写法,其实Idle也吃内存。至少20 个字。
来源:https://www.cnblogs.com/worldsing/p/3407496.html