RT-Thread之线程管理(线程的基础概念和使用)

news2025/5/20 10:52:32

文章目录

  • 前言
  • 一、RT-Thread线程的概念
  • 二、线程的创建与删除
    • 2.1用户线程和系统线程
    • 2.2线程控制块
    • 2.3线程栈
    • 2.4入口函数
  • 三、线程的创建和启动
    • 3.1线程创建的种类
    • 3.2动态创建线程
    • 3.3静态创建线程
  • 总结


前言

本篇文章来给大家讲解RT-Thread中的线程管理,线程管理是属于最基础的部分,这篇文章将带大家学习如何在RT-Thread使用线程。

一、RT-Thread线程的概念

线程:在 RT-Thread 中,线程是程序执行的基本单元。每个线程都拥有自己的独立栈空间和执行上下文,可以独立运行。RT-Thread 使用线程来实现并发执行,允许多个线程同时执行不同的任务。

线程的特点:

轻量级:RT-Thread 的线程管理采用了轻量级的设计,使得创建、切换和销毁线程的开销非常小。

独立性:每个线程都是独立运行的,拥有自己的栈空间和执行上下文,不受其他线程的影响。

并发执行:多个线程可以同时执行,通过时间片轮转或优先级调度来实现并发执行。

可抢占:RT-Thread 支持线程的抢占式调度,高优先级线程可以抢占低优先级线程的执行权。

二、线程的创建与删除

2.1用户线程和系统线程

用户线程:

功能:用户线程是由应用程序开发者创建和管理的线程,用于执行应用程序的业务逻辑。这些线程通常用于处理特定的任务、算法或功能模块,例如传感器数据采集、通信协议处理、用户界面操作等。

特点:用户线程的创建、销毁和调度由应用程序开发者控制,可以根据应用程序的需要动态地创建和管理线程。
典型应用:用户线程通常用于实现应用程序的各个功能模块,是应用程序的核心部分。

系统线程:

功能:系统线程是由 RT-Thread 内核创建和管理的线程,用于执行系统级的任务和服务。这些线程通常用于实现 RT-Thread 内核的基本功能,如时钟管理、内存管理、设备驱动、任务调度等。

特点:系统线程的创建、销毁和调度由 RT-Thread 内核自动管理,通常在系统初始化阶段就会被创建,并在整个系统运行期间保持运行。
典型应用:系统线程通常用于支持 RT-Thread 内核的正常运行,提供各种系统级的服务和功能。

这两类线程都会从内核对象容器中分配线程对象,如下图所示。 每个线程由三部分组成:线程控制块(rt_thread 结构体)、线程栈和入口函数。

在这里插入图片描述

2.2线程控制块

线程控制块由结构体 struct rt_thread 表示,线程控制块是操作系统用于管理线程的一个数据结构。

它存放线程的一些信息,例如优先级、线程名称、线程状态等,也包含线程与线程之间连接用的链表结构,线程等待事件集合等。

它在 rtdef.h 中定义如下:

/**
* Thread structure
*/
struct rt_thread
{
	 /* rt 对象 */
	 char name[RT_NAME_MAX]; /* 线程名字 */
	 rt_uint8_t type; /* 对象类型 */
	 rt_uint8_t flags; /* 标注位 */
	 rt_list_t list; /* 对象列表 */
	 rt_list_t tlist; /* 线程列表 */
	 /* 栈指针和入口指针 */
	 void *sp; /* 栈指针 */
	 void *entry; /* 入口函数指针*/
	 void *parameter; /* 参数 */
	 void *stack_addr; /* 栈地址指针 */
	 rt_uint32_t stack_size; /* 栈大小*/
	 /* 错误代码 */
	 rt_err_t error; /* 线程错误代码 */
	 rt_uint8_t stat; /* 线程状态 */
	 /* 优先级 */
	 rt_uint8_t current_priority; /* 当前优先级 */
	 rt_uint8_t init_priority; /* 初始优先级 */
	…………
	 rt_ubase_t init_tick; /* 线程初始化计数值 */
	 rt_ubase_t remaining_tick; /* 线程剩余计数值 */
	 struct rt_timer thread_timer; /* 内置线程定时器 */
	 void (*cleanup)(struct rt_thread *tid); /* 线程退出清理函数 */
	 rt_uint32_t user_data; /* 用户私有数据*/
	};
	typedef struct rt_thread *rt_thread_t;

2.3线程栈

概念:线程栈是用来存储线程执行过程中的局部变量、函数调用信息以及线程执行状态的一段内存空间。每个线程都拥有自己独立的线程栈,用于保存线程的执行上下文。

作用:线程栈在线程执行期间起到了重要作用,它保存了线程执行过程中的临时数据和状态信息,保证了线程的独立性和安全性。

大小:线程栈的大小通常由用户在创建线程时指定,根据线程的具体任务和需求来确定。过小的线程栈可能导致栈溢出,而过大的线程栈则会浪费内存资源。

2.4入口函数

概念:线程入口函数是线程创建时指定的一个函数,线程在启动时将从该函数开始执行。通常情况下,线程入口函数负责执行线程的实际任务逻辑,并在任务完成后终止线程的执行。

特点:线程入口函数可以是任何符合特定格式的函数,通常以特定的参数和返回值形式定义。在函数内部,开发者可以编写线程的具体逻辑,完成所需的任务。

参数:线程入口函数通常接受一个参数,这个参数可以是任意类型的数据,用于传递给线程的任务逻辑所需的参数信息。

返回值:线程入口函数通常没有返回值,或者返回一个表示执行结果或错误码的值。

三、线程的创建和启动

3.1线程创建的种类

静态创建:

概念:静态创建是指在编译时确定线程栈和线程控制块的大小,并在初始化阶段就创建好线程的方法。这种方法需要在编译时确定线程的数量和属性,线程的生命周期与系统的生命周期一致。

特点:静态创建的线程在系统初始化时创建,并且在整个系统运行期间保持不变。静态创建的线程在内存中占用固定的空间,不会动态增加或减少。

动态创建:

概念:动态创建是指在运行时根据需要创建线程的方法。这种方法允许在运行时根据系统的实际需求动态地创建和销毁线程,灵活性更高。
特点:动态创建的线程可以根据系统的运行状态和需求进行动态调整,从而更好地适应不同的应用场景。

3.2动态创建线程

rt_thread_init() 函数:

参数:
thread:线程控制块(Thread Control Block, TCB),用于指定要初始化的线程的属性和初始化信息。
name:线程的名称,用于标识线程。
entry:线程的入口函数,即线程启动后要执行的函数。
parameter:线程入口函数的参数,可以是任意类型的数据,用于传递给线程入口函数。
stack_start:线程的栈起始地址,即线程栈的起始位置。
stack_size:线程栈的大小,以字节为单位。
priority:线程的优先级,用于确定线程在系统中的执行顺序。
tick:线程的时间片,即线程在运行后执行的时间。

返回值:
该函数无返回值。

示例代码:

#include <rtthread.h>

static struct rt_thread thread; // 定义线程控制块
static char thread_stack[512];   // 定义线程栈

void thread_entry(void* parameter)
{
    // 线程的入口函数,实现线程的具体逻辑
}

int main(void)
{
    // 初始化线程
    rt_thread_init(&thread, "my_thread", thread_entry, NULL, thread_stack, sizeof(thread_stack), 10, 20);
    // 启动线程
    rt_thread_startup(&thread);
    return 0;
}

3.3静态创建线程

rt_thread_create() 函数:

参数:
name:线程的名称,用于标识线程。
entry:线程的入口函数,即线程启动后要执行的函数。
parameter:线程入口函数的参数,可以是任意类型的数据,用于传递给线程入口函数。
stack_size:线程栈的大小,以字节为单位。
priority:线程的优先级,用于确定线程在系统中的执行顺序。
tick:线程的时间片,即线程在运行后执行的时间。
返回值:
成功创建线程时返回线程控制块指针,失败时返回 NULL。

示例代码:

#include <rtthread.h>

void thread_entry(void* parameter)
{
    // 线程的入口函数,实现线程的具体逻辑
}

int main(void)
{
    // 创建线程
    rt_thread_t tid = rt_thread_create("my_thread", thread_entry, NULL, 512, 10, 20);
    // 启动线程
    if (tid != RT_NULL) {
        rt_thread_startup(tid);
    }
    return 0;
}

总结

本篇文章我们主要给大家讲解了RT-Thread中的线程的一些基础概念和基础使用方法。

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

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

相关文章

GD32E103C8T6 封装LQFP-48 GigaDevice(兆易创新) 单片机

GD32E103C8T6 是由GigaDevice&#xff08;兆易创新&#xff09;公司生产的一款基于ARM Cortex-M4内核的32位MCU&#xff08;微控制器&#xff09;。以下是GD32E103C8T6的一些主要功能和参数介绍&#xff1a; 主要功能&#xff1a; 高性能ARM Cortex-M4内核: 采用120MHz的ARM …

Matlab实现CNN-BiLSTM模型,对一维时序信号进行分类

1、利用Matlab2021b训练CNN-BiLSTM模型&#xff0c;对采集的一维时序信号进行分类二分类或多分类 2、CNN-BiLSTM时序信号多分类执行结果截图 训练进度&#xff1a; 网络分析&#xff1a; 指标变化趋势&#xff1a; 代码下载方式&#xff08;代码含数据集与模型构建&#xff0…

iview 自定义项求和的方法和错误点

这是iview自定义某几项参数合计的方法&#xff0c;其实是蛮简单的&#xff0c;很多人自定义合计的时候&#xff0c;老是会不知道怎么处理除了需要合计的几项的其他项&#xff0c;其实不需要管&#xff0c;不需要合计的项直接返回空就好了&#xff0c;需要的就在计算的里面做key…

MyBatis 核心配置讲解(下)

大家好&#xff0c;我是王有志&#xff0c;一个分享硬核 Java 技术的互金摸鱼侠。 我们书接上回&#xff0c;继续聊 MyBatis 的核心配置&#xff0c;我们今天分享剩下的 5 项核心配置。 不过正式开始前&#xff0c;我会先纠正上一篇文章 MyBatis 核心配置讲解&#xff08;上&…

【链表——数据结构】

文章目录 1.单链表1.定义2.基本操作2.1.不带头结点2.2后插2.3前插2.4删除2.5按位查找2.6按值查找2.7求单链表长度2.8 建表 2.双链表1.初始化2.插入(后插)3.删除(后删)4.遍历 3.循环链表1.循环单链表2.循环双链表3.代码问题 4.静态链表1.简述基本操作的实现1.初始化3.删除某个结…

【AIGC调研系列】Sora级别的国产视频大模型-Vidu

Vidu能够达到Sora级别的标准。Vidu被多个来源认为是国内首个Sora级别的视频大模型[2][3][4]。它采用了团队原创的Diffusion与Transformer融合的架构U-ViT&#xff0c;能够生成长达16秒、分辨率高达1080P的高清视频内容[1][6]。此外&#xff0c;Vidu的一致性、运动幅度都达到了S…

vue2如何创建一个项目?

目录 1. 安装环境&#xff1a; 2. 安装Vue CLI 3. 创建新项目 4. 选择配置 5. 安装依赖并运行 6. 开始开发 7. 构建项目 8. 预览生产环境构建 首先创建一个vue2项目&#xff0c;你可以通过以下步骤进行&#xff1a; 1. 安装环境&#xff1a; 保证自己的电脑已经安装N…

Jmeter Beanshell 设置全局变量

//获取token import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONArray; import java.util.*; import org.apache.jmeter.util.JMeterUtils; //获取可上机机器 String response prev.getResponseDataAsString(); JSONObject responseObect JSONObjec…

rancher/elemental 构建不可变IOS(一)

一、什么是elemental Elemental 是 Rancher 的一个变种&#xff0c;专注于提供一个更轻量级的 Kubernetes 发行版。它旨在提供简化的部署和管理体验&#xff0c;同时保持 Kubernetes 的灵活性和强大功能。Elemental 通常针对较小的部署场景或资源受限的环境&#xff0c;例如测…

PY32F040单片机产品介绍,LQFP封装,带LCD 驱动器

PY32F040单片机搭载了 Arm Cortex-M0内核&#xff0c;最高主频可达72 MHz&#xff0c;专为高性价比、高可靠性的系统而设计&#xff0c;符合消费市场的基本设计需求。可广泛应用于电机控制、手持设备、PC 外设、以及复杂的数字控制应用等领域。 PY32F040片内集成 UART、I2C、S…

Pycharm配深度学习环境所遇到的部分问题

问题1&#xff1a;Anaconda prompt界面安装CUDA出现的问题: 不管是&#xff1a;conda install pytorch torchvision torchaudio cudatoolkit11.3 -c pytorch 还是:pip ****什么的 问题描述&#xff1a;EnvironmentNotWritableError: The current user does not have write p…

手动在Ubuntu22.04上部署LAMP环境

简介 LAMP环境是常用的Web开发环境之一&#xff0c;其中LAMP分别代表Linux、Apache、MySQL和PHP。本文介绍如何在Ubuntu操作系统的ECS实例内部署LAMP环境。 准备工作 该实例必须满足以下条件&#xff1a; 实例已分配公网IP地址或绑定弹性公网IP&#xff08;EIP&#xff09;。…

【Java】java实现文件上传和下载(上传到指定路径/数据库/minio)

目录 上传到指定路径 一、代码层级结构 二、文件上传接口 三、使用postman进行测试&#xff1b; MultipartFile接收前端传递的文件&#xff1a;127.0.0.1:8082/path/uploadFile part接收前端传递的文件&#xff1a;127.0.0.1:8082/path/uploadFileByRequest 接收前端传递…

【存储芯片】CS创世 SD NAND:可以机贴的存储芯片

什么是CS创世 SD NAND呢&#xff1f;很多的朋友一直想知道这个问题。今天精心准备了SD NAND 的一个介绍。其实很多工程师朋友对CS创世 SD NAND有很多称呼。比如&#xff1a;贴片式T卡、贴片式TF卡、贴片式SD卡、可焊接的T卡&#xff0c;可焊接的SD卡&#xff0c;可贴片的TF卡&a…

TikTok引流中海外云手机的实用功能分享

在当下&#xff0c;TikTok已成为全球范围内最受欢迎的社交媒体平台之一&#xff0c;拥有着庞大的用户群体和潜在的商业机会。为了在TikTok上实现更好的引流效果&#xff0c;利用海外云手机成为了一个明智的选择。接下来&#xff0c;我们将深入探讨海外云手机的功能以及它如何助…

LLM优化:开源星火13B显卡及内存占用优化

1. 背景 本qiang~这两天接了一个任务&#xff0c;部署几个开源的模型&#xff0c;并且将本地经过全量微调的模型与开源模型做一个效果对比。 部署的开源模型包括&#xff1a;星火13B&#xff0c;Baichuan2-13B, ChatGLM6B等 其他两个模型基于transformers架构封装&#xff0…

创建基于时间的 UUID

概述 在本文中&#xff0c;我们将会 对 UUIDs 和基于时间的 UUIDs&#xff08;time-based UUIDs&#xff09; 进行一些探讨。 当我们在对基于时间的 UUIDs 进行选择的时候&#xff0c;总会遇到一些好的方面和不好的方面&#xff0c;如何进行选择&#xff0c;也是我们将要简要…

代码+视频,R语言绘制生存分析模型的时间依赖(相关)性roc曲线和时间依赖(相关)性cindex曲线

ROC曲线分析是用于评估一个因素预测能力的手段&#xff0c;是可以用于连续型变量分组的方法。在生存分析中&#xff0c;疾病状态和因素取值均会随时间发生变化。而标准的ROC曲线分析将个体的疾病状态和因素取值视作固定值&#xff0c;未将时间因素考虑在分析之中。在这种情况下…

一加Ace3/12/Ace2pro手机ColorOS14刷KernelSU内核ROOT-解决无限重启变砖

一加Ace3/一加12/一加11等手机升级了安卓14底层&#xff0c;并且ColorOS版本也更新到了14版本界面和功能都比之前的系统表现更加优秀&#xff0c;但刷机方面&#xff0c;相对之前存在一些差异&#xff0c;特别是KernelSU内核级别root权限&#xff0c;不再支持一键刷入KernelSU通…

【Linux网络】SSH--远程控制与访问

目录 一、SSH远程管理 1.SSH的定义 2.远程传输的种类 3.OpensSSH 4.SSH客户端与服务端 二、配置OpenSSH服务器 1.sshd_config配置文件的常用选项设置 2.sshd 服务支持两种验证方式 1&#xff09;密码验证 2&#xff09;密钥对验证 三、使用 SSH 客户端程序 1.ssh 远…