一、空闲线程

空闲线程是一个比较特殊的系统线程,它具备最低的优先级。当系统中无其他就绪线程可运行,调度器将调度到空闲线程。

空闲线程还负责一些系统资源回收以及将一些处于关闭台的线程从线程调度列表中移除的动作;

空闲线程在形式上是一个无限循环结构,且永远不被挂起;

在RT_thread实时操作系统中空闲线程向用户提供了钩子函数,空闲线程钩子函数可以让系统在空闲的时候执行一些非紧急事务,例如系统运行指示灯闪烁,CPU使用率统计等等。

二、空闲线程钩子函数

1.钩子函数API
设置钩子函数

rt_err_t rt_thread_idle_setthook(void (*hook)(void))

删除钩子函数

rt_err_t rt_thread_idle_delthook(void (*hook)(void))

2.空闲线程钩子函数实例
在代码示例的 idlehook_sample.c 中,可以看到钩子函数的具体操作。

/** 程序清单:空闲任务钩子例程** 这个例程创建一个线程,通过延时进入空闲任务钩子,用于打印进入空闲钩子的次数*/#include <rtthread.h>
#include <rthw.h>#define THREAD_PRIORITY      20
#define THREAD_STACK_SIZE    1024
#define THREAD_TIMESLICE     5/* 指向线程控制块的指针 */
static rt_thread_t tid = RT_NULL;/* 空闲函数钩子函数执行次数 */
volatile static int hook_times = 0;/* 空闲任务钩子函数 */
static void idle_hook()
{if (0 == (hook_times % 10000)){rt_kprintf("enter idle hook %d times.\n", hook_times);}rt_enter_critical();  //临界区的保护,防止其他优先级高的线程打断 hook_times++ 执行hook_times++;rt_exit_critical();    //解除临界区的保护
}/* 线程入口 */
static void thread_entry(void *parameter)
{int i = 5;while (i--){rt_kprintf("enter thread1.\n");rt_enter_critical();hook_times = 0;rt_exit_critical();/* 休眠500ms */rt_kprintf("thread1 delay 50 OS Tick.\n", hook_times);  //一个系统滴答10msrt_thread_mdelay(500);  //系统进入空闲线程运行,相应的钩子函数就得到运行}rt_kprintf("delete idle hook.\n");/* 删除空闲钩子函数 */rt_thread_idle_delhook(idle_hook);  //删除钩子函数后,进入空闲线程时,设置的钩子函数就不会运行了rt_kprintf("thread1 finish.\n");
}int idle_hook_sample(void)
{/* 设置空闲线程钩子 */rt_thread_idle_sethook(idle_hook);/* 创建线程 */tid = rt_thread_create("thread1",thread_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);if (tid != RT_NULL)rt_thread_startup(tid);return 0;
}/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(idle_hook_sample, idle hook sample);


我们通过rt_thread_idle_sethook()这个API为系统空闲线程设置一个钩子函数idle_hook,每当系统进入系统空闲线程时,
这个idle_hook()钩子函数都得到有效的运行。当我们不需要钩子函数运行时,可用rt_thread_idle_delhook()这个API删除钩子函数 。

3.空闲线程钩子函数使用注意事项
●空闲线程是一个线程状态永远为就绪态的线程,所以钩子函数中执行的相关代码必须保证空闲线程在任何时刻都不会被挂起,例如rt_ thread_ delay()、rt_sem_take()[对信号量的操作API等可能会导致线程挂起的阻塞类函数都不能在钩子函数中使用,即钩子函数不能被挂起。
●空闲线程可以设置多个钩子函数,有一个钩子函数列表的。

4.系统调度钩子函数
系统的上下文切换是系统运行过程中最普遍的事件,有时用户可能会想知道在某一-个时刻发生了什么样的线程切换,RT-Thread向用户提供了一个系统调度钩子函数,这个钩子函数在系统进行任务切换时运行,通过这个钩子函数,我们可以了解到系统任务调度时的一 些信息。在实例代码中scheduler_hook.c 中。
rt_ scheduler_ sethook(void (*hook)(struct rt_ thread *from, struct rt_ thread *to))

/** 程序清单:调度器钩子* 在调度器钩子中打印线程切换信息*/#include <rtthread.h>#define THREAD_STACK_SIZE 1024
#define THREAD_PRIORITY     20
#define THREAD_TIMESLICE    10/* 针对每个线程的计数器 */
volatile rt_uint32_t count[2];/* 线程1、2共用一个入口,但入口参数不同 */
static void thread_entry(void* parameter)
{rt_uint32_t value;value = (rt_uint32_t)parameter;while (1){rt_kprintf("thread %d is running\n", value);rt_thread_mdelay(1000); //延时一段时间}
}static rt_thread_t tid1 = RT_NULL;
static rt_thread_t tid2 = RT_NULL;static void hook_of_scheduler(struct rt_thread* from, struct rt_thread* to)
{rt_kprintf("from: %s -->  to: %s \n", from->name , to->name);
}int scheduler_hook(void)
{   /* 设置调度器钩子 */rt_scheduler_sethook(hook_of_scheduler);/* 创建线程1 */tid1 = rt_thread_create("thread1", thread_entry, (void*)1, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); if (tid1 != RT_NULL) rt_thread_startup(tid1);/* 创建线程2 */tid2 = rt_thread_create("thread2", thread_entry, (void*)2, THREAD_STACK_SIZE, THREAD_PRIORITY,THREAD_TIMESLICE - 5);if (tid2 != RT_NULL) rt_thread_startup(tid2);return 0;
}/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(scheduler_hook, scheduler_hook sample);

RT_thread空闲线程及两个常用的钩子函数相关推荐

  1. RT_Thread_空闲线程

    1.空闲线程(idle)说明 1.1.线程类型:系统线程 1.2.优先级:最低 1.3.线程状态:就绪态 当系统中无其他就绪线程存在时,调度器将调度到空闲线程,它通常是一个死循环,且永远不能被挂起.例 ...

  2. RTT设置删除空闲钩子函数想到函数指针和回调函数

    目录 一.概述 二.函数指针 2.1 函数指针的使用 2.2 * (int * )&p 三.回调函数 一.概述 学习RTT时,看到设置和删除空闲钩子函数接口: rt_err_t rt_thre ...

  3. 线程的创建与启动——Thread 类有两个常用的构造方法:Thread()与 Thread(Runnable)||多线程运行结果是随机的

    线程的创建与启动 在 Java 中,创建一个线程就是创建一个 Thread 类(子类)的对象(实例). Thread 类有两个常用的构造方法:Thread()与 Thread(Runnable).对应 ...

  4. 从0到1写RT-Thread内核——空闲线程与阻塞延时的实现

    在之前写的另外一篇文章--<从0到1写RT-Thread内核--线程定义及切换的实现>中线程体内的延时使用的是软件延时,即还是让CPU空等来达到延时的效果.RTOS中的延时叫阻塞延时,即线 ...

  5. Java线程的两种实现方式

    前言 线程是程序的一条执行线索,执行路径,是程序使用cpu的最小单位.线程本身不能运行,它只能运行在程序中,线程是依赖于程序存在的. 多线程的意义 其实任何一个程序的执行都需要获得cpu的执行权,是由 ...

  6. RT-thread内核之空闲线程

    空闲线程是系统线程中一个比较特殊的线程,它具有最低的优先级,当系统中无其他线程可运行时,调度器将调度到空闲线程.空闲线程通常是一个死循环,永远不被挂起.RT-Thread实时操作系统为空闲线程提供了钩 ...

  7. (60)逆向分析 KiSwapThread —— 找就绪线程和空闲线程

    一.回顾 上一篇博客,我带着以下的问题逆向分析了 KiSwapContext 和 SwapContext 这两个函数: SwapContext 有几个参数,分别是什么? SwapContext 在哪里 ...

  8. java中集合类的转换_Java中的两个常用工具类及集合数组的相互转换

    为了编程人员的方便及处理数据的安全性,Java特别提供了两个非常有用的工具类: 一.Collections 1.Collections类的特点: 集合框架的工具类.里面定义的都是静态方法. 2.Col ...

  9. Java线程池七个参数详解:核心线程数、最大线程数、空闲线程存活时间、时间单位、工作队列、线程工厂、拒绝策略

    源码简介 ThreadPoolExecutor是JDK中的线程池实现,这个类实现了一个线程池需要的各个方法,它提供了任务提交.线程管理.监控等方法. 下面是ThreadPoolExecutor类的构造 ...

最新文章

  1. python添加文字水印中间旋转45度_pythonpdf添加水印
  2. 月薪25-80K丨一汽(南京)招聘雷达感知开发工程师、主管、主任、高级主任
  3. DELL R710做Raid显示灰色
  4. qpython3安装kivy_kivy库的安装
  5. 远程服务器php环境搭建,免费网站搭建与phpstorm远程部署
  6. 利用「接口」做产品时我们该如何思考?
  7. 【数理统计】概率论基础回顾
  8. .NET深入 c#数据类型2
  9. 全球首款5G手机出炉?其实只是一个笑话
  10. 回溯算法 python
  11. 7.5日chinapub生日聚会
  12. 我们在GDC上公布了一些好消息
  13. 这个数据库神器真是太diao了
  14. 火狐浏览器打印网页不全_火狐浏览器网页显示不全
  15. 牛客网 2018校招真题 吉比特 直线上的点
  16. Springboot AMR格式音频转换MP3
  17. securitytube视频列表
  18. 关于评审--从思想到落地
  19. adobe captivate 5.5 中文教程
  20. 支付账户体系(分账接口)的9大价值

热门文章

  1. 面试数据库知识点总结
  2. 华为鸿蒙八月,终于来了!华为鸿蒙系统确认8月发布:革命性产品首发搭载
  3. 安全进化的终极猜想— 以“AI之盾”对抗“AI之矛”
  4. java newline_Java 输出文件通过 BufferedWriter.newline() 方法换行
  5. 常州工学院Java作业03
  6. 分享几个实用的神器APP系列(四)
  7. python数据集处理一些方法备份(长期更新)
  8. 室内眩光测量UGR测试系统
  9. C代码如何跑起来(程序编译和预处理)
  10. C#测试调用PaddleSharp模块识别图片文字