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

请添加图片描述

  • 💌 所属专栏:【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项目构建过程】
  • 🔐 【大数据学习笔记(华为云)】
  • 🚀 【软件安装教程】



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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为HCIA综合实验(结合前几期所有内容)

第一章 实验目的 &#xff08;1&#xff09;配置Telnet&#xff0c;要求所有网络设备支持远程管理&#xff0c;密码为admin&#xff08;2&#xff09;配置Trunk&#xff0c;交换机之间的链路均为Trunk模式&#xff08;3&#xff09;配置VLAN&#xff0c;在SW2和SW3上创建相关…

QT实现人脸识别

QT实现人脸识别 Face.pro文件&#xff1a; QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # d…

力扣141A

文章目录 1. 题目链接2. 题目代码3. 题目总结4. 代码分析 1. 题目链接 Amusing Joke 2. 题目代码 #include<iostream> #include<string> using namespace std;int letterOfInt[30]; int letterAtDoorOfInt[30];int main(){string guestName;string hostName;strin…

Redis-在springboot环境下执行lua脚本

文章目录 1、什么lua2、创建SpringBoot工程3、引入相关依赖4、创建LUA脚本5、创建配置类6、创建启动类7、创建测试类 1、什么lua “Lua”的英文全称是“Lightweight Userdata Abstraction Layer”&#xff0c;意思是“轻量级用户数据抽象层”。 2、创建SpringBoot工程 3、引入相…

OpenCompass:大模型测评工具

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径&#xff1a;AI代理工作流大模型应用开发实用开源项目汇总大模…

FW Activity跳转动画源码解析(一)

文章目录 跳转动画实际操作的是什么?窗口怎么知道应该执行什么动画,是透明,还是平移,还是缩放,旋转? 跳转动画实际操作的是什么? startActivity调用之后进行页面跳转,会有一系列的涉及到ActivitStar,ActivityTask,ActivityManager等类的操作,最终在执行动画会调用到Surface…

数字化营销与传统营销的完美协奏曲!

在这个数字化的时代&#xff0c;营销的世界正在发生着巨大的变革&#xff01;数字化营销如火箭般崛起&#xff0c;但传统营销也并未过时。那么&#xff0c;如何让它们携手共进&#xff0c;创造出无与伦比的营销效果呢&#xff1f;今天&#xff0c;就让我们讲述一下蚓链数字化营…

已经被驳回的商标名称还可以申请不!

看到有网友在问&#xff0c;已经驳回的商标名称还可以申请不&#xff0c;普推商标知产老杨觉得要分析看情况&#xff0c;可以适当分析下看可不可以能申请&#xff0c;当然最终还是为了下证 &#xff0c;下证概率低的不建议申请。 先看驳回理由&#xff0c;如果商标驳回是绝对理…

【U8+】修改客户端自动清退时间

【需求描述】 用友U8软件中&#xff0c; 客户端自动清退时间目前最少只能设置为20分钟无操作自动清退&#xff0c; 不能再比20分钟少&#xff0c;例如10分钟无操作自动清退。 【解决方法】 打开注册表&#xff0c;找到下述路径&#xff0c; 【计算机\HKEY_LOCAL_MACHINE\SOFT…

漂亮!身体恢复正常水准!一个家庭幸不幸福,看能量流动的方向——早读(逆天打工人爬取热门微信文章解读)

美洲杯这个时间也太绝了&#xff0c;早上9点比赛&#xff0c;乌拉圭VS巴拿马 引言Python 代码第一篇 洞见 一个家庭幸不幸福&#xff0c;看能量流动的方向第二篇结尾 引言 今天起床 有种神奇的感觉 就是精神很不错 明明昨天晚上还是12点多才睡觉 早上6点20有意识 在头脑里面演…

【SpringMVC】第8-14章

第8章 文件上传与下载 8.1 文件上传 使用SpringMVC6版本&#xff0c;不需要添加以下依赖&#xff0c;Spring5以及之前版本需要&#xff1a; <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId>&…

成都城市低空载人交通完成首航,沃飞助力航线运行实践!

6月20日&#xff0c;成都市低空交通管理服务平台开启首次实战检验&#xff0c;并进行了城市低空载人出行验证飞行。沃飞长空作为成都本地低空出行企业代表和执飞单位&#xff0c;与政府各部门通力合作&#xff0c;圆满完成了此次飞行任务。 上午9:30&#xff0c;随着塔台发出指…

确保群发短信发送成功的有效方法

群发短信是众多商家和企业宣传和推广的常用手段。然而&#xff0c;市场上短信群发服务参差不齐&#xff0c;存在“不实发”或“扣量”的情况&#xff0c;这让客户对短信的到达率产生了担忧。那么&#xff0c;我们该如何确保群发的短信已经成功发送呢&#xff1f; 首先&#xff…

十大排序算法之->计数排序

一、计数排序简介 计数排序是一种非比较排序算法&#xff0c;适用于整数数组&#xff0c;时间复杂度为O(nk)&#xff0c;其中n为待排序数组的长度&#xff0c;k为待排序数组中最大值与最小值之差。 计算排序的原理是通过计算每个元素的出现次数或位置&#xff0c;而不是通过比…

上榜 Gartner丨中国领先数据基础设施代表厂商 DolphinDB

近日&#xff0c;Gartner 发布了 Innovation Insight: Data Infrastructure Evolves as the Foundation of D&A Ecosystem in China 这一深度研究报告&#xff0c;分析了当前企业使用数据基础设施的现状以及未来发展趋势。DolphinDB 凭借协同生态建设、云边一体架构和 AI 应…

C++的智能指针 RAII

目录 产生原因 RAII思想 C11的智能指针 智能指针的拷贝与赋值 shared_ptr的拷贝构造 shared_ptr的赋值重置 shared_ptr的其它成员函数 weak_ptr 定制删除器 简单实现 产生原因 产生原因&#xff1a;抛异常等原因导致的内存泄漏 int div() {int a, b;cin >> a…

@ControllerAdvice:你可以没用过,但是不能不了解

1.概述 最近在梳理Spring MVC相关扩展点时发现了ControllerAdvice这个注解&#xff0c;用于定义全局的异常处理、数据绑定、数据预处理等功能。通过使用 ControllerAdvice&#xff0c;可以将一些与控制器相关的通用逻辑提取到单独的类中进行集中管理&#xff0c;从而减少代码重…

前端开发接单公司做到哪些点,客户才愿意把项目包给你。

作为前端外包接单公司&#xff0c;你知道客户选择和你合作都看中哪些因素吗&#xff1f;单纯是价格吗&#xff1f;未必&#xff0c;本位给大家列举7个要素&#xff0c;并对每个要素做了定位&#xff0c;大家查缺补漏吧。 作为前端外包接单公司&#xff0c;要吸引同行客户将前端…

优秀的“抗霾”神器:气膜体育馆—轻空间

随着空气污染问题日益严重&#xff0c;尤其是雾霾天气频发&#xff0c;体育运动的场地环境质量受到越来越多的关注。气膜体育馆作为一种新型的体育场馆解决方案&#xff0c;以其独特的设计和多重优势&#xff0c;成为了优秀的“抗霾”神器。轻空间将深入探讨气膜体育馆的特点和…

pycharm不能安装包的解决方法

一直使用VScode写python&#xff0c;最近使用pycharm&#xff0c;但是pycharm不能安装包&#xff0c;类似这种 后面直接使用ALT F12跳转终端&#xff1a; pip install 需要添加的包 -i https://pypi.tuna.tsinghua.edu.cn/simple不报错了