由用户创建的线程称为用户线程,由系统本身具有的线程称为系统线程。空闲线程是一个比较特殊的系统线程,他具备最低优先级。当系统中无其他就绪线程可运行时,调度器将调度到空闲线程。他负责一些系统资源回收及将一些处于关闭态的线程从线程调度列表中移除的动作。他在形式上是一个无限循环结构且永远不被挂起。
在RT-Thread实时操作系统中空闲线程向用户提供钩子函数,空闲线程钩子函数可以让系统在空闲时候执行一些非紧急事务,例如系统运行指示灯闪烁,CPU使用率统计等等。
空闲线程钩子函数
设置钩子函数
rt_err_t rt_thread_idle_sethook(void (*hook)(void))
删除钩子函数
rt_err_t rt_thread_idle_delhook(void(*hook)(void))
空闲线程钩子函数使用注意
空闲线程是一个线程状态永远为就绪态线程,所以线程函中执行的相关代码必须保证空闲线程在任何时刻都不会被挂起,例如rt_thread_delay()、rt_sem_take()等可能会导致线程挂起阻塞类函数都不能在钩子函数中使用。空闲线程可以设置多个钩子函数。在RT-Theader中最多设置4个钩子函数。
系统调度器钩子函数
系统的上下文切换是系统运行过程中最普遍的事件,有时用户可能想知道在一个时刻发生了什么样的线程切换,RT-Thread向用户提供了一个系统调度钩子函数,这个钩子函数在系统进行任务切换时进行,通过这个钩子函数,我们可以了解系统任务调度时的一些信息。rt_scheduler_sethook(void(*hook)(struct rt_thread *from,struct rt_thread *to))
空闲线程钩子函数示例代码流程图如下:
首先系统进行参数初始化,包括线程优先级分配、存放线程栈空间大小分配、线程时间片分配、线程控制块指针定义、空闲钩子函数执行次数、定义全局变量hook_times为0。接着,初始化空闲线程钩子函数。创建一个名为“thread1”线程,判断线程是否创建成功,若否则打印线程创建失败并推出程序,若成功则系统开始启动。系统执行thread1线程后结束。
系统进入thread1线程后,初始化整形变量i=5,判断i是否大于0,如果是则通过串口打印输出“Enter hread1”。关闭线程调度器[1],初始化hook_times=0,打开线程调度器。系统定时500ms,定时未到,CPU睡眠并执行idle_hook()函数,而后继续判断i值大小。定时到,i--。判断i是否大于0,如果否则删除空间钩子函数,通过串口打印thread1 finish,最后返回主函数。
系统进入idle_hook()函数,判断全局变量hook_times和10000取余是否等于0,若是则通过串口打印enter idle hook times,若否则关闭线程调度器,进行hook_times++,打开线程调度器后返回thread1线程。
文章评论(0条评论)
登录后参与讨论