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

线程概述:

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下面文件。

相关推荐
阿kun要赚马内2 小时前
Python面向对象:@property装饰器
开发语言·前端·python
sunwenjian8862 小时前
Java进阶--IO流
java·开发语言
wildlily84272 小时前
C++ Primer 第5版章节题 第十三章(二)
开发语言·c++
意法半导体STM322 小时前
【官方原创】STM32H7双核芯片通过 STlink连接失败问题分析 LAT1654
开发语言·前端·javascript·stm32·单片机·嵌入式硬件
深蓝海拓2 小时前
使用@property将类方法包装为属性
开发语言·python
夜星辰20232 小时前
MobaXterm会话窗口详解
嵌入式硬件·ssh·调试串口
xiaoye-duck3 小时前
【C++:unordered_set和unordered_map】 深度解析:使用、差异、性能与场景选择
开发语言·c++·stl
zjjsctcdl3 小时前
java与mysql连接 使用mysql-connector-java连接msql
java·开发语言·mysql
格林威3 小时前
Baumer相机锂电池极片裁切毛刺检测:防止内部短路的 5 个核心方法,附 OpenCV+Halcon 实战代码!
开发语言·人工智能·数码相机·opencv·计算机视觉·c#·视觉检测