【复习笔记】FreeRTOS(五)时间片调度

本文是FreeRTOS复习笔记的第五节,时间片调度。

上一篇文章: 【复习笔记】reeRTOS(四) 列表项的插入和删除

文章目录

  • 1.时间片调度简介
    • 1.1. 运行过程
  • 二、实验设计
  • 三、测试例程
  • 四、实验效果


1.时间片调度简介

FreeRTOS支持多个任务同时拥有一个优先级,这些任务的调度就可以使用时间片来进行调度。在FreeRTOS中允许一个任务允许一个时间片(一个时钟节拍的长度)后让出CPU的使用权,让拥有同优先级的下个任务运行。
同等优先级任务轮流地享有相同的 CPU 时间(可设置), 叫时间片。在FreeRTOS中,一个时间片就等于SysTick 中断周期,这个SysTick中断周期可以自己设置。在SysTick中断服务函数中,一个时间片就是1ms。
在这里插入图片描述

1.1. 运行过程

1、首先Task1运行完一个时间片后,切换至Task2运行,不管Task1是否运行完成,只运行一个时间片(默认1ms)Task1
2、Task2运行完一个时间片后,切换至Task3运行
3、Task3运行过程中(还不到一个时间片),Task3阻塞了(系统延时或等待信号量等,下次轮到Task3时还是只允许一个时间片,上次阻塞剩余的时间片,不会再被补回来),此时直接切换到下一个任务Task1
4、Task1运行完一个时间片后,切换至Task2运行

二、实验设计

实验目的:学会对FreeRTOS 时间片调度使用
实验设计:设计两个任务: task1 task 和 task2 task ,其中 task1 task 和 task2 task的任务优先级相同,都为 2,这两个任务的任务功能如下:

  • task1 task :控制 LED灯闪烁,并且通过串口打印 taskl task 的运行次数
  • task2 task :通过串口打印 task2 task 的运行次数

三、测试例程

主函数 main.c代码如下:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"

//在FreeRTOSConfig.h 把configTICK_RATE_HZ改成20,也就是每50ms切换一次任务
void task1_task(void *p); //任务函数
void task2_task(void *p); //任务函数

int main(void)
{ 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
	delay_init(168);		//初始化延时函数
	uart_init(115200);     	//初始化串口
	LED_Init();		        //初始化LED端口

   
    xTaskCreate(task1_task,"task1_task",128,NULL,2,NULL); //任务1        
    xTaskCreate(task2_task,"task2_task",128,NULL,2,NULL);  //任务2 
				
    vTaskStartScheduler();          //开启任务调度
}
 

//任务1函数 
void task1_task(void *p)
{
	u8 task1_num=0;
	while(1)
	{
		task1_num++;					//任务1执行次数加1 注意task1_num1加到255的时候会清零!!
		LED0=!LED0;
		taskENTER_CRITICAL();           //进入临界区,如果不加临界区,任务执行一半就会跳出
		printf("任务1已经执行:%d次\r\n",task1_num);
		taskEXIT_CRITICAL();            //退出临界区
		delay_xms(10);					//延时10ms,模拟任务运行10ms,此函数不会引起任务调度
	}
}   

//任务2函数 
void task2_task(void *p)
{
	u8 task2_num=0;
	while(1)
	{
		task2_num++;					//任务2执行次数加1 注意task2_num1加到255的时候会清零!!
		taskENTER_CRITICAL();           //进入临界区
		printf("任务2已经执行:%d次\r\n",task2_num);
		taskEXIT_CRITICAL();            //退出临界区
		delay_xms(10);					//延时10ms,模拟任务运行10ms,此函数不会引起任务调度
	}
}

在任务程序的printf函数前后分别添加临界区进入和退出目的是:防止prinf打印到一半字符,就被暂停,切换到了另一个任务。临界区包护可以让prinf执行完再切换任务。

此外,还要在在FreeRTOSConfig.h 把configTICK_RATE_HZ把原来的1000改成20,也就是每50ms切换一次任务。

#define configTICK_RATE_HZ	(20) //时钟节拍频率,这里设置为20,周期就是50ms

调用函数 delay_xms()延时 10ms。在一个时间片内如果任务不主动放弃 CPU 使用权的话那么就会一直运行这一个任务,直到时间片耗尽。在 task1_task 任务中我们通过串口打印字符串的方式提示 task1_task 在运行,但是这个过程对于 CPU 来说执行速度很快,不利于观察,所以这里通过调用函数 delay_xms()来默认任务占用 10ms 的 CPU。函数 delay_xms()不会引起务调度,这样的话相当于 task1 task 的执行周期>10s,基本可以看作等于 10ms,因为其他的函数执行速度还是很快的。一个时间片的长度是50ms,任务执行所需的时间以 10ms 算,理论上在一个时间片内 task1_task 可以执行 5 次,但是事实上很少能执行 5 次,基本上是4次。

四、实验效果

实验效果如下:
在这里插入图片描述
接上串口,会打印任务1和任务2的运行次数。
我们设置任务运行周期是50ms,然后每个任务里面有10ms的延时,由于单片机执行printf打印函数时间会长一些,任务1里还有LED控制的函数,所以,每次执行本任务最多只能打印5次数据。有时执行了4次printf,还没来得及执行第5次,但50ms时间到了就会强制切换到了另一个任务。

本节主要是学习和掌握任务创建以及 vTaskDelete() 任务删除函数的使用。
完整程序放在gitee仓库上:程序下载。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

春藤实业启动SAP S/4HANA Cloud Public Edition项目,与工博科技携手数字化转型之路

3月11日,广东省春藤实业有限公司(以下简称“春藤实业”)SAP S/4HANA Cloud Public Edition(以下简称“SAP ERP公有云”)项目正式启动。春藤实业董事长陈董、联络协调项目经理慕总、内部推行项目经理陈总以及工博董事长…

数仓建模—数据架构

数仓—数据架构 为了在企业决策中使用数据,数据必须经过整个数据平台的各个阶段。整个过程是什么样子的,从开始到结束?原始形式的数据是如何转化为可导致商业决策的见解的?这些问题可以通过数据架构来回答。 数据架构是指记录组织所有数据资产的模型、规则和标准。它映射…

Web前端-JavaScript

黑马程序员JavaWeb开发教程 文章目录 一、js引入方式1、内部脚本2、外部脚本 二、js基础语法1、书写语法(1)基本语法(2)输出语句 2、变量(1)变量(2)注意事项 3、数据类型、运算符、流…

spring-数据处理及跳转

结果跳转方式 ModelAndView 设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 . 页面 : {视图解析器前缀} viewName {视图解析器后缀} <!-- 视图解析器 --> <bean class"org.springframework.web.servlet.view.InternalResourceViewRes…

Java定时任务

一、java.util.Timer java.util.Timer 类允许您在未来的某个时间执行一个任务&#xff0c;或者在一定的时间间隔执行任务。您可以创建一个 Timer 实例&#xff0c;并调用其 schedule() 方法来安排任务的执行。这种方式比较简单&#xff0c;但在高并发环境下可能不够灵活。 1.…

Git学习与码云实战

Git学习与码云实战 Git安装 概述&#xff1a; Git 是一个开源的分布式版本控制系统&#xff0c;可以有效、高速的处理从很小到非常大的项目版本管理&#xff0c;是目前使用范围最广的版本管理工具。 下载安装&#xff1a; 下载地址&#xff1a;https://git-scm.com/ 下载后傻瓜…

李彦宏:开源模型会越来越落后

李彦宏&#xff1a;开源模型会越来越落后 昨天听完的李总讲座 大家以前用开源觉得开源便宜&#xff0c;其实在大模型场景下&#xff0c;开源是最贵的。所以&#xff0c;开源模型会越来越落后。 ——李彦宏 至于开源还是闭源&#xff0c;这和企业的利益息息相关。 随着科技的迅猛…

双向链表详解

一.双向链表结构 我们一般所说的双向链表是带头循环双向链表&#xff0c;这里的带头更我们之前的头节点不是一回事。带头链表里的头节点&#xff0c;实际上为哨兵位&#xff0c;哨兵位的头节点种是不存放任何有效数据的&#xff0c;只是站在这里起到放哨的作用。 哨兵位的意义…

【C++从练气到飞升】08---模板

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 一、泛型编程 什么是泛型编程: 二、函数模板 1. 函数模板概念 2. 函数模板格式 3. 函数模板的原理 4. 函数模板的实例…

Nginx part2.2

目录 如何用Nginx搭建多网址服务器&#xff1f; 基于ip地址的虚拟主机 1. 先建立存储网页的目录 2.进行子配置 3.编写.conf文件 基于端口号的虚拟主机 基于域名的虚拟主机 如何用Nginx搭建多网址服务器&#xff1f; 有些网站&#xff0c;ip不同&#xff0c;域名不同&…

格林兰岛和南极洲的流域边界文件下载

&#xff08;1&#xff09;南极流域系统边界和掩蔽区 下图显示了由戈达德冰面高程小组使用ICESat数据开发的南极分水岭。我们对西南极冰盖&#xff08;系统18-23和1&#xff09;、东南极冰盖&#xff08;系统2-17&#xff09;和南极半岛&#xff08;系统24-27&#xff09;的定…

案例与脚本实践:DolphinDB 轻量级实时数仓的构建与应用

DolphinDB 高性能分布式时序数据库&#xff0c;具有分布式计算、事务支持、多模存储、以及流批一体等能力&#xff0c;非常适合作为一款理想的轻量级大数据平台&#xff0c;轻松搭建一站式的高性能实时数据仓库。 本教程将以案例与脚本的方式&#xff0c;介绍如何通过 Dolphin…

LevelDB源码阅读笔记(1、整体架构)

LevelDB源码阅读笔记&#xff08;1、整体架构&#xff09; LeveDB源码笔记系列&#xff1a; LevelDB源码阅读笔记&#xff08;0、下载编译leveldb&#xff09; LevelDB源码阅读笔记&#xff08;1、整体架构&#xff09; 前言 对LevelDB源码的博客&#xff0c;我准备采用总…

ragflow知识库使用案例

参考: https://github.com/infiniflow/ragflow/blob/main/README_zh.md 支持丰富的文件类型,包括 Word 文档、PPT、excel 表格、txt 文件、图片、PDF、影印件、复印件、结构化数据, 网页等。 运行步骤: 1、确保 vm.max_map_count 不小于 262144 【更多】: 如需确认 vm.…

【大数据】分布式文件系统HDFS

目录 1.什么是分布式文件系统 2.HDFS的特点 3.HDFS的核心概念 4.HDFS的体系结构 5.HDFS的配置建议 6.HDFS的局限性 7.HDFS的存储机制 7.1.数据冗余机制 7.2.错误与恢复 8.HDFS数据读写过程 1.什么是分布式文件系统 分布式文件系统是整个大数据技术的基础&#xff0c…

单位个人信息宣传这样投稿审核轻松出稿快

在我担任单位信息宣传员的初期阶段,每月的对外信息宣传任务就像一座大山横亘在前,尤其是与媒体对接、投稿发表的工作,更是充满了挑战与艰辛。那段时光,我如同一个摸索前行的独行者,在浩瀚的媒体海洋中“摸着石头过河”。 我曾经花费大量的时间逐一查找各类媒体联系方式,通过电话…

短视频去水印解析接口 可测试

短视频解析聚合接口80多个热们短视频平台。可测试 接口开发文档&#xff1a; 返回格式&#xff1a; JSON 请求方式&#xff1a; GET/POST 示例请求地址&#xff1a;https://www.dspqsy.vip/spapi?keykey&url短视频url 请求参数说明&#xff1a; 字段必填类型说明url是…

良友:献上今天(打开心窗说亮话)- 情绪的秘密

目录 一 二 三 四 五 六 七 八 九 十 十一 十二 十三

C/C++中程序内存区域划分

总结C/C中程序内存区域划分 C/C程序内存分配的几个区域&#xff1a; 1. 栈区&#xff08;stack&#xff09;&#xff1a;在执⾏函数时&#xff0c;函数内局部变量的存储单元都可以在栈上创建&#xff0c;函数执⾏结束时 这些存储单元⾃动被释放。栈内存分配运算内置于处理器的…

【Vue3】StoresTorefs:简化状态管理的实用工具

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…
最新文章