1、空闲线程(idle)说明
1.1、线程类型:系统线程
1.2、优先级:最低
1.3、线程状态:就绪态
当系统中无其他就绪线程存在时,调度器将调度到空闲线程,它通常是一个死循环,且永远不能被挂起。例如 rt_thread_delay(),rt_sem_take() 等可能会导致线程挂起的函数都不能使用。并且,由于 malloc、free 等内存相关的函数内部使用了信号量作为临界区保护,因此在钩子函数内部也不允许调用此类函数!
空闲线程必须有得到执行的机会,即其他线程不允许一直while(1) 死卡 ,必须调用具有阻塞性质的函数;否则例如线程删除、回收等操作将无法得到正确执行。
1.4、功能1:回收资源
若某线程运行完毕,系统将自动删除线程:
执行 rt_thread_exit() 函数,先将该线程从系统就绪队列中删除,再将该线程的状态更改为关闭状态,不再参与系统调度,然后挂入 rt_thread_defunct 僵尸队列(资源未回收、处于关闭状态的线程队列)中,最后空闲线程会回收被删除线程的资源。
1.5、功能2:钩子函数
在空闲线程运行时会调用设置的钩子函数,适合钩入功耗管理、看门狗喂狗等工作。
2、设置和删除钩子函数
2.1、设置钩子函数 rt_thread_idle_sethook
rt_err_t rt_thread_idle_sethook(void (*hook)(void));
函数参数 | 描述 |
---|---|
hook | 设置的钩子函数 |
返回 | —— |
RT_EOK | 设置成功 |
-RT_EFULL | 设置失败 |
设置的钩子函数在rt_thread_idle_entry()中被调用,由函数的实现可以看到最多可设置4个空闲钩子函数,是以链表的形式对钩子函数调用。
2.2、删除钩子函数 rt_thread_idle_delhook
rt_err_t rt_thread_idle_delhook(void (*hook)(void));
函数参数 | 描述 |
---|---|
hook | 删除的钩子函数 |
返回 | —— |
RT_EOK | 删除成功 |
-RT_ENOSYS | 删除失败 |
3、代码
空闲钩子函数里设置运行指示灯1s闪烁一次;
//翻转LED0
void led0_turn()
{
if(rt_pin_read(LED0_PIN))
rt_pin_write(LED0_PIN, PIN_LOW);
else
rt_pin_write(LED0_PIN, PIN_HIGH);
}
/* 空闲任务钩子函数 */
static void idle_hook()
{
static rt_tick_t tick_num=0,tick_num_last=0;
tick_num = rt_tick_get();
if(tick_num-tick_num_last > 1000){
led0_turn();//翻转LED
tick_num_last = tick_num;
}
}
int main()
{
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
led0_off();
/* 设置空闲线程钩子 */
rt_thread_idle_sethook(idle_hook);
}