💌 所属专栏:【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()
函数,它需要线程入口函数、参数、优先级等信息。线程创建通常涉及以下步骤:
- 定义线程的属性,如优先级、栈大小和入口函数。
- 调用创建函数,如
FreeRTOS
的xTaskCreate()
,传入定义好的参数。
/**
* @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项目构建过程】
- 🔐 【大数据学习笔记(华为云)】
- 🚀 【软件安装教程】
订阅更多,你们将会看到更多的优质内容!!