当前位置: 首页 > news >正文

学习RT-thread(线程、线程调度方式、线程状态)

1. RT-Threaad线程

在日常生活中,我们要完成一个大任务,一般会将它分解成多个简单、容易解决的小问题,小问题逐个 被解决,大问题也就随之解决了。

例如让嵌入式系统执行这样的任务,系统通过传感器采集数据,并通过显示屏将数据显示出来,在多线 程实时系统中,可以将这个任务分解成两个子任务,如下图所示,一个子任务不间断地读取传感器数 据,并将数据写到共享内存中,另外一个子任务周期性的从共享内存中读取数据,并将传感器数据输出 到显示屏上。

在 RT-Thread 中,与上述子任务对应的程序实体就是线程,它是 RT-Thread 中最基本的调度单位,它描 述了一个任务执行的运行环境,也描述了这个任务所处的优先等级,重要的任务可设置相对较高的优先级,非重要的任务可以设置较低的优先级,不同的任务还可以设置相同的优先级,轮流运行。

1.1 线程启动

rt_err_t rt_thread_startup(rt_thread_t thread);

1.2 线程创建和删除线程

1.2.1 创建/删除函数

创建线程函数:
rt_err_t rt_thread_init(struct rt_thread* thread,const char* name,void (*entry)(void* parameter), void* parameter,void* stack_start, rt_uint32_t stack_size,rt_uint8_t priority, rt_uint32_t tick);

删除线程函数
rt_err_t rt_thread_detach (rt_thread_t thread);

2. 线程调度方式

2.1 抢占调度

RT-Thread 的线程调度器是抢占式的,主要的工作就是从就绪线程列表中查找最高优先级线程,保证最 高优先级的线程能够被运行,最高优先级的任务一旦就绪,总能得到CPU的使用权。

总结:

1. 高优先级线程一旦就绪,总能得到CPU的使用权

2. 高优先级线程不阻塞,低优先级线程将无法获得执行权

3. 被抢占的线程将进入就绪态

2.2 时间片轮转

每个线程都有时间片这个参数,但时间片仅对优先级相同的就绪态线程有效。系统对优先级相同的就绪 态线程采用时间片轮转的调度方式进行调度时,时间片起到约束线程单次运行时长的作用,其单位是一 个系统节拍(OS Tick)

假设有 2 个优先级相同的就绪态线程 A 与 B,A 线程的时间片设置为 10,B 线程的时间片设置为 5,那 么当系统中不存在比 A 优先级高的就绪态线程时,系统会在 A、B 线程间来回切换执行,并且每次对 A 线程执行 10 个节拍的时长,对 B 线程执行 5 个节拍的时长,如下图

总结:

1. 同等优先级线程,轮流执行,时间片流转

2. 一个时间片的大小,取决于系统时钟的周期

3. 当前任务的时间片没有使用完,将不会再使用

3. 线程状态

RT-Thread的线程5种状态:

初始状态:线程刚创建所处的状态。

就绪状态:处于就绪状态的线程是指以满足条件运行的线程(没有被阻塞和挂起的任务),但是当 前没有运行的线程,因为同等优先级线程或更高优先级线程正在运行

挂起状态:处于挂起状态的线程是指当前任务因延时,或等待信号量,消息队列,邮箱,互斥量, 事件集等而处于的状态。

运行状态:当前线程处于运行状态,即获得CPU的使用权的线程。

关闭状态:线程被删除后所处状态。

4.线程实操

实验要求:

分别通过创建两个个线程:

线程1:线程间隔50个tick,输出一条打印;

线程2:线程间隔200个tick,输出一条打印;线程创建1000个tick之后,删除线程。

代码实现:

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <rtthread.h>
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
struct rt_thread thread_handle1;struct rt_thread thread_handle2;char thread_stack1[256];char thread_stack2[256];/* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);void thread_test1(void* parameter)
{while(1){rt_kprintf("rice1\r\n");rt_thread_delay(50);}
}void thread_test2(void* parameter)
{while(1){rt_kprintf("rice2\r\n");rt_thread_delay(200);}
}
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */rt_thread_init(&thread_handle1,"thread1",thread_test1,NULL,thread_stack1,256,10, 10);rt_thread_init(&thread_handle2,"thread2",thread_test2,NULL,thread_stack2,256,10, 10);rt_thread_startup(&thread_handle1);rt_thread_startup(&thread_handle2);rt_thread_delay(1000);rt_thread_detach(&thread_handle2);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE */rt_thread_delay(100);/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

实验现象:

1.在串口终端观察打印现象

http://www.dtcms.com/a/562221.html

相关文章:

  • asp.net网站第一次运行慢成长厉程网站
  • 网站如何做攻击防护做啥英文网站赚钱
  • 云南省建设厅网站职称评审wordpress 代码行号
  • 频繁从一个网站链接到另一个网站会影响百度收录么简单的网站开发软件
  • Kubernetes 核心资源:Service 与 Pod 解析
  • 福安市网站建设广告发布平台
  • 关于Dynamics 365多选选项集在使用Contains-value时失效问题的分析与解决
  • 可以免费创建网站的软件数字化文化馆网站建设
  • 【C语言】选择结构和循环结构的进阶
  • 珠海网站建设制作青岛做网站的公司有哪些
  • 免费制作app的手机软件东莞seo建站广告费
  • ssm框架之Spring(上)
  • 【星闪】Hi2821 | USB HID设备类 + HID键盘例程
  • o2o网站建站wordpress json接口
  • 成都自助建站模板网站建设评审表
  • 边界扫描测试原理 15 -- BSDL 9 应用示例
  • 唐山专业网站建设公司阿里云虚拟主机和云服务器的区别
  • 济南旅游网站建设前程无忧网深圳网站建设类岗位
  • 查企业资质上什么网站东华软件是外包公司吗
  • 整体设计 全面梳理复盘 之15 :整体设计属性体系构建与实体表格落地
  • 自建服务器做网站要备案英文企业网站源码
  • 广州 营销型网站图书宣传推广方案
  • 网站设计教学网页站点设计
  • 东莞在哪里学网站建设嘉兴网站制作计划
  • 计算机图形学·4 OpenGL编程1 背景知识
  • 做外贸的有些什么网站wordpress编辑器不行
  • 各大网站logo图标wap站开发
  • 山西 网站制作旅游网站开发说明
  • springboot基于java的少数民族音乐网站的设计与实现(代码+数据库+LW)
  • 强化学习2.4 MDP作业汇总(持续更新)