RT-Thread-05-空闲线程和两个常用的钩子函数

news/2025/3/5 5:37:02/

空闲线程和两个钩子函数

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

空闲线程还负责一些系统资源回收以及将一些处于关闭状态的线程从线程调度列表中移除;
空闲线程在形式上是一个无限循环且永远不被挂起的线程;
RT-Thread实时操作系统的空闲线程提供了钩子函数,这种空闲线程钩子函数可以让系统在空闲时执行一些不紧急的事务,例如,系统运行指示灯闪烁,CPU使用率统计等等这些;

在Kernel / idle.c中有空闲函数相关的函数;
其中两个函数

设置钩子函数:
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()等可能会导致线程挂起的阻塞类函数都不能在钩子函数中使用

空闲函数钩子函数官方示例代码:

/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date           Author       Notes * 2018-08-24     yangjie      the first version */  /** 程序清单:空闲任务钩子例程** 这个例程创建一个线程,通过延时进入空闲任务钩子,用于打印进入空闲钩子的次数*/#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++;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);rt_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);

在thread1等待函数rt_thread_mdelay(500);执行的时候,系统会调度空闲函数执行,空闲函数会调取钩子函数去执行。
运行结果:
在这里插入图片描述

  • 系统调度钩子函数
    系统的上下文切换是系统运行过程中最普遍的事件,有时用户可能会想知道在某一时刻发生了什么样的线程切换,RT-Thread向用户提供了一个系统调度钩子函数,这钩子函数在系统进行任务切换时运行,通过这个钩子函数可以了解到系统任务调度时的一些信息。
在启动线程们的函数中使用这个函数,可以在线程间调度时进行显示输入函数指针对应函数中的操作
rt_scheduler_sethook(void(*hook)(struct rt_thread *from , struct rt_thread *to))

线程切换钩子函数官方示例代码:

/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date           Author       Notes * 2018-08-24     yangjie      the first version */ /** 程序清单:调度器钩子* 在调度器钩子中打印线程切换信息*/#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);

运行结果:
在这里插入图片描述


http://www.ppmy.cn/news/546465.html

相关文章

Linux基础_1

目录 一、用户登录 1、root用户 2、普通&#xff08;非特权&#xff09;用户 二、终端terminal 1、终端类型 2、查看当前的终端设备 三、交互式接口 1、概念&#xff1a;启动终端后&#xff0c;在终端设备附加一个交互式应用程序 2、类型 3、什么是Shell 4、各种She…

ETCD API V3

ETCD API V3 ETCD V3 vs V2gRPC序列化与反序列化减少TCP连接租约机制观察者模式数据存储模型mini事务快照大规模watch gRPC服务KV APIRangePutDeleteRangeTxnCompact watch APILease API获取租约撤销租约KeepAlives ETCD V3 vs V2 etcd V3做出的改进和优化。 使用gRPCprotobuf…

内存卡打不开需要格式化怎么恢复数据

内存卡是我们常用的存储数据的工具&#xff0c;在我们频繁的使用过程中&#xff0c;难免会出现一些意向不到的问题。 比如&#xff1a;内存卡打不开&#xff0c;提示需要格式化才能继续使用。但是&#xff0c;我有很多重要的文件在内存卡里面&#xff0c;怎么办&#xff1f; …

怎么在计算机修复flash,win10系统怎么用flash修复器?教你用flash修复器修复视频的方法...

flash修复器可以解决看网页视频异常,网页flash空白等flash问题&#xff0c;是一款非常不错的工具。win10正式版系统安装上flash修复器&#xff0c;好多新手小白不知道怎么用flash修复器修复视频。其实操作步骤简单&#xff0c;接下来小编教你用flash修复器修复视频。 具体方法如…

内存卡坏了怎么修复?内存卡恢复也不难

内存卡坏了怎么修复&#xff1f;内存卡又名SD卡&#xff0c;是一种轻便小巧的便携式存储设备&#xff0c;但因为长期大量读写数据&#xff0c;很容易从内部发生损坏&#xff0c;这时候最令人担心的就是里面的数据&#xff0c;其实内存卡损坏一般都是来源于内部&#xff0c;这是…

关于修复mp4文件损坏的过程小记

最近项目中遇到设备异常断电&#xff0c;导致mp4文件损坏的问题&#xff0c;最近花了点时间&#xff0c;深入分析原因&#xff0c;并进行了相关修复尝试工作&#xff0c;最后&#xff0c;虽然文件中的音视频数据大部分可以修复&#xff0c;但因为原始文件中视频的帧率是动态变化…

sdhc卡文件丢失常见原因和两种恢复方法

sdhc卡作为sd卡的继任者&#xff0c;主要有容量/速度等级高、支持文件格式和兼容的机器多等特征&#xff0c;通常被用于存储大量文件的设备中&#xff0c;比如松下照相机。但是sdhc卡跟其他存储设备相似&#xff0c;也会因各种原因导致重要数据丢失&#xff0c;那么sdhc卡文件丢…

解决视频播放器找不到解码器问题

打开视频播放器&#xff0c;我经常使用的qq影音精简版居然什么格式的视频都不能播放了(提示文件无法渲染)&#xff0c;这时候我怀疑快播不能播放也是因为系统缺少dll文件了(提示文件格式不正确)&#xff1b;设置了好长时间还是不行网上给出的资料大多数是视频文件损坏&#xff…