RT-Thread学习笔记(4)- 空闲任务

(一)空闲任务的含义及特点

因为只要处于正常供电状的,CPU是不能停下来,总需要干点事情,所以需要干一个无聊的事情来占据这段时间,我们也可以称空闲任务是CPU不干事情的时候干的事情(这里的事情指的是正事)。

空闲任务的主要特点如下:

1、空闲必须存在,初始化

2、空闲任务的优先级是最低的

空闲任务初始化的代码如下: 

void rt_thread_idle_init(void)   //静态线程的方式创建
{
    /* initialize thread */
    rt_thread_init(&idle,
                   "tidle",
                   rt_thread_idle_entry,
                   RT_NULL,
                   &rt_thread_stack[0],
                   sizeof(rt_thread_stack),
                   RT_THREAD_PRIORITY_MAX - 1,  //优先级最低
                   32);

    /* startup */
    rt_thread_startup(&idle);
}

(二)空闲任务的钩子函数

钩子函数是指该任务执行时,附带执行的一段程序,具体什么功能由编写者决定。我们知道空闲任务是占用系统资源的(比如堆栈等),那么空闲任务的钩子函数存在的意义在于:我们可以充分利用这个空闲任务的资源,比如我们需要一个实时性不高(意味着优先级很低的任务),我们可以写在钩子函数里面,这样意味着,我们在充分利用系统资源的同时,又减少了再创建一个任务的繁琐。

空闲任务代码如下,其中钩子函数是可以裁剪(在rtconfig.h中)的,而空闲任务额外还做了一些诸如回收资源的等操作(具体操作分析,看待续)。

static void rt_thread_idle_entry(void *parameter)
{
    while (1)
    {
#ifdef RT_USING_IDLE_HOOK                 
        if (rt_thread_idle_hook != RT_NULL)
        {
            rt_thread_idle_hook();
        }
#endif

        rt_thread_idle_excute();  //回收系统的一些资源等操作,具体看源码
    }
}

如何创建钩子函数,我们需要用到rt_thread_idle_sethook()这个API。如下图所示,cpu_usage_idle_hook是一个函数,也就是实现的钩子函数的功能。

/* 设置空闲线程钩子 */
    rt_thread_idle_sethook(cpu_usage_idle_hook); //入口参数为一个函数指针

还有一个利用空闲任务的钩子函数来统计CPU使用率的一个例子的详细解释,见链接。

你可能感兴趣的:(RT-Thread学习)