系统内部有5个系统任务:空闲任务、时钟节拍任务、统计任务、定时任务、中断服务任务、钩子任务。
空闲任务:OS_IdleTask(),此任务必须创建,避免CPU空转,但不需手动创建,在OS_Init()初始化时已经创建了。次任务优先级为(OS_CFG_PRIO_MAX-1),即最低,OS_CFG_PRIO_MAX为优先级数,默认64。
为什么必须存在:https://www.jianshu.com/p/c0af50dbab5a
时钟节拍任务:OS_Ticktask(),必须创建,但不需手动,OS_Init()初始化时已经创建了。优先级尽量高,正点原子开发板定为1。此函数作用是跟踪正在延时的任务,以及在指定时间内等待某个内核对象的任务。
统计任务:OS_StartTaskInit(),优先级为倒数第二,用来同级CPU的使用率、各个任务的CPU使用率和各任务的堆栈使用情况,默认此函数不会被创建,要想使用需把OS_CFG_STAT_TASK_EN置1来调用OSStatTaskCPUUsageInit(&err)函数,此函数会安贝CPU的使用量存在OSStatTaskCPUUsage变量中,通过读取该值知道CPU使用率
把宏OS_CFG_STAT_TASK_STK_CHK_EN置1,就是检查堆栈使用情况,会将洁厕结果存到每个任务的控制块OS_TCB的StkFree(剩余堆栈量)和StkUsed(使用堆栈量)变量中.
定时任务:OS_TmrInit(),需要把宏OS_CFG_TMR_EN置1.就可以使用.UCOSIII提供二点定时器功能,优先级为2
中断服务管理任务:OS_IntQTask(),优先级最高为0,需要把宏OS_CFG_ISR_POST_DEFERRED置1,该任务负责延迟在ISR中调用的系统post服务函数的行为.当ISR(中断服务函数)调用UCOSIII提供的"post"函数时,要发送的目的地和数据会存入一个特别的缓冲队列中,当所有嵌套中断函数都执行完毕后UCOSIII会做任务切换,运行中断服务管理任务,中断服务管理服务任务会把缓存队列中存放的信息发送给相应的任务.好处是可以减少中断关闭的时间,否则,在ISR中还需要把任务从等待列表中删除,并把任务放入就绪表,以及做一些其它的耗时操作.
钩子函数:OSIdleTaskHook(),将OS_CFG_APP_HOOKS_EN置1,每次任务执行完就会执行相应的钩子函数,在os_app_hooks.c文件中有个App_OS_SetAIIHooks(),此函数
void App_OS_SetAllHooks (void) //钩子函数设置
{
#if OS_CFG_APP_HOOKS_EN > 0u
CPU_SR_ALLOC();
CPU_CRITICAL_ENTER();
OS_AppTaskCreateHookPtr = App_OS_TaskCreateHook;
OS_AppTaskDelHookPtr = App_OS_TaskDelHook;
OS_AppTaskReturnHookPtr = App_OS_TaskReturnHook;
OS_AppIdleTaskHookPtr = App_OS_IdleTaskHook;//比如,App_OS_IdleTaskHook是空闲任务钩子函数,它是个空函数,需要自己填代码
OS_AppStatTaskHookPtr = App_OS_StatTaskHook;
OS_AppTaskSwHookPtr = App_OS_TaskSwHook;
OS_AppTimeTickHookPtr = App_OS_TimeTickHook;
CPU_CRITICAL_EXIT();
#endif
}
void App_OS_IdleTaskHook (void)
{
/*自己写的
static int num;
num++;
if(num%50000==0)
{
printf("Idle Task Running 50000 times!\r\n");
}*/
}