【BES2500x系列 -- RTX5操作系统】深入探索CMSIS-RTOS RTX -- 任务管理篇 -- 线程管理 --(二)

news2024/11/18 17:52:45

请添加图片描述

  • 💌 所属专栏:【BES2500x系列】

  • 😀 作  者:我是夜阑的狗🐶

  • 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询!

  • 💖 欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信 😘 😘 😘

您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!🤩 🤩 🤩

请添加图片描述

文章目录

  • 前言
  • 1 介绍
  • 2 功能特性
  • 3 任务管理
      • 3.1 线程管理
        • 3.1.1 定义
        • 3.1.2 线程钩子函数
        • 3.1.3 创建
  • 总结


前言

  大家好,又见面了,我是夜阑的狗🐶,本文是专栏【BES2500x系列】专栏的第2篇文章;
  今天开始学习BES2500x系列的一天💖💖💖,开启新的征程,记录最美好的时刻🎉,每天进步一点点。
  专栏地址:【BES2500x系列】, 此专栏是我是夜阑的狗对BES2500x系列开发过程的总结,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。
  如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。


<<【系列文章索引】>>

1 介绍

  在实际工作中,针对于 BES 系统的文档少之又少。有时候在没有文档的辅助下光看代码,发现理解效率会慢很多,所以针对于这种情况,本人在学习的过程中会把一些讲解过程记录下来,以便自己后续再来复盘。说实话自己有时候看着看着看懂了,但事后没有记上笔记的话,估计过了几个星期就只剩下模糊的概念了。没办法,本人脑子记忆力没办法,只能通过不断记录自己的所学所见,然后在不断复盘精进自己。话不多说,那接下来学习 RTX 中的线程是怎么创建和使用的吧,让我们原文再续,书接上回吧。

请添加图片描述

2 功能特性

  在实时操作系统(RTOS)中,任务管理和同步通信是关键组件,它们确保系统的高效和有序执行。本文将探讨这些概念,特别是线程管理、信号量、互斥锁、消息队列和邮箱处理。

  • 任务管理RTX 提供任务创建、调度和优先级管理,确保任务按照优先级及时执行。
  • 同步与通信:包括信号量、互斥锁、消息队列和邮箱,促进任务间的同步和数据交换。
  • 内存管理:内存池和动态内存分配,有效管理有限的系统资源。
  • 定时器服务:虚拟和硬件定时器,支持周期性任务和一次性事件触发。
  • 中断处理:保证中断服务的快速响应,同时保持任务的上下文安全。
  • 线程安全:通过内核级保护机制,防止多线程环境下的数据竞争和死锁。

3 任务管理

  RTX 提供任务创建、调度和优先级管理,确保任务按照优先级及时执行。任务(线程)管理是 RTOS 的核心组成部分,它负责调度和控制系统的各个并发执行的任务。

3.1 线程管理

  线程是操作系统调度的基本单元,一个进程可以包含一个或多个线程。线程允许并发执行,提高了系统的资源利用率和响应速度。

3.1.1 定义

  线程是操作系统中的执行实体,每个线程都有自己的程序计数器、寄存器和栈。在一个进程中,多个线程可以并发执行,共享进程的资源,提高系统效率。
  一般在文件开头会看到这样的定义:osThreadDef。注意:定义的时候可以配置线程的优先级,具体的个数(可以类比结构体数组进行理解),线程堆栈大小等,这里只是一个参考,具体的参数根据实际的需求设定。

/**
 * 定义一个操作系统的线程。
 * 
 * 该函数定义了一个名为app_thread的线程,设置了它的优先级为osPriorityHigh(高优先级),
 * 使用的栈大小为APP_THREAD_STACK_SIZE,并且给线程起了一个名称"app_thread"。
 * 
 * @param app_thread 线程的函数入口点。
 * @param osPriorityHigh 线程的优先级,这里设置为高优先级。
 * @param 1 线程的优先级调整量,此处未使用。
 * @param APP_THREAD_STACK_SIZE 线程使用的栈的大小。
 * @param "app_thread" 线程的名称。
 */
osThreadDef(appTestThread1, (osPriorityAboveNormal), 1, (BESBT_STACK_SIZE), 
"appTestThread1"); 
/**
 * 声明一个线程的ID。
 * 
 * 该变量用于存储app_thread线程的ID,以便于后续对线程的管理和操作。
 */
osThreadId app_test1_tid = NULL; 

  app_test1_tid 用于存储 app_thread 线程的 ID,以便于后续对线程的管理和操作。

/*
 * 定义一个操作系统的线程定义。
 * 
 * 参数:
 * name: 线程名称的前缀。
 * priority: 线程的优先级。
 * instances: 线程实例的数量。如果为1,则创建一个静态实例;否则,创建动态实例。
 * stacksz: 线程栈的大小(字节)。如果为0,则分配最小栈大小。
 * task_name: FreeRTOS任务的名称。
 * 
 * 返回值:无。
 * 
 * 说明:此宏用于预先定义线程的栈、控制块和FreeRTOS线程定义结构体。
 */
#define osThreadDef(name, priority, instances, stacksz, task_name) \
static uint64_t os_thread_stack##name[(stacksz > 0)?(((stacksz+7)/8)):1]; /* 线程栈数组 */ \
static StaticTask_t os_thread_cb_##name; /* 静态任务控制块 */ \
const osThreadDef_t os_thread_def_##name = /* 线程定义结构体 */ \
{ (name), \
  { task_name, osThreadDetached, \
    (instances == 1) ? (&os_thread_cb_##name) : NULL,\
    (instances == 1) ? sizeof(StaticTask_t) : 0U, \
    ((stacksz > 0) && (instances == 1)) ? (&os_thread_stack##name) : NULL, \
    8*((stacksz+7)/8), /* 线程栈大小,以字节为单位 */ \
    (priority), 0U, 0U } }

  此宏用于预先定义线程的栈、控制块和 FreeRTOS 线程定义结构体。

3.1.2 线程钩子函数

  线程钩子函数是在特定事件(如线程创建、结束或挂起)发生时被调用的用户自定义函数。它们允许开发者在这些关键点插入自定义行为。线程钩子函数(也称为回调函数)是在线程生命周期的关键时刻被调用的函数。例如,vApplicationStackOverflowHook()FreeRTOS 中的一种线程钩子,当检测到堆栈溢出时会被调用,以执行错误处理或调试操作。

/**
 * @brief 应用测试线程1的实现函数。
 * 
 * 该线程循环执行,主要功能包括输出日志信息和处理消息队列及邮件。
 * 
 * @param argument 线程启动参数,在本实现中未使用。
 */
static void appTestThread1(void const *argument) 
{
    while(1) { // 无限循环以保持线程持续运行

        // 输出线程运行标识到日志,级别为1
        TRACE(1, "appTestThread1\n");

        // 从app_test1_queue_id关联的消息队列中阻塞等待并获取一条消息
        // osWaitForever表示如果没有消息则永远等待
        osMessageGet(app_test1_queue_id, osWaitForever);

        // 轮询检查并处理与app_test1相关的邮件
        app_test1_mail_poll();
    }
}

  其中,osWaitForever 表示如果没有消息则永远等待。该线程循环执行,主要功能包括输出日志信息和处理消息队列及邮件。

3.1.3 创建

  线程的创建通常通过调用 RTOS 提供的 API 完成,例如 FreeRTOS 中的 xTaskCreate() 函数,它需要线程入口函数、参数、优先级等信息。线程创建通常涉及以下步骤:

  • 定义线程的属性,如优先级、栈大小和入口函数。
  • 调用创建函数,如 FreeRTOSxTaskCreate() ,传入定义好的参数。
/**
 * @brief 初始化应用测试线程1。
 * 
 * @description 该函数负责创建并启动appTestThread1线程,同时将线程初始化的信息输出到日志。
 */
void app_test1_thread_init(void) 
{
    // 创建appTestThread1线程,不传递任何参数给线程函数
    // 并将新线程的ID赋值给app_test1_tid
    app_test1_tid = osThreadCreate(osThread(appTestThread1), NULL);

    // 输出线程初始化完成的信息到日志,包括线程ID,日志级别为1
    TRACE(1, "appTestThread1Init: %p\n", app_test1_tid);
}

  所以,先定义一个线程,通过 osThreadDef 设置线程名、优先级、堆栈大小,之后通过 osThread 获取配置的结构体变量的指针,并将其作为形参传入 osThreadCreate() 函数中,osThreadCreate 函数会将新创建的线程加入到在运行的线程列表中,并将其状态修改为 ready

<<【系列文章索引】>>

请添加图片描述


总结

  感谢观看,这里就是 深入探索CMSIS-RTOS RTX – 任务管理篇 – 线程管理 的讲解,如果觉得有帮助,请给文章点个赞吧,让更多的人看到。🌹 🌹 🌹

在这里插入图片描述

  也欢迎你,关注我。👍 👍 👍

  原创不易,还希望各位大佬支持一下,你们的点赞、收藏和留言对我真的很重要!!!💕 💕 💕 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!下期再见。🎉

更多专栏订阅:

  • 😀 【LeetCode题解(持续更新中)】
  • 🥇 【恒玄BES】
  • 🌼 【Git 学习笔记】
  • 💎 【微信小程序开发教程】
  • 🎃 【JavaScript随手笔记】
  • 👑 【Python脚本笔记】
  • 🚝 【鸿蒙系统】
  • 💛 【蓝牙协议栈】
  • 【死机分析】
  • 🤩 【程序错误解决方法(建议收藏)】
  • 🦄 【Java Web项目构建过程】
  • 🔐 【大数据学习笔记(华为云)】
  • 🚀 【软件安装教程】



订阅更多,你们将会看到更多的优质内容!!

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

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

相关文章

SSM图书馆管理系统-计算机毕业设计源码07925

摘 要 “鸟欲高飞先振翅&#xff0c;人求上进先读书”&#xff0c;可见读书对我们的重要性&#xff0c;在这个高速发展的社会&#xff0c;人们也越来越意识到读书的重要性&#xff0c;人们需要汲取各个领域的知识&#xff0c;不断的拓展自己的知识水平&#xff0c;图书馆作为一…

华为---OSPF的DR与BDR(六)

9.6 OSPF的DR与BDR 9.6.1 原理概述 在OSPF的广播类型网络和NBMA类型网络中&#xff0c;如果网络中有n台路由器&#xff0c;若任意两台路由器之间都要建立邻接关系&#xff0c;则需要建立n(n-1)/2个邻接关系&#xff0c;即当路由器很多时&#xff0c;则需要建立和维护的邻接关…

MTK7628+MT7612 加PA定频数据

1、硬件型号TR726A5G121-DPA PC9.02.0017。如下所示&#xff1a; 2、WIFI5.8 AC模式 42&#xff08;5120MHz&#xff09;信道&#xff0c;80带宽 3、WIFI5.8 AC模式 38&#xff08;5190MHz&#xff09;信道&#xff0c;40带宽 4、WIFI5.8 AC模式 36&#xff08;5180 MHz&…

【Linux】进程间通信上 (1.5万字详解)

目录 一.进程间通信介绍 1.1进程间通信的目的 1.2初步认识进程间通信 1.3进程间通信的种类 二.匿名管道 2.1何为管道 2.1实现原理 2.3进一步探寻匿名管道 2.4编码实现匿名管道通信 2.5管道读写特点 2.6基于管道的进程池设计 三.命名管道 3.1实现原理 3.2代码实现 四.…

asp.net core反向代理

新建项目 新建空白的asp.net core web项目 安装Yarp.ReverseProxy包版本为2.2.0-preview.1.24266.1 编写代码 namespace YarpStu01;public class Program {public static void Main(string[] args){var builder WebApplication.CreateBuilder(args);builder.Services.AddRev…

再添国家级认证!亚信安全获国家信息安全服务(数据安全类)一级资质

近日&#xff0c;亚信安全荣获由中国信息安全测评中心颁发的《国家信息安全测评信息安全服务资质证书—数据安全类一级》资质。凭借在数据安全领域的专业地位和技术水平&#xff0c;亚信安全成为为数不多的获得国家信息安全服务资质数据安全类一级的网络安全企业&#xff01; 中…

如何用家政服务小程序源码系统 快速搭建家政自己接单的软件?

随着移动互联网的快速发展&#xff0c;线上预约服务已成为家政行业的新趋势。然而&#xff0c;许多家政企业面临着信息不透明、服务质量参差不齐、管理效率低下等问题。家政服务小程序系统&#xff0c;可以帮助商家快速搭建自己的接单软件&#xff0c;提升服务效率&#xff0c;…

网安大咖说·镜鉴(下)| 把握安全新脉搏:企业CSO的领航之道

网安大咖说镜鉴栏目通过对网安大咖说嘉宾访谈内容的深度提炼&#xff0c;撷取群英论道之精髓&#xff0c;汇聚众智谋策之高远&#xff0c;为从业者提供宝贵的经验和启迪。集思广益、博采众长&#xff0c;意在以镜为鉴&#xff0c;观网安之百态&#xff0c;立防范之策略&#xf…

AI界又放大招?长文本新霸主“橙篇”来了

哈喽&#xff0c;大家好&#xff0c;木易巷来啦&#xff01; 在自媒体的江湖里&#xff0c;每个创作者都是一位独行侠&#xff0c;手握键盘&#xff0c;心怀天下。而我&#xff0c;也不例外&#xff0c;有点空闲时间就去寻找那个能让我笑傲江湖的AI神兵&#xff0c;让我可以摆…

DEtection TRansformer (DETR)与YOLO在目标检测方面的比较

1. 概述 计算机视觉中的目标检测是一个复杂而有趣的领域&#xff0c;它涉及到让计算机能够识别图像中的物体&#xff0c;并确定它们的位置。下面是DETR和YOLO这两种目标检测方法简单比较&#xff1a; 1.1 YOLO YOLO是一种非常流行的目标检测算法&#xff0c;它的核心思想是将…

ROS话题通信流程自定义数据格式

ROS话题通信流程自定义数据格式 需求流程实现步骤定义msg文件编辑配置文件编译 在 ROS 通信协议中&#xff0c;数据载体是一个较为重要组成部分&#xff0c;ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是&#xff0c;这些…

【源码】 最新麻豆MDYS14源码 油条视频 苹果CMS系统 附搭建教程thinkphp

最新麻豆MDYS14源码 油条视频 苹果CMS系统 附搭建教程 简介&#xff1a; 最新麻豆MDYS14源码 油条视频 苹果CMS系统 附搭建教程 基本介绍&#xff1a; 1. 后台增加自定义参数&#xff0c;对应会员升级页面&#xff0c;以及积分充值 2. 视频&#xff0c;演员&#xff0c;专题…

[分布式网络通讯框架]----Zookeeper客户端基本操作----ls、get、create、set、delete

Zookeeper数据结构 zk客户端常用命令 进入客户端 在bin目录下输入./zkCli.sh 查看根目录下数据ls / 注意:要查看哪一个节点&#xff0c;必须把路径写全 查看节点数据信息 get /第一行代码数据&#xff0c;没有的话表示没有数据 创建节点create /sl 20 /sl为节点的路径&am…

vscode在windows系统上进行C/C++环境配置

随手笔记前言 vscode在windows系统上进行C/C环境配置 步骤如下 第一步 下载安装VSCode 这应该是最简单的一步&#xff0c;相信大家自己就可以完成。如果在vscode官网感觉下载特别慢的话&#xff0c;可以去试一下腾讯软件中心&#xff0c;我都是在这个网页上下载的。下载好之…

【数据库】六、事务与并发控制(封锁)

六、事务与并发控制 文章目录 六、事务与并发控制1.事务1.1事务的ACID特性1.2MySQL事务控制语句开启事务提交事务回滚事务 2.并发控制2.1并发执行可能引起的问题2.1.1丢失更新2.1.2不可重复读2.1.3读脏数据 2.2并发调度的可串行性2.3并发与并行的区分2.4事务的隔离级别 3.封锁3…

Hadoop 2.0 大家族(四)

目录 七、Flume&#xff08;一&#xff09;Flume简介&#xff08;二&#xff09;Flume入门 八、Mahout&#xff08;一&#xff09;Mahout简介&#xff08;二&#xff09;Mahout入门 七、Flume Flume是一个分布式高性能、高可靠的数据传输工具&#xff0c;它可用简单的方式将不同…

【unity小技巧】unity事件系统创建通用的对象交互的功能

文章目录 前言实现1. **InteractEvent 类**&#xff1a;2. **Interact 类**&#xff1a;3. **Player 类**&#xff1a;4. **Chest 类**&#xff1a; 工作流程说明&#xff1a;开单个箱子按钮触发打开很多箱子拾取物品&#xff08;传参&#xff09;参考完结 前言 游戏开发过程中…

系统编程:线程相关

线程 相关函数及过程: 创建线程号; pthread_t tid; 创建线程:pthread_create(&tid, NULL, task, argv[1]); 定义线程执行函数:void *task(void *arg){ 线程退出:pthread_exit(ret);//线程结束后退出 } 等待所有线程结束:pthread_join(tid, (void **)&ret); 编译时增加…

系统思考—结构影响行为

思‮问考‬题时&#xff0c;从“结构”的‮度角‬出发&#xff0c;能‮示揭‬许多不‮人为‬知的‮层深‬次真相。我‮常们‬认为“努‮必力‬有回报”&#xff0c;从‮误而‬信‮过通‬坚‮就持‬能‮抗抵‬诱惑。然而&#xff0c;如‮深果‬入理解“结‮影构‬响行为”&#…

力扣-两数之和

文章目录 题目题解方法1-暴力方法2-哈希 题目 原题链接&#xff1a;两数之和 题解 方法1-暴力 我最先想到的方法就是暴力&#xff0c;两层for循环&#xff0c;也能通过。&#xff08;拿到算法题在没有思路的时候暴力就是思路&#xff0c;哈哈哈&#xff09; public class T…