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

线程概述:

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

相关推荐
程序猿编码10 小时前
给你的网络流量穿件“隐形衣“:手把手教你用对称加密打造透明安全隧道
linux·开发语言·网络·安全·linux内核
aq553560010 小时前
编程语言三巨头:汇编、C++与PHP大比拼
java·开发语言
aq553560011 小时前
PHP vs Python:30秒看懂核心区别
开发语言·python·php
我是无敌小恐龙11 小时前
Java SE 零基础入门Day01 超详细笔记(开发前言+环境搭建+基础语法)
java·开发语言·人工智能·opencv·spring·机器学习
深圳市九鼎创展科技11 小时前
MT8883 vs RK3588 开发板全面对比:选型与场景落地指南
大数据·linux·人工智能·嵌入式硬件·ubuntu
码云数智-大飞11 小时前
零基础微信小程序制作平台哪个好
开发语言
神仙别闹11 小时前
基于 MATLAB 实现的 DCT 域的信息隐藏
开发语言·matlab
techdashen12 小时前
Go 标准库 JSON 包迎来重大升级:encoding/json/v2 实验版来了
开发语言·golang·json
.千余12 小时前
【Linux】基本指令3
linux·服务器·开发语言·学习
南境十里·墨染春水12 小时前
C++ 笔记 thread
java·开发语言·c++·笔记·学习