RT-Thread学习笔记(三):线程管理

线程管理

  • 线程管理相关概念
    • 什么是时间片轮转
    • 调度器锁
    • 线程运行机制
    • 线程的五种状态
  • 动态和静态创建线程区别
    • 动态和静态创建线程优缺点
    • RT-Thread动态线程管理函数
      • 动态创建线程
      • 动态删除线程
    • RT-Thread静态线程管理函数
      • 静态创建线程
  • 线程其他操作
    • 线程启动
    • 线程延时
    • 获得当前执行的线程句柄

线程管理相关概念

什么是时间片轮转

时间片轮转主要用于相同优先级的线程,按线程所需时间片大小轮流运行
每个线程都需要配置时间片, 时间片仅对优先级相同的就绪态线程有效, 系统对其进行调度约束线程单次运行时长。
假设有 2 个优先级相同的就绪态线程 A 与 B, A 的时间片为 10, B 的时间片为 5, 那么系统会在A、 B 线程间来回切换执行, 并且每次对 A 线程执行 10 个节拍的时长, 对 B 线程执行 5个节拍的时长。

调度器锁

调度器是操作系统的核心,其主要功能就是实现线程的切换,即从就绪列表里面找到优先级最高的线程,然后去执行该线程。
调度器锁用于部分代码,避免被线程机制抢占

rt_enter_critical(); /* 进入临界区 */
/* 用户把需要上锁的代码放在这里 */
rt_exit_critical(); /* 退出临界区 */

线程运行机制

线程具有独立的栈空间, 当进行线程切换时, 会将当前线程的上下文存在栈中, 当线程要恢复运行时, 再从栈中读取上下文信息, 进行恢复。线程栈还用来存放函数中的局部变量。

线程的五种状态

在这里插入图片描述
在这里插入图片描述

动态和静态创建线程区别

动态创建线程是在运行时才动态创建线程的控制块和堆栈空间
静态创建线程是在编译时就将线程的控制块和堆栈空间预分配好,然后再初始化启动;

动态和静态创建线程优缺点

  1. 动态创建线程优点
    对于非固定的线程(运行过程可以销毁,短暂使用的线程),灵活分配线程内存

  2. 静态创建线程优点
    对于固定线程,不会产生动态内存分配,确保线程创建成功
    创建速度快,用于确认线程的项目可提前发现内存是否不足

RT-Thread动态线程管理函数

动态创建线程

rt_thread_t  rt_thread_create(	const char *name,                  //线程名称void (*entry)(void *parameter),    //线程的入口函数void       *parameter,             //入口函数的参数指针rt_uint32_t stack_size,            //线程堆栈的大小rt_uint8_t  priority,              //线程优先级rt_uint32_t tick)                  //线程调度的时间片大小

创建成功,返回线程句柄;创建失败,返回RT_NULL

动态删除线程

rt_err_t rt_thread_delete(rt_thread_t thread); 

删除线程成功,返回RT_EOK ;删除线程失败,返回-RT_ERROR

RT-Thread静态线程管理函数

静态创建线程

rt_err_t 
rt_thread_init(struct rt_thread *thread,          //线程控制块指针const char       *name,            //线程名称void (*entry)(void *parameter),    //线程的入口函数void             *parameter,       //入口函数的参数指针void             *stack_start,     //线程堆栈的起始地址rt_uint32_t       stack_size,      //线程堆栈的大小rt_uint8_t        priority,        //线程的优先级rt_uint32_t       tick)            //线程调度的时间片大小

在这里插入图片描述

线程其他操作

线程启动

rt_err_t rt_thread_startup(rt_thread_t thread);

线程延时

rt_err_t rt_thread_sleep(rt_tick_t tick); // 以 1 个 OS Tick 为单位
rt_err_t rt_thread_delay(rt_tick_t tick); // 以 1 个 OS Tick 为单位
rt_err_t rt_thread_mdelay(rt_int32_t ms); // 以 ms 为单位

获得当前执行的线程句柄

rt_thread_t rt_thread_self(void);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/113734.shtml

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

相关文章

四、基本组件

1. Designer设计师 Designer程序是Qt官方推出的专为设计人员使用的UI设计工具,程序员可以使用此工具大幅降低UI设计的代码量。 Designer设计文件的格式是.ui,需要配合同名的头文件与源文件使用。.ui文件通常被称为界面文件,其内部是xml语法的…

微机原理:汇编语言语句类型与格式

文章目录 壹、语句类型1、语句分类2、常用伪代码和运算符2.1数据定义伪指令2.1.1字节定义伪指令DB(8位)2.1.2字定义伪指令DW(16位)2.1.3双字节伪指令DD2.1.4 多字节定义DF/DQ/DT(了解) 2.2 常用运算符2.2.1…

【数据库】SQL 过滤数据

过滤数据 简单过滤where 子句操作符检查单个值范围值检擦空值检查 高级过滤多个过滤条件求值顺序IN 操作符NOT 操作符 在 s q l sql sql 语句中,通过 WHERE 子句指定搜索条件进行过滤。 简单过滤 包含:WHERE,BETWEEN,IS NULL&a…

面向对象与面向过程讲解

目录 简介 面向过程编程(Procedural Programming) 什么是面向过程编程? 特点: 面向对象编程(Object-Oriented Programming) 什么是面向对象编程? 特点: 面向对象 vs. 面向过程…

学习人工智能

在线课程 优达学城 当斯坦福大学讲师 Sebastian Thrun 和 Peter Norvig 将他们的课程“人工智能概论”免费放到网上时,Udacity 开始了在线学习的实验。从那时起,它就受到了巨大的欢迎(来自 190 多个国家的 160,000 名学生)&#x…

[java进阶]——异常详解,try catch捕获异常,抛出异常

🌈键盘敲烂,年薪30万🌈 目录 一、异常的体系结构 二、处理异常的本质 三、异常处理的三种方式 3.1虚拟机jvm处理(默认) 3.2 try catch捕获异常 3.3抛出异常 3.4finally关键字 四、自定义异常 五、总结 一、异常的体系结构 分析&#…

【uniapp】proxy 代理切换至线上测试地址调试接口

本地测试地址形如:http://192.168.124.x:xxxx 线上测试地址形如:https://xxxx.xxxx.com 使用线上地址之后需要修改配置项 secure 为 true const constant require(./src/utils/constant) module.exports {devServer: {proxy: {/api: {target: constan…

Node-EventEmitter的用法

题记 EventEmitter的用法,以下是详细过程和代码。 Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。 Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.readStream 对象会…

[python-大语言模型]从浅到深一系列学习笔记记录

整体学习路径参照:点这里 python-机器学习-深度学习-大语言模型-数据开发 面向开发者的LLM入门提示原则 面向开发者的LLM入门 学习链接: github地址:https://github.com/datawhalechina/prompt-engineering-for-developers 在线阅读地址&…

【LeetCode】145. 二叉树的后序遍历 [ 左子树 右子树 根结点]

题目链接 文章目录 Python3方法一: 递归 ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法二: 迭代 ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法三: Morris ⟮ O ( n ) 、 O ( 1 ) ⟯ \lgroup O(n)、O(1) \rgroup ⟮O(n)、O(1)⟯写…

MySQL表操作—存储

建表: mysql> create table sch( -> id int primary key, -> name varchar(50) not null, -> glass varchar(50) not null -> ); Query OK, 0 rows affected (0.01 sec) 插入数据: mysql> insert into sch (id,name,…

c语言练习94:分割链表

分割链表 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1: 输入:head [1,4,3,2,5,2], x…

短视频矩阵系统源码(搭建)

短视频矩阵源码的开发路径分享如下: 1、首先,确定项目需求和功能,包括用户上传、编辑、播放等。 2、其次,搭建开发环境,选择合适的开发工具和框架。 3、然后,进行项目架构设计和数据库设计,确…

PHPExcel 字母列不够用,针对 AA、AB、AC ... ZZ 这样的列

在PHPExcel 导出功能中,如果字段超过26个字母时,会出现字母不够用A~Z后 AA~AZ来添加后续字段 php中,chr() 函数从指定 ASCII 值返回字符,可以自定义一个方法来返回对应的字母 // $num 列数 1,2,3,4,5,6,7...... function getCol…

弹出框,使用树结构查询数据

效果如下: 描述:希望点击某个按钮,弹出一个窗口,然后通过下拉框,点击下拉框里面的组织信息,然后查询对应组织的成员对象列表,并展示到表格中 HTML代码(最主要的就是树的那个): <el-dialog :visible.sync="TesteePage.showDialog" width="70%&quo…

Spring 解决获取请求参数的乱码问题

解决获取请求参数的乱码问题 解决获取请求参数的乱码问题&#xff0c;可以使用SpringMVC提供的编码过滤器CharacterEncodingFilter&#xff0c;但是必须在web.xml中进行注册 <!--配置springMVC的编码过滤器--> <filter><filter-name>CharacterEncodingFilt…

git远端协同开发、解决冲突、分支合并、gitlab使用、远程仓库回滚、为开源项目贡献代码、git工作流,git pull和git fetch,变基

协同开发 避免冲突 张三&#xff1a;改了 settings.py 第一行&#xff0c;提交了 李四&#xff1a;改了 settings.py 第二行&#xff0c;提交了 你也在改setting.py ,没有拉取代码&#xff0c;不知道他们提交了&#xff0c;动了第二行&#xff0c;但是跟李四代码不一样 你要…

【CGSSA-BP预测】基于混合混沌-高斯变异-麻雀算法优化BP神经网络回归预测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

GenericWriteAheadSink每次checkpoint后事务是否必须成功

背景 GenericWriteAheadSink原理是把接收记录按照检查点进行分段&#xff0c;每个到来的记录都放到对应的分段中&#xff0c;这些分段内的记录是作为算子状态的形式存储和故障恢复的&#xff0c;对于每个分段内的记录列表&#xff0c;flink会在收到检查点完成的通知时把他们都…

用Wokwi仿真ESP-IDF项目

陈拓 2023/10/21-2023/10/21 1. 概述 Wokwi是一个在线的电子电路仿真器。你可以使用它来仿真Arduino、ESP32、STM32和许多其他流行的电路板、元器件以及传感器&#xff0c;免去使用开发板。 Wokwi提供基于浏览器的界面&#xff0c;您可以通过这种简单直观的方式快速开发一个…