当前位置: 首页 > news >正文

RT-Thread入门笔记6-空闲线程及两个常用的钩子函数

空闲线程

空闲线程是一个比较特殊的系统线程,它具备最低的优先级。当系统中无其他就绪线程可运行时,调度器将调度到空闲线程。
空闲线程还负责一些系统资源回收以及将一些处于关闭态的线程从线程调度列表中移除的动作
空闲线程在形式上是一个无线循环结构,且永远不被挂起。
在RT-Thread 实时操作系统中空闲线程向用户提供了钩子函数,空闲线程钩子函数可以让系统在空闲的时候执行一些非紧急事务,例如系统运行指示灯闪烁, CPU 使用率统计等等。

//设置钩子函数rt_err_t rt_thread_idle_sethook(void (*hook)(void))//删除钩子函数rt_err_t rt_thread_idle_delhook(void (*hook)(void)

空闲线程钩子函数示例

#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);

运行结果:
在这里插入图片描述
系统会在线程1执行rt_thread_mdelay(500)时,进入空闲线程。

注意:空闲线程是一个线程状态永远为就绪态的线程,所以钩子函数中执行的相关代码必须保证空闲线程在任何时刻都不会被挂起, 例如rt_thread_delay()、 rt_sem_take()等可能会导致线程挂起的阻塞类函数都不能在钩子函数中使用。空闲线程可以设置多个钩子函数。

系统调度钩子函数

#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向用户提供了一个系统调度钩子函数,这个钩子函数在系统进行任务切换时运行,通过这个钩子函数,我们可以了解到系统任务调度时的一些信息。

rt_scheduler_sethook(void (*hook)(struct rt_thread *from, struct rt_thread *to))//系统调度钩子函数

相关文章:

RT-Thread入门笔记6-空闲线程及两个常用的钩子函数

空闲线程 空闲线程是一个比较特殊的系统线程&#xff0c;它具备最低的优先级。当系统中无其他就绪线程可运行时&#xff0c;调度器将调度到空闲线程。 空闲线程还负责一些系统资源回收以及将一些处于关闭态的线程从线程调度列表中移除的动作 空闲线程在形式上是一个无线循环结…...

网络正常运行时间监控工具

正常运行时间是衡量系统可靠性的指标&#xff0c;表示为机器工作和可用时间的百分比。当提到 IT 网络时&#xff0c;正常运行时间是衡量网络设备、网站和其他服务的可用性的指标。网络正常运行时间通常以百分位数来衡量&#xff0c;例如“五个 9”&#xff0c;这意味着系统在 9…...

DEJA_VU3D - Cesium功能集 之 112-获取圆节点(1)

前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小140个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(每篇博文都会奉上完整demo的源代码…...

Matlab 建文件夹保存本次仿真图表数据和参数

文章目录 前言代码 前言 有时候跑的仿真参数非常多&#xff0c;保存结果的时候需要把仿真参数和数据一起保存&#xff0c;为方便起见&#xff0c;查了一下怎么建文件夹自动保存本次仿真图表数据和参数&#xff0c;再也不用担心忘记结果是什么参数跑出来的了~ 代码 % 定义变量…...

@JsonFormat与@DateTimeFormat

JsonFormat注解很好的解决了后端传给前端的格式&#xff0c;我们通过使用 JsonFormat可以很好的解决&#xff1a;后台到前台时间格式保持一致的问题 其次&#xff0c;另一个问题是&#xff0c;我们在使用WEB服务的时&#xff0c;可 能会需要用到&#xff0c;传入时间给后台&am…...

半监督学习 - 自训练(Self-training)

什么是机器学习 半监督学习中的自训练&#xff08;Self-training&#xff09;是一种利用已标记数据和未标记数据进行模型训练的方法。以下是自训练的详细教程&#xff1a; 步骤一&#xff1a;准备数据集 标记数据集&#xff1a; 收集和标记一小部分数据&#xff0c;用于有监…...

outlook邮件群发单显技巧?群发怎么单显?

outlook邮件群发单显如何设置&#xff1f;QQ邮箱怎么群发单显&#xff1f; 在群发邮件时&#xff0c;如何让每个收件人只看到自己的名字&#xff0c;而不是其他人的名字&#xff0c;这就涉及到所谓的“单显”技巧。下面蜂邮EDM就为大家揭秘Outlook邮件群发单显的奥秘。 outlo…...

【REST2SQL】07 GO 操作 Mysql 数据库

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 【REST2SQL】06 GO 跨包接口重构代码 MySQL是一个关系型数据库管理系统&#xf…...

[UI5] ODATA V4中的CRUD

文章目录 前言一、Read二、Create三、Update四、Delete 前言 ODATA V4在CRUD方面与V2截然不同。 这篇文章简单介绍V4中是如何进行CRUD操作 一、Read Model不再有read方法&#xff0c; 一般是把Path绑定到View中进行读取&#xff0c; 如果需要额外的读取数据&#xff0c;可使用…...

js封装根据年月日获取星座效果demo(整理)

//根据年月日获取星座 function getZodiacSign(dateString) {// 用法:const dateStr 2024-01-11;// const zodiacSign getZodiacSign(dateStr);const date new Date(dateString);const month date.getMonth() 1;const day date.getDate();if ((month 1 && day &…...

Vue.js设计与实现阅读-2

Vue.js设计与实现阅读-2 1、前言2、框架设计的核心要素2、1 提升用户体验2、2 控制代码体积2、3 Tree-Shaking2、4 特性开关2、5 错误处理 1、前言 上一篇我们了解到了 命令式和声明式的区别&#xff0c;前者关注过程&#xff0c;后者关注结果了解了虚拟dom存在的意义&#x…...

GEM5 McPAT教程:源代码解读McPAT NoC功耗 arbiter部分

简介 McPAT用的很多,大多只是写个python或perl脚本替换xml文件.没有深入到为什么xml脚本这些值要换,以及这写填进去xml的值是怎么影响计算的.本问从源代码一步步读下来,解释每一步是如何计算的. power 构成: 动态功耗其实更相关于energy McPAT的power 核心是两类,动态和静态…...

使用组合框QComboBox模拟购物车

1.组合框: QComboBox 组合框&#xff1a;QComboBox 用于存放一些列表项 实例化 //实例化QComboBox* comboBox new QComboBox(this);1.1 代码实现 1.1.1 组合框的基本函数 QComboBox dialog.cpp #include "dialog.h" #include "ui_dialog.h"Dialog::Dialog…...

云服务器十大服务商——云服务器哪家好用

云服务器哪家便宜&#xff1f;2024最新整理你要的都在这&#xff01;头部云厂商阿里云、腾讯云、华为云、京东云、UCloud等都在降价&#xff0c;阿腾云atengyun.com分享2024年云服务器租用价格给你惊喜&#xff01; 便宜云服务器阿里云腾讯云华为云 2024年便宜云服务器汇总&…...

SQL DML

# DML—添加数据 1.给指定字段添加数据 INSERT INTO表名(字段名1,字段名2,...)VALUES(值1&#xff0c;值2...); 2.给全部字段添加数据 INSERT INTO表名VALUES(值1&#xff0c;值2,...); 3.批量添加数据 INSERT INTO表名(字段名1,字段名2,...)VALUES(值1&#xff0c;值2..…...

MySQL--基础篇

这里写目录标题 总览MySQl各个阶段基础篇总览 MySQL概述数据库相关概念查看本机MySQL版本号启停mysql打开windows服务管理windows命令行启停 连接mysql客户端mysql运行逻辑数据模型关系型数据库 总结 SQL总览SQL通用语法SQL语句分类DDL数据库操作表操作查询表创建表结构数据类型…...

[VUE]5-TypeScript

目录 1 TypeScript 介绍2、安装3、快速上手4、TypeScript 常用类型4.1 类型标注的位置4.2 字符串、数字、布尔类型4.3 字面量类型4.4 ⭐interface 类型4.5 class 类型 ​&#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;…...

Linux指令(一)

今天来学习Linux的一些基本的指令。 今天要学习的指令有ls&#xff0c;pwd&#xff0c;mkdir&#xff0c;cd&#xff0c;touch&#xff0c;rm等。 指令的格式 在Linux中&#xff0c;指令的语法通常遵循以下格式&#xff1a; command [options] [arguments] command 是要执行…...

C语言中的回文素数

任意的整数&#xff0c;当从左向右读与从右向左读是相同的&#xff0c;且为素数时&#xff0c;称为回文素数。求 1000 以内的所有回文素数。 算法思想 实例的重点是判断一个数是否是回文素数。要输出 1000 以内的所有回文素数&#xff0c;首先应判断这个数是否是素数&#xf…...

前端生成pdf之html2canvas+jsPDF,以及解决图片不显示bug

前端如何生成pdf 开发背景&#xff1a; 需要给页面中相应的内容生成pdf&#xff0c;查找文档后发现要用到两个插件。html2canvas 以及 jsPDF html2canvas 给dom结构转化为canvas&#xff0c;然后生成各种类型图片jsPDF 把canvas 生成的图片url 转化为pdf // 插入图片 pdf.addI…...

Qwen3-0.6B-FP8应用场景:开发者测试LLM应用前端UI兼容性的沙盒环境

Qwen3-0.6B-FP8应用场景&#xff1a;开发者测试LLM应用前端UI兼容性的沙盒环境 1. 引言&#xff1a;为什么需要一个轻量级的“测试沙盒”&#xff1f; 如果你正在开发一个基于大语言模型的应用&#xff0c;比如一个智能客服系统、一个文档助手&#xff0c;或者一个创意写作工…...

s2-pro实战落地:跨境电商产品介绍多语种语音批量生成

s2-pro实战落地&#xff1a;跨境电商产品介绍多语种语音批量生成 1. 场景痛点与解决方案 跨境电商企业面临一个共同挑战&#xff1a;如何高效地为全球不同语言市场的产品生成专业语音介绍。传统方案需要雇佣多语种配音人员&#xff0c;成本高、周期长&#xff0c;且难以保证语…...

cv_unet_image-colorization音乐史料处理:黑白乐谱AI上色与音符语义关联增强

cv_unet_image-colorization音乐史料处理&#xff1a;黑白乐谱AI上色与音符语义关联增强 1. 引言&#xff1a;当黑白乐谱遇见AI色彩 想象一下&#xff0c;你是一位音乐史研究者&#xff0c;面前摊开一本泛黄的、只有黑白线条的19世纪乐谱手稿。那些音符、标记、作曲家的笔迹&…...

解决Android 12 NFC功能失效:PendingIntent.FLAG_MUTABLE的正确用法

Android 12 NFC开发实战&#xff1a;PendingIntent可变性标志的深度解析 在移动支付和门禁系统逐渐普及的今天&#xff0c;NFC技术已经成为现代智能手机不可或缺的功能之一。然而&#xff0c;随着Android系统的版本迭代&#xff0c;开发者们不得不面对各种兼容性挑战。特别是在…...

开源工具SMUDebugTool:系统优化与性能调优的终极解决方案

开源工具SMUDebugTool&#xff1a;系统优化与性能调优的终极解决方案 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:/…...

FUTURE POLICE语音模型重装系统后快速恢复部署指南

FUTURE POLICE语音模型重装系统后快速恢复部署指南 重装系统这事儿&#xff0c;对开发者来说&#xff0c;有时候就跟电脑的“大扫除”一样&#xff0c;图个干净利落。但扫除完&#xff0c;看着空空如也的桌面和命令行&#xff0c;要重新把那些吃饭的家伙——比如你正在跑的FUT…...

破解Agent“半途摆烂”困局,OpenDev凭Harness架构,撕开Code Agents的工程化真相

玩过AI Agent的人&#xff0c;几乎都有过这样的崩溃时刻&#xff1a;前几轮交互里&#xff0c;它思路清晰、反应迅速&#xff0c;像个无所不能的天才&#xff0c;你说修改一段代码&#xff0c;它能精准命中漏洞&#xff1b;你让它梳理项目结构&#xff0c;它能条理分明地给出方…...

小白友好:InstructPix2Pix极速推理,秒级响应你的修图指令

小白友好&#xff1a;InstructPix2Pix极速推理&#xff0c;秒级响应你的修图指令 你有没有过这样的经历&#xff1f;手机里存着一张照片&#xff0c;风景很美&#xff0c;但天空灰蒙蒙的&#xff1b;或者朋友聚会合影&#xff0c;大家都笑得很开心&#xff0c;就是背景有点乱。…...

PyCharm 2025.2 离线安装与配置全攻略:绕过登录,直接使用完整汉化版

PyCharm 2025.2 离线安装与配置全攻略&#xff1a;企业级免登录解决方案 在企业开发环境中&#xff0c;Python开发者常常面临网络限制、账号管理繁琐等问题。PyCharm作为最受欢迎的Python IDE之一&#xff0c;其官方版本需要联网激活和登录JetBrains账户&#xff0c;这对内网开…...

探索DevOps之路:2024年DevOps路线图

探索DevOps之路&#xff1a;2024年DevOps路线图 【免费下载链接】DevOps-Roadmap DevOps Roadmap for 2026. with learning resources 项目地址: https://gitcode.com/GitHub_Trending/de/DevOps-Roadmap 项目介绍 DevOps Roadmap 2024 是一个精心设计的步骤指南&#…...