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

news2025/1/18 1:54:15

空闲线程和两个钩子函数

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

空闲线程还负责一些系统资源回收以及将一些处于关闭状态的线程从线程调度列表中移除;
空闲线程在形式上是一个无限循环且永远不被挂起的线程;
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.coloradmin.cn/o/679162.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nautilus Chain:模块化Layer3架构为RWA赛道构建基础设施

DeFi Summer后&#xff0c;加密行业经历了新一轮的爆发、增长后&#xff0c;整体的发展逐渐陷入滞缓。传统金融是一个经过了上百年发展的成熟市场&#xff0c;将800万亿美元体量的传统金融不断引入到链上有望推动加密行业迎来新一轮的质变。将传统资产以加密代币化的形式引入到…

【从零开始学习JAVA | 第十七篇】抽象类与抽象方法

目录 前言&#xff1a; 抽象类与抽象方法&#xff1a; 抽象类&#xff1a; 抽象方法&#xff1a; 特点&#xff1a; 抽象类 抽象方法 注意事项 抽象类 与 抽象方法的意义 抽象类 抽象方法 前言&#xff1a; 在之前&#xff0c;如果我们要构建两个相同类型的类的时候&…

【C++】泛型编程——模板进阶

文章目录 前言1. 模板参数的分类2. 非类型模板参数2.1 非类型模板参数的概念2.2 铺垫2.2 非类型模板参数的使用2.4 注意2.5 array的了解 3. 模板的特化3.1 概念3.2 函数模板特化3.3 类模板特化3.3.1 全特化3.3.2 偏特化部分特化参数更进一步的限制 4. 模板分离编译4.1 什么是分…

基于TF-IDF算法个人文件管理系统——机器学习+人工智能+神经网络(附Python工程全部源码)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 词频计算与数据处理3. 数据计算与对比验证 系统测试工程源代码下载其它资料下载 前言 本项目旨在通过应用TF-IDF算法&#xff0c;将新下载的课件进行自动分类整理。我们的方法是通过比较新文件中的…

Matlab统计分析-相关系数

统计分析-相关系数 相关系数 (pearson与spearman) 皮尔逊 person相关系数和斯皮尔曼spearman等级相关系数&#xff0c;它们可用来衡量两个变量之间的**(线性)**相关性的大小&#xff0c;根据数据满足的不同条件&#xff0c;我们要选择不同的相关系数进行计算和分析。 基础概…

C生万物 | 常见的六种动态内存错误

学习过C语言中的动态内存函数&#xff0c;例如【malloc】、【calloc】、【realloc】、【free】&#xff0c;那它们在使用的过程中会碰到哪些问题呢&#xff0c;本本文我们一起来探讨下~ 1、对NULL指针的解引用操作 代码&#xff1a; void test() {int *p (int *)malloc(INT_…

Sui链上事务处理概述

Sui通过其混合式交易处理方法&#xff0c;实现比其他区块链更快速和高效的性能。这种方法使得Sui的交易测试吞吐率达到每秒297,000次。从实际应用的角度来看&#xff0c;使用Sui的用户在apps和游戏中几乎能够获得实时响应。 在区块链世界中&#xff0c;交易是apps运作的基础&a…

AutoHotKey脚本的循环:While和Loop

While AHK提供三种循环方法&#xff0c;分别是Loop, While和For&#xff0c;其中While和For在其他语言中都很常见&#xff0c;下面通过while循环&#xff0c;实现一个鼠标框选矩形尺寸的脚本 ; 来自官网的案例 CoordMode "Mouse", "Screen"~LButton:: {M…

【文献分享】基于感知质量的滚动优化无人机导航

论文题目&#xff1a;Perception-aware Receding Horizon Navigation for MAVs 作者&#xff1a;Zhang, Zichao ; Scaramuzza, Davide 作者机构&#xff1a;苏黎世大学 论文链接&#xff1a;https://files.ifi.uzh.ch/rpg/website/rpg.ifi.uzh.ch/html/docs/ICRA18_Zhang.pd…

【雕爷学编程】Arduino动手做(122)---BH1750光照传感器

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

使用近10年,说说向大家推荐Linux系统的理由

使用linux已经快十年了&#xff0c;一直想推荐身边的使用linux,但是一直没有分享。但是现在我想分享推荐了。下面我们一起聊聊为什么我向大家推荐linux。 为什么现在我想推荐了呢&#xff1f;是因为我自认为相对于同龄人来说&#xff0c;我使用桌面版的时间算是挺长的了&#…

彻底搞懂什么是阿里云服务器vCPU?

阿里云ECS服务器vCPU和CPU是什么意思&#xff1f;CPU和vCPU有什么区别&#xff1f;一台云服务器ECS实例的CPU选项由CPU物理核心数和每核线程数决定&#xff0c;CPU是中央处理器&#xff0c;一个CPU可以包含若干个物理核&#xff0c;通过超线程HT&#xff08;Hyper-Threading&am…

走向计算机视觉的通用人工智能:从GPT和大型语言模型中汲取的经验教训 (下)...

点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;计算机视觉研究院 学习群&#xff5c;扫码在主页获取加入方式 论文地址&#xff1a;https://arxiv.org/pdf/2306.08641.pdf 计算机视觉研究院专栏 Column of Computer Vision Institute 人工智能…

Matlab预测模型-灰色预测模型

预测模型-灰色预测模型 灰色预测是对既含有已知信息又含有不确定信息的系统进行预测&#xff0c;就是对在一定范围内变化的、与时间有关的灰色过程进行预测。灰色预测对原始数据进行生成处理来寻找系统变动的规律&#xff0c;并生成有较强规律性的数据序列&#xff0c;然后建立…

Linux学习[19]管线命令详解1---cut, grep, sort, wc, uniq

文章目录 1. 何为管线2. 摘取命令&#xff1a;cut, grep2.1 cut2.2 grep 3. 排序命令sort,wc,uniq3.1 sort3.2 uniq3.3 wc 总结 1. 何为管线 管线命令和Linux学习18里面的连续执行指令少许不同。他是只有在前面指令执行正确的时候&#xff0c;才会执行管线命令。 即这个管线命…

基于Vue+Node.js的宠物领养网站的设计与开发-计算机毕设 附源码 83352

基于VueNode.js的宠物领养网站的设计与开发 摘 要 随着互联网大趋势的到来&#xff0c;社会的方方面面&#xff0c;各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去&#xff0c;而其中最好的方式就是建立网络管理系统&#xff0c;并对其进行信息管理。由…

彻底卸载mysql的详细步骤

目录 一、前言 二、操作步骤 &#xff08;一&#xff09; 停止mysql的服务 &#xff08;二&#xff09;控制面板卸载 &#xff08;三&#xff09;清除残留的文件 &#xff08;四&#xff09;删除注册表内容 &#xff08;五&#xff09;删除MySQL环境变量 一、前言 卸载…

spider-flow新手暴力入门

1.入口 链接跳转: spider-flow 或者本地有git软件直接输入gittt中的链接地址&#xff0c;回车键梭哈即可 2.环境部署&#xff0c;必备jdk8mysql idea打开项目&#xff0c;重点修改如下 mysql用小皮软件&#xff08;phpstudy&#xff09;自带的mysql5,navicat软件导入sql文…

SEO一般多久时间才会有效果?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言什么是SEOSEO的时间…

Sui x KuCoin Labs夏季黑客松第二批入围项目公布

Sui x KuCoin Labs夏季黑客松仍在如火如荼地进行中。自第一批入围项目名单公布后一周&#xff0c;第二批入围项目现已经过审核&#xff0c;入围最终Demo Day。 第二批入围名单 Vimverse Vimverse是一个基于Sui构建的创新生态金融平台&#xff0c;旨在释放去中心化储备货币协…