【复习笔记】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);//设置系统中断优先级分组4delay_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.mzph.cn/news/825152.shtml

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

相关文章

设计千万级并发系统架构需要考虑的各方面因素

设计千万级并发系统架构需要考虑多方面因素,包括系统的可伸缩性、高可用性、性能、安全性等。 1、分布式架构: 使用微服务架构:将系统拆分成多个独立的服务,每个服务都可以独立部署和扩展。 使用分布式服务框架:如S…

顺丰同城急送API的坑(附源码)

一、背景 最近公司让我对接顺丰同城急送的API,讲讲里面我遇到的坑 官方的API文档给我的感觉是不怎么规范的,很多细节要靠猜,示例代码也不全,具体细节不多说,如果你现在也需要对接他们API,可以参考本篇博客…

爬虫 | 基于 requests 实现加密 POST 请求发送与身份验证

Hi,大家好,我是半亩花海。本项目旨在实现一个简单的 Python 脚本,用于向指定的 URL 发送 POST 请求,并通过特定的加密算法生成请求头中的签名信息。这个脚本的背后是与某个特定的网络服务交互,发送特定格式的 JSON 数据…

LeetCode in Python 1338. Reduce Array Size to The Half (数组大小减半)

数组大小减半思路简单,主要是熟悉python中collections.Counter的用法,采用贪心策略即可。 示例: 图1 数组大小减半输入输出示例 代码: class Solution:def minSetSize(self, arr):count Counter(arr)n, ans 0, 0for i, valu…

北大字节联合发布视觉自动回归建模(VAR):通过下一代预测生成可扩展的图像

北大和字节发布一个新的图像生成框架VAR。首次使GPT风格的AR模型在图像生成上超越了Diffusion transformer。 同时展现出了与大语言模型观察到的类似Scaling laws的规律。在ImageNet 256x256基准上,VAR将FID从18.65大幅提升到1.80,IS从80.4提升到356.4,推理速度提高了20倍。 相…

关于Jetson空间不足的解决问题(sd卡挂载和conda更改环境安装路径)

文章目录 问题描述挂载sd卡到指定目录查看conda路径更改环境路径指定路径安装conda虚拟环境 问题描述 因为在做毕设的时候,用到了Jetson,发现这个空间太小了,如果下conda的包根本不够用,所以就想挂载sd卡,然后把环境安…

国外GIS软件排名简介<30个>

简介 国外gisgeography网站进行了一次GIS软件排名,通过分析、制图、编辑等因素进行测试,具体规则如下: 分析:矢量/栅格工具、时态、地统计、网络分析和脚本。 制图:地图类型、坐标系、地图布局/元素、标注/注记、3D …

C#到底属于编译型语言还是解释型语言?

C#是一种编译型语言,也称为静态类型语言,这意味着C#代码在运行之前需要经过编译器的编译处理,并生成一个可执行的本地代码文件(通常是.exe或.dll文件)。相反,解释型语言将代码转换为低级代码后直接执行&…

计算机视觉——手机目标检测数据集

这是一个手机目标检测的数据集,数据集的标注工具是labelimg,数据格式是voc格式,要训练yolo模型的话,可以使用脚本改成txt格式,数据集标注了手机,标签名:telephone,数据集总共有1960张,有一部分是…

软件无线电安全之GNU Radio基础 -上

GNU Radio介绍 GNU Radio是一款开源的软件工具集,专注于软件定义无线电(SDR)系统的设计和实现。该工具集支持多种SDR硬件平台,包括USRP、HackRF One和RTL-SDR等。用户可以通过GNU Radio Companion构建流程图,使用不同…

BackTrader 中文文档(二十七)

原文:www.backtrader.com/ 数据 - 多个时间框架 原文:www.backtrader.com/blog/posts/2015-08-24-data-multitimeframe/data-multitimeframe/ 有时,使用不同的时间框架进行投资决策: 周线用于评估趋势 每日执行进入 或者 5 分钟…

软考132-上午题-【软件工程】-沟通路径

一、定义 1-1、沟通路径1 沟通路径 1-2、沟通路径2 沟通路径 n-1 二、真题 真题1: 真题2: 真题3:

发布 Chrome/Edge浏览器extension扩展到应用商店

Chrom Extension发布流程 创建和发布自定义 Chrome 应用和扩展程序:https://support.google.com/chrome/a/answer/2714278?hlzh-Hans 在 Chrome 应用商店中发布:https://developer.chrome.com/docs/webstore/publish?hlzh-cn 注册开发者帐号&#…

图解CPU的实模式与保护模式

哈喽,大家好,我是呼噜噜,好久没有更新old linux了,在上一篇文章Linux0.12内核源码解读(7)-陷阱门初始化中,我们简要地提及了中断,但是中断机制在计算机世界里非常重要,处处都离不开中断&#xf…

Element——组件

element官网 https://element.eleme.cn/#/zh-CN/component/layout vscode格式化快捷键&#xff1a;shiftaltf table表格 <template><el-table:data"tableData"style"width: 100%"><el-table-columnprop"date"label"日期…

Git使用总结(不断更新中)

branch 本地分支操作 删除本地分支 git branch -d <local-branch-name>远端分支操作 从远端分支创建本地分支 git checkout -b <local-branch-name> origin/<remote-branch-name>git ignore 如果工程的代码文件中有不希望上传到远端的文件&#xff0c;…

排列特征重要性(Permutation Feature Importance)

5个条件判断一件事情是否发生&#xff0c;每个条件可能性只有2种&#xff08;发生或者不发生&#xff09;&#xff0c;计算每个条件对这件事情发生的影响力。排列特征重要性模型的程序。 例一 在机器学习领域&#xff0c;排列特征重要性&#xff08;Permutation Feature Impor…

【honggfuzz学习笔记】honggfuzz的基本特性

本文架构 1.动机2.honggfuzz的基本概念官网描述解读 3. honggfuzz的反馈驱动(Feedback-Driven)软件驱动反馈&#xff08;software-based coverage-guided fuzzing&#xff09;代码覆盖率代码覆盖率的计量单位 代码覆盖率的统计方式 硬件驱动反馈&#xff08; hardware-based co…

CTFHUB RCE作业

题目地址&#xff1a;CTFHub 完成情况如图&#xff1a; 知识点&#xff1a; preg_match_all 函数 正则匹配函数 int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags PREG_PATTERN_ORDER [, int $offset 0 ]]] )搜索 subject 中…

【Python小游戏】植物大战僵尸的实现与源码分享

文章目录 Python版植物大战僵尸环境要求方法源码分享初始化页面&#xff08;部分&#xff09;地图搭建&#xff08;部分&#xff09;定义植物类 &#xff08;部分&#xff09;定义僵尸类&#xff08;部分&#xff09;游戏运行入口 游戏源码获取 Python版植物大战僵尸 已有的植…