(实时操作系统)线程管理

线程概述:

RT线程就是许多小线程组合起来的混合线程;任何时刻就只有一个线程可以运行;线程分优先级;优先级高的线程可以抢占优先运行;数字越低,线程优先级越高;在相同优先级情况下采用时间片轮转方式运行;通俗来说就是依次运行;

线程状态:

线程创建后属于初始化状态,然后在启动线程函数下进入就绪状态;在就绪状态下根据不同的线程操作不同的系统操作接口进行状态的转换;目前只需了解即可;

实际操作:

在接下来我们先进行基于CUBEMX移植操作系统;

在官网有详细教程;这里就不详细介绍了;

当一切准备工作就位;我们来完成今日的实验要求;

在上节我们已经掌握静态线程和动态线程的创建以及各自需要和优缺;现在我们依然按照创建线程的步骤逐步实现功能;

1:线程的创建

1:设置动态线程句柄定义:表示该线程未被定义;

2:创建线程入口函数;

3:创建线程;

4:启动线程。

我们以按键扫描线程为例,按键扫描函数在裸机教学有详细教学;这里就不介绍了;

cs 复制代码
static rt_thread_t keyScan_thread = RT_NULL;  设置动态线程句柄


static void keyScan_thread_entry(void* parameter);  声明函数;



        keyScan_thread =
		 rt_thread_create( "keyScan",
		 keyScan_thread_entry,
		 RT_NULL,
		 256,
		 2,
		 20 );     创建线程
		 
		 rt_thread_startup(keyScan_thread)   启动线程



void keyScan_thread_entry(void* parameter)   线程函数创建:
{
	while(1)
	{
			switch(KEYState)
		{
			case KEY_UP:
			{
				if((B1==GPIO_PIN_RESET)||(B2==GPIO_PIN_RESET)||(B3==GPIO_PIN_RESET)||(B4==GPIO_PIN_RESET))
				{
					KEYState=KEY_DE;
				}
				break;
			}
			case KEY_DE:
			{
				      if(B1==GPIO_PIN_RESET||B2==GPIO_PIN_RESET||B3==GPIO_PIN_RESET||B4==GPIO_PIN_RESET)
				{
					KEYState=KEY_WAIT;
					if(B1==GPIO_PIN_RESET) KEY_Value=1;
					else if(B2==GPIO_PIN_RESET) KEY_Value=2;
					else if(B3==GPIO_PIN_RESET) KEY_Value=3;
					else if(B4==GPIO_PIN_RESET) KEY_Value=4;
				}
				else 
				{
					KEYState=KEY_UP;
				}
				break;
			}
			case KEY_WAIT:
			{
				    if(B1==GPIO_PIN_RESET||B2==GPIO_PIN_RESET||B3==GPIO_PIN_RESET||B4==GPIO_PIN_RESET)
				{
				
				}
				else
				{
					KEYState=KEY_UP;
					KeyFlag=1;
				}
				break;
			}
			default:break;
		}
		rt_thread_mdelay(10);
	}
}

2:功能函数的实现;需要按下按键实现不同功能;实现打印出文字;首先需要引入打印函数

rt_kprintf:

rt_kprintf函数功能
rt_kprintf是RT-Thread实时操作系统中提供的内核级打印函数,用于在嵌入式系统中输出调试或运行信息。其功能类似于标准C库的printf,但经过优化以适应资源受限的嵌入式环境,支持线程安全且不依赖外部库。
实现原理
轻量级设计:移除printf的浮点等复杂格式支持,减少内存占用。
线程安全:通过RT-Thread内核的互斥机制保护共享资源(如串口设备)。
设备抽象 :依赖RT-Thread的设备框架(如rt_device_write)输出到控制台、串口等。

3:实现功能;依然使用Proteus来模拟完成实验现象的观察:

实验总结:如果打印相关代码不移植也无法实现;

1:main函数添加头文件"rtthread"

2:串口通信波特率9600;

3:移植串口到board.c中;

4:在stm32生成代码先编译,才有board.c下面文件。

相关推荐
大草原的小灰灰24 分钟前
Python面向对象编程
开发语言·python
知识分享小能手25 分钟前
C学习教程,从入门到精通,C语言概述 —— 知识点详解(1)
c语言·开发语言·学习
东木月34 分钟前
Windows C 盘清理指南:安全删除临时文件、缓存与 Prefetch
c语言·windows·安全
Chen_harmony1 小时前
一、C++入门基础
开发语言·c++
学逆向的1 小时前
远程线程注入
开发语言·jvm·网络安全·win32
殷忆枫1 小时前
基于STM32的独居老人语音/一键双模紧急呼救系统设计与实现
stm32·嵌入式硬件·xcode
水饺编程1 小时前
第1章,[Win32 章节]:Windows 的方方面面
c语言·c++·windows·visual studio
袁章根1 小时前
基于瑞昱RTL8367S交换机电路设计(一)
网络·嵌入式硬件·硬件架构·硬件工程
阡陌数智1 小时前
RAG 系统的召回退化:向量库、分块、重排全链路问题排查与优化实践
开发语言·人工智能·语言模型·自然语言处理·推荐算法
我就是不信1 小时前
用 C 语言实现一个支持 HTML 与视频的 HTTP(S) 服务器
c语言·html·音视频