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

ops/2024/11/13 21:33:35/

时间片任务调度

    • 时间片任务调度

时间片任务调度

概念:时间片调度主要针对优先级相同的任务,当多个任务的优先级相同时,任务调度器会在每一次系统时钟节拍到的时候切换任务,也就是说 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.ppmy.cn/ops/132958.html

相关文章

Day42 | 动态规划 :选或不选 打家劫舍打家劫舍II

Day42 | 动态规划 :选或不选 打家劫舍&&打家劫舍II 动态规划应该如何学习?-CSDN博客 动态规划学习: 1.思考回溯法(深度优先遍历)怎么写 注意要画树形结构图 2.转成记忆化搜索 看哪些地方是重复计算的&am…

【Linux 28】应用层协议 - HTTPS

文章目录 🌈 一、HTTPS 相关概念⭐ 1. 什么是 HTTPS⭐ 2. 加密 & 解密 & 密钥⭐ 3. 常见的加密方式⭐ 4. 数据摘要 & 数据指纹⭐ 5. 初识数字签名 🌈 二、HTTPS 的加密方案探究⭐ 1. 方案一:只使用对称加密⭐ 2. 方案二&#xff…

【MATLAB源码-第210期】基于matlab的OFDM电力线系统仿真,不同梳状导频间隔对比。三种信道估计,三种插值误码率对比

操作环境: MATLAB 2022a 1、算法描述 OFDM电力线通信系统(PLC)是一种通过电力线传输数据的通信技术,利用了OFDM(Orthogonal Frequency Division Multiplexing,正交频分复用)技术的优势来提高…

网络基础(2)

声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址:黑客网络基础之超文本协议与内外网划分_哔哩哔哩_bilibili 本文主要介绍内网和外网的划分。 一、内网(局域网) 定义 内网…

半导体制造技术导论(第二版)萧宏 第三章半导体基础答案

本章要求 1. 从元素周期表上,至少可以认出两种半导体材料 硅Si,锗Ge 2. 列出n型和p型掺杂杂质 B硼,引入空穴,p型掺杂杂质 P磷、As砷,引入电子,n型掺杂杂质。 3. 说明一个二极管和一个MOS晶体管…

现场工程师日记-MSYS2迅速部署PostgreSQL主从备份数据库

文章目录 一、概要二、整体架构流程1. 安装 MSYS2 环境2. 安装postgresql 三、技术名词解释1.MSYS22.postgresql 四、技术细节1. 创建主数据库2.添加从数据库复制权限3. 按需修改参数(1)WAL保留空间(2)监听地址 4. 启动主服务器5.…

Flutter鸿蒙next 状态管理框架对比分析

在 Flutter 开发中,状态管理是一个非常重要且关键的主题。Flutter 中的应用状态管理直接影响着应用的性能、可维护性和开发效率。随着 Flutter 生态的成熟,已经出现了许多不同的状态管理方案,各具特色,适用于不同的开发场景。本文…

链表(Linkedlist)

序言 我们都了解链表是一种数据的存储结构,在Java使用中逻辑与c,c语言数据结构别无二致,但主要由于Java中不存在指针的说法,从而导致在实现过程中的代码不同,所以在学习的过程中我们无需过于担心,逻辑都是…