FreeRTOS学习11——时间片任务调度

news2024/12/27 13:06:22

时间片任务调度

    • 时间片任务调度

时间片任务调度

概念:时间片调度主要针对优先级相同的任务,当多个任务的优先级相同时,任务调度器会在每一次系统时钟节拍到的时候切换任务,也就是说 CPU 轮流运行优先级相同的任务,每个任务运行的时间就是一个系统时钟节拍。

同等优先级任务轮流地享有相同的 CPU 时间(可设置), 叫时间片,在FreeRTOS中,一个时间片就等于SysTick 中断周期

特点:

  • 同等优先级任务,轮流执行;时间片流转
  • 一个时间片大小,取决为滴答定时器中断频率
  • 注意没有用完的时间片不会再使用,下个任务得到执行还是按照一个时间片的时钟节拍运行

下面我们举个例子详细说

image-20241111200848938

我们创建优先级相同的几个任务,其运行流程如下

  1. 首先Task1运行完一个时间片后,切换至Task2运行
  2. Task2运行完一个时间片后,切换至Task3运行
  3. Task3运行过程中(还不到一个时间片),Task3阻塞了(系统延时或等待信号量等),此时直接切换到下一个任务Task1
  4. Task1运行完一个时间片后,切换至Task2运行

接下来用一个实验来验证我们的理论

​ 实验设计:将设计三个任务:start_task、task1、task2,其中task1和task2优先级相同均为2。为了使现象明显,将滴答定时器的中断频率设置为50ms中断一次,即一个时间片50ms

​ 三个任务的功能如下:

  • start_task:用来创建其他的2个任务
  • task1:通过串口打印task1的运行次数
  • task2:通过串口打印task2的运行次数

注意:使用时间片调度需把宏 configUSE_TIME_SLICING 和configUSE_PREEMPTION 置1

在打印任务运行次数的时候需要使用到串口硬件,为了避免多个任务“同时”使用同一个硬件,因此在使用串口硬件打印任务运行次数之前,进入临界区,在使用串口硬件打印任务运行次数之后,再退出临界区

实验代码freertos_demo.c

#include "freertos_demo.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "delay.h"
/*FreeRTOS********************************************************************/
#include "FreeRTOS.h"
#include "task.h"
/*****************************************************************************/
/*FreeRTOS 配置*/
/* START_TASK 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务
*/
#define START_TASK_PRIO 1 							/* 任务优先级 */
#define START_STK_SIZE 128 							/* 任务堆栈大小 */
TaskHandle_t StartTask_Handler; 				/* 任务句柄 */
void start_task(void *pvParameters); 		/* 任务函数 */
/* TASK1 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK1_PRIO 2 										/* 任务优先级 */
#define TASK1_STK_SIZE 128 							/* 任务堆栈大小 */
TaskHandle_t Task1Task_Handler;			 		/* 任务句柄 */
void task1(void *pvParameters); 				/* 任务函数 */
/* TASK2 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK2_PRIO 2										/* 任务优先级 */
#define TASK2_STK_SIZE 128 							/* 任务堆栈大小 */
TaskHandle_t Task2Task_Handler;			 		/* 任务句柄 */
void task2(void *pvParameters); 				/* 任务函数 */



/*****************************************************************************/

/**
* @brief FreeRTOS 例程入口函数
* @param 无
* @retval 无
*/
void freertos_demo(void)
{
	 xTaskCreate((TaskFunction_t )start_task, 				/* 任务函数 */
							 (const char* )"start_task", 					/* 任务名称 */
							 (uint16_t )START_STK_SIZE, 					/* 任务堆栈大小 */
							 (void* )NULL, 												/* 传入给任务函数的参数 */
							 (UBaseType_t )START_TASK_PRIO,				/* 任务优先级 */
							 (TaskHandle_t* )&StartTask_Handler); /* 任务句柄 */
	 vTaskStartScheduler();                           /* 开启任务调度 */
}
/**
* @brief start_task
* @param pvParameters : 无
* @retval 无
*/
void start_task(void *pvParameters)
{
		 taskENTER_CRITICAL(); /* 进入临界区 在临界区内不进行任务调度,保证新创建的任务不会抢占start_task,也就是等所有任务创建完后再开始任务调度*/
		 /* 创建任务 1 */
		 xTaskCreate((TaskFunction_t )task1,
								 (const char* )"task1",
								 (uint16_t )TASK1_STK_SIZE,
								 (void* )NULL,
								 (UBaseType_t )TASK1_PRIO,
								 (TaskHandle_t* )&Task1Task_Handler);
								 /* 创建任务 2 */
		 xTaskCreate((TaskFunction_t )task2,
								 (const char* )"task1",
								 (uint16_t )TASK2_STK_SIZE,
								 (void* )NULL,
								 (UBaseType_t )TASK2_PRIO,
								 (TaskHandle_t* )&Task2Task_Handler);
			vTaskDelete(NULL);			/* 删除开始任务 */
		 taskEXIT_CRITICAL(); 	 /* 退出临界区 */
}
/**
* @brief task1
* @param pvParameters : 无
* @retval 无
*/
/* task1实现LED0每200ms闪烁一次*/
void task1(void *pvParameters)
{

	static uint16_t num;
	while(1)
	 {
		 taskENTER_CRITICAL();
		 num++;
		printf("任务1运行次数:%d\r\n",num);
		 taskEXIT_CRITICAL();
		 delay_ms(10);         
		}
}


/* task2 列表项的插入和删除*/
void task2(void *pvParameters)
{
	static uint16_t num;
	while(1)
	 {
		 taskENTER_CRITICAL();
		 num++;
			printf("任务2运行次数:%d\r\n",num);
		 taskEXIT_CRITICAL();
		 delay_ms(10);
	 }
}

实验现象
在这里插入图片描述
每个任务执行 四到五次
与理论相符

delay_ms(10);延时为 “死延时” 在延时时不会进行任务调度
vTaskDelay(1000);该函数在延时时会进行任务调度

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

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

相关文章

怎么把模糊照片变清晰?4种方法助你修复图片清晰度!

在我们的日常生活中,模糊的图片常常成为影响视觉体验的一大障碍,无论是由于时间久远导致老照片分辨率降低,还是拍摄时因手抖造成的画面模糊,都会让我们的图片质量大打折扣。为了帮助你解决这一困扰,我们为你整理了四种…

Pytorch学习--神经网络--完整的模型验证套路

一、选取的图片 全部代码依托于该博客 二、代码(调用训练好的模型) import torch import torchvision from PIL import Image from model import *img_path "dog.png" image Image.open(img_path)print(image.size)transform torchvisi…

力扣 LeetCode 454. 四数相加II(Day3:哈希表)

解题思路: 使用map 四个数组两两一组 前两个数组的各个值遍历相加,和为key,出现的次数为value 后两个数组的各个值遍历相加,如果该值的负数能在map中找到(表示能抵消为0,符合题意四数之和为0&#xff0…

期权懂|交易股票期权该怎么操作?又该如何开户?

期权小懂每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 交易股票期权该怎么操作?又该如何开户? 一、交易股票期权主要包括以下几个步骤: (1)选择交易平台‌: 选择…

Unity类银河战士恶魔城学习总结(P124 CharacterStats UI玩家的UI)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了玩家属性栏,仓库,物品栏UI的制作 UI_StatSlot.cs 这个脚本是用来在Unity的UI上显示玩家属性&#xf…

【SSL-RL】自监督强化学习:自预测表征 (SPR)算法

📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅…

Docker部署kafka集群

1,编写Docker Compose文件 编写一个docker-compose.yml文件来定义服务,以下定义了一个Zookeeper服务和三个Kafka Broker服务: 注意:把10.0.8.4替换成宿主IP version: 3.8services:zookeeper:image: bitnami/zookeeper:latestconta…

Qt滑动条美化自定义

效果展示 主要代码 头文件 下面是hi控件的头文件,我们继承一个Qt原生的滑动条类QSlider,然后在基类的基础上进行自定义,我会对重要的变量进行解析: class XSlider : public QSlider {Q_OBJECT public:explicit XSlider(QWidget…

wordpress实用功能A5资源网同款 隐藏下载框 支付框 需要登录才能查看隐藏的内容

实用功能 隐藏下载框 支付框 需要登录才能查看隐藏的内容, 个人网站防天朝申查实测有效 。 登录前,未登录: 登录后,已登录: 功能说明 该代码段的主要功能是隐藏支付框并为未 登录用户显示一条提示信息,告知他们需要…

Vue 简单入手

前端工程化(Front-end Engineering)指的是在前端开发中,通过一系列工具、流程和规范的整合,以提高开发效率、代码质量和可维护性的一种技术和实践方法。其核心目的是使得前端开发变得更高效、可扩展和可维护。 文章目录 一、Vue 项…

Spingboot 定时任务与拦截器(详细解释)

在 boot 环境中,一般来说,要实现定时任务,我们有两中方案,一种是使用 Spring 自带的定时 任务处理器 Scheduled 注解,另一种就是使用第三方框架 Quartz , Spring Boot 源自 SpringSpringMVC &#…

无人机+无人车+无人狗+无人船:互通互联技术探索详解

关于“无人机无人车机器狗(注:原文中的“无人狗”可能是一个笔误,因为在实际技术领域中,常用的是“机器狗”这一术语)无人船”的互通互联技术,以下是对其的详细探索与解析: 一、系统架构与关键…

ima.copilot-腾讯智能工作台

一、产品描述 ima.copilot是腾讯推出的基于腾讯混元大模型技术的智能工作台,通过先进的人工智能技术,为用户提供了一个全新的搜读写体验,让知识管理变得更加智能和高效。它不仅是一个工具,更是一个智能的伙伴,能够帮助…

集合卡尔曼滤波(EnsembleKalmanFilter)的MATLAB例程(三维、二维)

本 M A T L A B MATLAB MATLAB代码实现了一个三维动态系统的集合卡尔曼滤波(Ensemble Kalman Filter, EnKF)示例。代码的主要目的是通过模拟真实状态和测量值,使用 EnKF 方法对动态系统状态进行估计。 文章目录 参数设置初始化真实状态定义状…

【动手学电机驱动】STM32-FOC(5)基于 IHM03 的无感 FOC 控制

STM32-FOC(1)STM32 电机控制的软件开发环境 STM32-FOC(2)STM32 导入和创建项目 STM32-FOC(3)STM32 三路互补 PWM 输出 STM32-FOC(4)IHM03 电机控制套件介绍 STM32-FOC(5&…

光老化测试的三种试验:紫外老化、氙灯老化、碳弧灯老化

光老化是指材料在阳光照射下,由于紫外线、热和氧气的共同作用而发生的物理和化学变化。这种现象对纺织材料、塑料材料、涂料材料和橡胶材料的应用有显著影响。这些材料户外家具、汽车内饰和户外供水排水管道、建筑外墙涂料、汽车漆面、船舶涂料、汽车轮胎、密封件、…

VMWare安装包及安装过程

虚拟机基本使用 检查自己是否开启虚拟化 如果虚拟化没有开启,需要自行开启:百度加上自己电脑的品牌型号,进入BIOS界面开启 什么是虚拟机 所谓的虚拟机,就是在当前计算机系统中,又开启了一个虚拟系统 这个虚拟系统&…

消费的外部性

大学宿舍,遇到在你睡觉的时候开外放不戴耳机的室友,但中午12点,室友却在那拉上窗帘睡觉。能带饭吗?能代签到吗?能倒个垃圾吗?能带个外卖吗?自己永远麻烦别人,你要让他帮个忙又这推那…

易趋亮相2024 PMI项目管理大会

11月9日-10日,2024 PMI项目管理大会在广州圆满举办,项目管理行业优秀代表企业——易趋(隶属深圳市蓝云软件有限公司),携最新产品和解决方案亮相本次展会。 (主论坛现场) 本届大会以“‘项’有所成 行以致远…

边缘计算与推理算力:智能时代的加速引擎

在数据量爆炸性增长的今天,边缘计算与推理算力正成为推动智能应用的关键力量。智能家居、自动驾驶、工业4.0等领域正在逐步从传统的云端计算转向边缘计算,而推理算力的加入,为边缘计算提供了更强的数据处理能力和实时决策能力。本文将探讨边缘…