STM32任务调度

news2024/11/26 19:29:28

目录

什么是任务调度?

FreeRTOS的任务调度规则是怎样的?

抢占式调度运行过程

时间片调度运行过程

任务的状态

任务综合小实验

实验需求

cubeMX配置


什么是任务调度?

调度器就是使用相关的调度算法来决定当前需要执行的哪个任务。
FreeRTOS 中开启任务调度的函数是 vTaskStartScheduler() ,但在 CubeMX 中被封装为
osKernelStart()

FreeRTOS的任务调度规则是怎样的?

FreeRTOS 是一个实时操作系统,它所奉行的调度规则:
1. 高优先级抢占低优先级任务,系统永远执行最高优先级的任务(即 抢占式调度
2. 同等优先级的任务轮转调度(即 时间片调度
还有一种调度规则是协程式调度,但官方已明确表示不更新,主要是用在小容量的芯片上,用得
也不多。

抢占式调度运行过程

Task 1 :玩游戏
Task 2 :老妈喊你吃饭
Task 3 :女朋友喊你看电视
总结:
1. 高优先级任务,优先执行;
2. 高优先级任务不停止,低优先级任务无法执行;
3. 被抢占的任务将会进入就绪态

时间片调度运行过程

总结:
1. 同等优先级任务,轮流执行,时间片流转;
2. 一个时间片大小,取决为滴答定时器中断周期;
3. 注意没有用完的时间片不会再使用,下次任务 Task3 得到执行,还是按照一个时间片的时钟
节拍运行

任务的状态

FreeRTOS 中任务共存在 4 种状态:
  • Running 运行态
当任务处于实际运行状态称之为运行态,即 CPU 的使用权被这个任务占用(同一时间仅一个任务
处于运行态)。
  • Ready 就绪态
处于就绪态的任务是指那些能够运行(没有被阻塞和挂起),但是当前没有运行的任务,因为同
优先级或更高优先级的任务正在运行。
  • Blocked 阻塞态
如果一个任务因延时,或等待信号量、消息队列、事件标志组等而处于的状态被称之为阻塞态。
  • Suspended 挂起态
类似暂停,通过调用函数 vTaskSuspend() 对指定任务进行挂起,挂起后这个任务将不被执行,
只有调用函数 xTaskResume() 才可以将这个任务从挂起态恢复。

 

总结:
1. 仅就绪态可转变成运行态
2. 其他状态的任务想运行,必须先转变成就绪态

任务综合小实验

实验需求

创建 4 个任务: taskLED1 taskLED2 taskKEY1 taskKEY2 ,任务要求如下:
taskLED1 :间隔 500ms 闪烁 LED1
taskLED2 :间隔 1000ms 闪烁 LED2
taskKEY1 :如果 taskLED1 存在,则按下 KEY1 后删除 taskLED1 ,否则创建 taskLED1
taskKEY2 :如果 taskLED2 正常运行,则按下 KEY2 后挂起 taskLED2 ,否则恢复 taskLED2

cubeMX配置

freertos.c 

void StartTskLED1(void const * argument)
{
  /* USER CODE BEGIN StartTskLED1 */
  /* Infinite loop */
  for(;;)
  {
		HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
    osDelay(500);
  }
  /* USER CODE END StartTskLED1 */
}

/* USER CODE BEGIN Header_StartTskLED2 */
/**
* @brief Function implementing the TskLED2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTskLED2 */
void StartTskLED2(void const * argument)
{
  /* USER CODE BEGIN StartTskLED2 */
  /* Infinite loop */
  for(;;)
  {
		HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
    osDelay(1000);
  }
  /* USER CODE END StartTskLED2 */
}

/* USER CODE BEGIN Header_StartTaskKey1 */
/**
* @brief Function implementing the TaskKey1 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTaskKey1 */
void StartTaskKey1(void const * argument)
{
  /* USER CODE BEGIN StartTaskKey1 */
  /* Infinite loop */
  for(;;)
  {
		if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET){
			osDelay(20);
			if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET){
				
				printf("KEY1键被按下\r\n");
				if(TskLED1Handle==NULL){
					printf("任务一不存在,准备创建\r\n");
					osThreadDef(TskLED1, StartTskLED1, osPriorityNormal, 0, 128);
					TskLED1Handle = osThreadCreate(osThread(TskLED1), NULL);
					if(TskLED1Handle!=NULL){
						printf("任务一创建成功\r\n");
					}
				}else{
					printf("任务一删除成功\r\n");
					osThreadTerminate(TskLED1Handle);
					TskLED1Handle = NULL;
				}
				
			}
			while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET);
		}	
		
    osDelay(10);
  }
  /* USER CODE END StartTaskKey1 */
}

/* USER CODE BEGIN Header_StartTaskKey2 */
/**
* @brief Function implementing the TaskKey2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTaskKey2 */
void StartTaskKey2(void const * argument)
{
  /* USER CODE BEGIN StartTaskKey2 */
	static int flag = 0;
  /* Infinite loop */
  for(;;)
  {
		if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==GPIO_PIN_RESET){
			osDelay(20);
			if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==GPIO_PIN_RESET){
				
				printf("KEY2键被按下\r\n");
				if(flag==0){
					
					osThreadSuspend(TskLED2Handle);
					printf("任务2已暂停\r\n");
					flag = 1;
				}else{
					osThreadResume(TskLED2Handle);
					printf("任务2已恢复\r\n");
					flag = 0;
				}
				
			}
			while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==GPIO_PIN_RESET);
		}	
		
    osDelay(10);
  }
  /* USER CODE END StartTaskKey2 */
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/627367.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编程新手如何提高编程能力?

如果刚开始写代码时能读一读《整洁代码的艺术》那是个不错的选择。这本书会告诉您, 如何应用九大原则来提高编程能力。 良好的编程技能带来更整洁的代码, 让您更专注、更有效地利用时间,得到更高质量的结果。只要应用本书中提到的那些原则&am…

springboot集成rabbitmq

简介 RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 RabbitMQ 主要是为了实现系统之间的双向解耦而实…

【LeetCode】HOT 100(4)

题单介绍: 精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

容器(第三篇)docker-cgroup资源限制

Docker 通过 Cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面, 基本覆盖了常见的资源配额和使用量控制。 Cgroup 是 ControlGroups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 CPU、内存、…

一路狂飙,性能测试流程与性能测试主要指标整理,直接上高速...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 性能测试实战 性…

什么是真正的需求,如何才能找到?

此为内容创作模板,在发布之前请将不必要的内容删除 对需求本身的误判,比错误本身更为恐怖,直接导致必然失败的局面。 工作失误必不可免,好工作核心在于有需求,自己需要去做,有动力,别人需要你…

【Cloudgetway网关】 GetWay网关入门使用

一、概述 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ow0KO8iV-1686286922163)(null)] GateWay是zuul的替代品,由于Zuul2.0迟迟没有出来,SpringCloud社区推出了gateWay网关来替代zuul1.x版本。提供了以下功能: 底层使用n…

使用 LabVIEW调用LeNet快速搭建手写数字识别系统(内含源码)

‍‍🏡博客主页: virobotics的CSDN博客:LabVIEW深度学习、人工智能博主 🎄所属专栏:『LabVIEW深度学习实战』 🍻上期文章: 【图像分类】基于OpenVINO实现PyTorch ResNet50图像分类 &#x1f4f0…

PyCaret解决二分类任务教程示例

PyCaret是一个Python中的开源、低代码机器学习库,可以自动化机器学习工作流。它是一个端到端的机器学习和模型管理工具,可以成倍地加快实验周期,提高工作效率。 与其他开源机器学习库相比,PyCaret是一个替代的低代码库&#xff0c…

多分类问题与卷积模型的优化

文章目录 1. 创建自定义Dataset类2. 基础卷积模型3. Dropout抑制过拟合4. 批标准化5. 学习速率衰减6. 最终优化整合代码 首先导入用到的库: import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim import numpy as np import matp…

文章写作的诀窍:10个技巧让你的文章升华

首先要找到自己的写作声音和确定文章的中心思想,其次要使用简单明了和描述性的语言,增加细节并结构化文章: 找到你的写作声音:找到适合自己的写作风格和声音,这有助于让读者更容易地理解和记住你的文章。确定文章的中心…

QxRibbon 知:搭建 CMake 构建环境

文章目录 前言安装 cmake问题处理qtcreator 检测 CMake 异常 参考资料 前言 高版本的 QtCreator 已经集成了 cmake 工具,并支持以 CMakelists.txt 文件作为工程开发项目。 https://www.qt.io/blog/2019/07/30/update-on-cmake-project-support-in-qt-creator 安装…

NodeLocal DNS介绍及部署应用

目录 一、NodeLocal DNS是什么? 二、为什么使用NodeLocal DNS? 三、工作原理 四、安装NodeLocal DNS 五、在应用中使用NodeLocal DNSCache 六、验证 一、NodeLocal DNS是什么? NodeLocal DNSCache 通过在集群节点上运行一个 DaemonSet …

qrcodejs2生成二维码,通过canvas绘制带边框+中间logo的二维码图片,下载二维码

文章目录 一、通过qrcodejs2生成一个二维码二、点击【下载配置服务器二维码】来下载二维码1、通过canvas去绘制 边框二维码logo(1)为canvas增加绘制圆角矩形的方法(canvas本身不提供)(2)通过canvas绘制 圆角…

饮酒过多和腌制食品是导致中风的最大导火索

中风是一种常见的疾病,它的发生和饮食习惯有很大关系。近年来,我国中风病患人数和病发率都呈现出了不同程度的上升趋势,这给我们的健康带来了很大的威胁。下面我们可以通过数据可视化大屏来了解一下饮食健康与预防中风有哪些影响,…

ESP32-S3 边缘人工智能|使用加速度计数据和 ESP-DL 识别人体活动

边缘计算是一种分布式计算范例,指在更靠近设备的地方进行数据存储和计算。边缘人工智能(边缘 AI)是边缘计算中一项振奋人心的成果,可以令传统技术更高效地运行,在降低功耗的同时又有更好的性能。训练好的神经网络可以在…

通信算法之167: (低空无人机)机载视频通信传输系统基带算法设计

一.物理层基带仿真 通信系统的链路级仿真主要可以分成5个部分。 1.系统参数 2.发送机算法 3.信道模型 4.接收机算法 5.统计性能 其中主要组成部分很明显是中间三部分,即发送,信道,接收。但系统参数和统计性能这两部分的适当设计会大大…

linux基础命令系列之10 分钟掌握 ln 命令:创建链接,软链接,硬链接,递归链接,打印详细输出

文章目录 前言一. ln命令介绍二. 语法格式及常用选项三. 参考案例3.1 ln命令创建硬链接3.1.1 创建硬链接3.1.2 源文件被删除,不影响链接文件的正常使用3.1.3 硬链接不能跨分区创建 3.2 为什么目录刚刚创建的时候,链接数为23.3 ln -s 软链接的创建3.3.1 l…

【漏洞修复】node-exporter被检测出来pprof调试信息泄露漏洞

node-exporter被检测出来pprof调试信息泄露漏洞 说在前面解决方法结语 说在前面 惯例开篇吐槽,有些二五仔习惯搞点自研的安全扫描工具,然后加点DIY元素,他也不管扫的准不准,就要给你报个高中危的漏洞,然后就要去修复&…

C++元模板技术与traits解析:根据类型的特性来调整代码的行为,解决没有重载运算符的情况

C元模板技术与traits解析 第一章、C元模板技术简介 (C Meta-template Introduction)1.1 元模板的定义与概念 (Definition and Concepts)1.2 元模板技术的发展历程 (Evolution of Meta-templates)1.3 元模板应用场景举例 (Examples of Meta-template Applications) 第二章、 tra…