FreeRTOS入门教程(任务优先级,Tick)

news2024/11/25 11:23:52

文章目录

  • 前言
  • 一、什么是任务优先级
  • 二、FreeRTOS如何分辨出优先级最高可运行的任务
  • 三、FreeRTOS中的时钟节拍Tick
  • 四、什么是时间片
  • 五、相同优先级任务怎么进行切换
  • 六、任务优先级实验
  • 七、修改任务优先级
  • 总结


前言

本篇文章将带大家学习FreeRTOS中的任务优先级,并且了解什么是任务优先级,

一、什么是任务优先级

在FreeRTOS中,任务优先级用于确定任务的执行顺序和调度顺序。任务优先级越高,任务被调度执行的频率越高。FreeRTOS支持使用整数值来表示任务优先级,整数值越高,优先级越高。

FreeRTOS中任务优先级的范围通常是从0到configMAX_PRIORITIES-1,其中configMAX_PRIORITIES是一个配置常量,表示系统中支持的最大任务优先级数量。

在FreeRTOSconfig.h中可以查看到任务优先级的配置宏:
在这里插入图片描述

二、FreeRTOS如何分辨出优先级最高可运行的任务

1.通用方法:

使用C函数实现,对所有的架构都是同样的代码。对configMAX_PRIORITIES的取值没有限制。但
是configMAX_PRIORITIES的取值还是尽量小,因为取值越大越浪费内存,也浪费时间。
configUSE_PORT_OPTIMISED_TASK_SELECTION被定义为0、或者未定义时,使用此方法。

2.架构相关的优化的方法:

架构相关的汇编指令,可以从一个32位的数里快速地找出为1的最高位。使用这些指令,可以快速
找出优先级最高的、可以运行的任务。
使用这种方法时,configMAX_PRIORITIES的取值不能超过32。
configUSE_PORT_OPTIMISED_TASK_SELECTION被定义为1时,使用此方法

三、FreeRTOS中的时钟节拍Tick

FreeRTOS中的时钟节拍(Tick)是一个基本的时间单位,用于管理任务调度和时间相关功能。时钟节拍的概念在实时操作系统中非常重要,因为它提供了时间的基本度量单位,允许任务和定时器按照预定的时间间隔执行。

以下是有关FreeRTOS中时钟节拍的重要信息:

1.时钟节拍的单位:时钟节拍是一个抽象的时间单位,通常表示为一个整数值。它可以映射到实际时间,但时钟节拍的精度和长度是可配置的。在大多数情况下,时钟节拍是以毫秒为单位的,但它可以配置为更短或更长的时间间隔,具体取决于应用程序的需求。

2.时钟节拍计数器:FreeRTOS维护一个时钟节拍计数器,用于跟踪已经过去的时钟节拍数。这个计数器通常是一个32位的值,可以支持大范围的时间跟踪。

3.任务调度:任务的调度和切换通常发生在时钟节拍的倍数上。当时钟节拍计数器达到任务的时间间隔(通常称为任务的延迟或周期)时,任务可能会被置于就绪状态,以便在下一个任务切换点执行。

4.定时器:时钟节拍也用于定时器功能。通过设置定时器的周期为时钟节拍的倍数,可以实现定时任务和事件的触发。

5.配置和定制:FreeRTOS允许用户配置时钟节拍的频率和精度,以适应特定应用的需求。这可以通过修改FreeRTOS配置文件中的参数来完成。例如,可以配置时钟节拍为1毫秒,10毫秒,甚至更短的时间间隔,以满足实时性要求。

6.时钟节拍在FreeRTOS中扮演了关键的角色,它不仅用于任务调度,还用于实现定时等待、超时操作和时间相关的功能。

FreeRTOS中的Tick值通常被配置为1ms:

在这里插入图片描述

四、什么是时间片

时间片(Time slice)是操作系统调度算法中的概念,用于分配处理器时间给多个可运行的任务。它是指操作系统将处理器的执行时间划分为固定长度的小段,每个任务在一个时间片内获得处理器的执行时间。

五、相同优先级任务怎么进行切换

在FreeRTOS默认采用了时间片轮转调度的策略,给每一个任务都分配一个固定的时间片,这个时间片的大小也就是1ms,可以通过修改configTICK_RATE_HZ这个宏来修改时间片的大小。

时间片大小(毫秒) = 1秒 / configTICK_RATE_HZ

在这里插入图片描述

Task1执行完一个时间片后会发生一次tick中断,然后进入tick中断处理函数中,在tick中断中选择要执行的下一个中断,当执行完tick中断后就切换Task2执行。

六、任务优先级实验

// 任务句柄
TaskHandle_t Task1Handle;
TaskHandle_t Task2Handle;

// 任务函数
void Task1(void* pvParameters) {
  while (1) {
    vTaskDelay(1000);
    printf("Task1 is running\n");
  }
}

void Task2(void* pvParameters) {
  while (1) {
    vTaskDelay(1000);
    printf("Task2 is running\n");
  }
}

int main(void) {
  // 创建两个任务
  xTaskCreate(Task1, "Task1", configMINIMAL_STACK_SIZE, NULL, 1, &Task1Handle);
  xTaskCreate(Task2, "Task2", configMINIMAL_STACK_SIZE, NULL, 2, &Task2Handle);

  // 启动调度器
  vTaskStartScheduler();

  while (1) {
    // 主循环为空,所有的任务由 FreeRTOS 调度
  }
}

因为任务2的优先级比任务1的优先级高所以会先打印Task2 is running,然后再打印Task1 is running,以此往复。

七、修改任务优先级

uxTaskPriorityGet() 和 vTaskPrioritySet() 是FreeRTOS中用于获取和设置任务优先级的函数。

uxTaskPriorityGet() 函数用于获取任务的当前优先级。它接受一个参数,即任务句柄,返回一个 UBaseType_t 类型的值,表示任务的当前优先级。

vTaskPrioritySet() 函数用于设置任务的优先级。它接受两个参数,第一个参数是要设置优先级的任务句柄,第二个参数是要设置的优先级值。这个函数没有返回值。

以下是一个使用 uxTaskPriorityGet() 和 vTaskPrioritySet() 函数的示例代码:

TaskHandle_t Task1Handle;
TaskHandle_t Task2Handle;

void Task1(void* pvParameters) {
  while (1) {
    // 获取任务优先级
    UBaseType_t priority = uxTaskPriorityGet(NULL);
    printf("Task1 priority: %u\n", priority);

    vTaskDelay(pdMS_TO_TICKS(1000));
  }
}

void Task2(void* pvParameters) {
  while (1) {
    // 获取任务优先级
    UBaseType_t priority = uxTaskPriorityGet(NULL);
    printf("Task2 priority: %u\n", priority);

    // 设置任务优先级
    vTaskPrioritySet(Task1Handle, 2);

    vTaskDelay(pdMS_TO_TICKS(5000));

    // 恢复任务优先级
    vTaskPrioritySet(Task1Handle, 1);
  }
}

int main(void) {
  xTaskCreate(Task1, "Task1", configMINIMAL_STACK_SIZE, NULL, 1, &Task1Handle);
  xTaskCreate(Task2, "Task2", configMINIMAL_STACK_SIZE, NULL, 2, &Task2Handle);

  vTaskStartScheduler();

  while (1) {
    // 主循环为空,所有的任务由 FreeRTOS 调度
  }

在这个示例代码中,我们创建了两个任务 Task1 和 Task2,并使用 uxTaskPriorityGet() 和 vTaskPrioritySet() 进行任务优先级的获取和设置。

在 Task1 中,我们首先使用 uxTaskPriorityGet(NULL) 获取当前任务的优先级,并通过 printf 打印出来。然后使用 vTaskDelay() 延迟1秒钟。

在 Task2 中,我们首先获取当前任务的优先级,然后通过 vTaskPrioritySet(Task1Handle, 2) 将 Task1 的优先级设置为2。接着延迟5秒钟后,再通过 vTaskPrioritySet(Task1Handle, 1) 恢复 Task1 的优先级为1。

通过运行这个示例代码,将会看到在任务的执行过程中,任务的优先级获取和设置操作被执行,并通过打印语句输出任务的优先级信息。

注意,在使用 uxTaskPriorityGet() 和 vTaskPrioritySet() 函数时,需要确保任务句柄是正确的,并且函数的调用时机是合适的,以避免潜在的问题和不一致性。

总结

本篇文章就讲解到这里。

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

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

相关文章

FreeRTOS入门教程(任务状态)

文章目录 前言一、简单实验二、任务状态概念讲解三、vTaskDelay和vTaskDelayUntil1.vTaskDelay2.vTaskDelayUntil3.vTaskDelay和vTaskDelayUntil的区别 总结 前言 本篇文章将为大家讲解FreeRTOS中的任务状态,在FreeRTOS任务是有非常多种状态的,了解了任…

YOLOv7改进:GAMAttention注意力机制

1.背景介绍 为了提高各种计算机视觉任务的性能,人们研究了各种注意机制。然而,以往的方法忽略了保留通道和空间方面的信息以增强跨维度交互的重要性。因此,我们提出了一种全局调度机制,通过减少信息缩减和放大全局交互表示来提高深…

风光储一体化能源中心 | 数字孪生智慧能源

自“双碳”目标提出以来,我国能源产业不断朝着清洁低碳化、绿色化的方向发展。其中,风能、太阳能等可再生能源在促进全球能源可持续发展、共建清洁美丽世界中被寄予厚望。风能、太阳能具有波动性、间歇性、随机性等特点,主要通过转化为电能再…

This dependency was not found: vxe-table/lib/vxe-table in ./src/main.js

描述 使用时 安装 npm install xe-utils vxe-table 引入 import Vue from vue import xe-utils import VXETable from vxe-table import vxe-table/lib/style.css vxe-table是一个基于 vue 的 PC 端表格组件, 支持增删改查、虚拟滚动、懒加载、快捷菜单、数据校验…

微信公众平台怎么添加秒杀活动

微信公众平台是一个非常有用的工具,它可以帮助企业或个人建立自己的品牌形象,增加用户粘性,提高销售业绩等等。在微信公众平台上添加秒杀活动为主题可以吸引更多的用户关注,促进销售,提高品牌知名度等。下面我们将介绍…

uni-app 实现凸起的 tabbar 底部导航栏

效果图 在 pages.json 中设置隐藏自带的 tabbar 导航栏 "custom": true, // 开启自定义tabBar(不填每次原来的tabbar在重新加载时都回闪现) 新建一个 custom-tabbar.vue 自定义组件页面 custom-tabbar.vue <!-- 自定义底部导航栏 --> <template><v…

图像直方图的基础知识

直方图的概念 图像直方图反映了图像中的灰度分布规律。它描述每个灰度级具有的像元个数&#xff0c;但不包含这些像元在图像中的位置信息。任何一幅特定的图像都有唯一的直方图与之对应&#xff0c;但不同的图像可以有相同的直方图。如果一幅图像有两个不相连的区域组成&#…

ARM Linux DIY(十四)摄像头捕获画面显示到屏幕

前言 前期已经调试好了摄像头和屏幕&#xff0c;今天我们将摄像头捕获的画面显示到屏幕上。 原理 摄像头对应 /dev/video0&#xff0c;屏幕对应 /dev/fb0&#xff0c;所以我们只要写一个应用程序&#xff0c;读取 video0 写入到 fb0 就可以了。 应用程序代码实例 camera_d…

[PyTorch][chapter 55][WGAN]

前言&#xff1a; 前面讲到GAN 在训练生成器的时候&#xff0c;如果当前的Pr 和 Pg 的分布不重叠场景下&#xff1a; JS散度为一个固定值&#xff0c;梯度为0&#xff0c;导致无法更新生成器G WGAN的全称是WassersteinGAN&#xff0c;它提出了用Wasserstein距离&#xff08;也…

第2章 算法

2.1 开场白 2.2 数据结构与算法之间的关系 在“数据结构”课程中&#xff0c;就算谈到算法&#xff0c;也是为了帮助理解好数据结构&#xff0c;并不会详细谈及算法的方方面面。 2.3 两种算法的比较 2.4 算法的定义 算法是解决特定问题求解步骤的描述&#xff0c;在计算机…

【AI视野·今日Robot 机器人论文速览 第四十一期】Tue, 26 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Tue, 26 Sep 2023 Totally 73 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Extreme Parkour with Legged Robots Authors Xuxin Cheng, Kexin Shi, Ananye Agarwal, Deepak Pathak人类可以通过以高度动态…

华为智能企业远程办公安全解决方案(1)

华为智能企业远程办公安全解决方案&#xff08;1&#xff09; 课程地址方案背景需求分析企业远程办公业务概述企业远程办公安全风险分析企业远程办公环境搭建需求分析 方案设计组网架构设备选型方案亮点 课程地址 本方案相关课程资源已在华为O3社区发布&#xff0c;可按照以下…

shell脚本学习笔记

shell脚本重点记录 判断文件或者文件夹是否存在 if [ ! -d "log" ];thenchmod 707 $file1一个文件的权限包括读取、写入、执行&#xff0c;权限范围包含所有者、所属组、其他人&#xff0c;可以通过数字或者字母描述一个文件的权限&#xff1a;读取权限对应r或4&a…

高速,低延,任意频丨庚顿新一代实时数据库鼎力支撑电力装备服务数字化

产品同质化日趋严重以及市场需求不断迭代等内外形势下&#xff0c;电力装备制造业自身赢利需求不断增涨&#xff0c;电力等下游产业数字化发展形成倒逼之态&#xff0c;作为国家未来发展的高端装备创新工程主战场&#xff0c;电力装备智能化以及服务型转型升级已经成为装备制造…

在nodejs中如何防止ssrf攻击

在nodejs中如何防止ssrf攻击 什么是ssrf攻击 ssrf&#xff08;server-side request forgery&#xff09;是服务器端请求伪造&#xff0c;指攻击者能够从易受攻击的Web应用程序发送精心设计的请求的对其他网站进行攻击。(利用一个可发起网络请求的服务当作跳板来攻击其他服务)…

mac docker部署hadoop集群

1. 安装docker 确保电脑已经安装docker docker安装过程可自行查找资料&#xff0c;mac下docker可以使用brew命令安装 安装之后&#xff0c;查看docker版本&#xff0c;确认安装成功 docker -v2. 下载jdk 最好下载jdk-8&#xff0c;jdk的版本过高可能hadoop2.x不支持jdk-8的下…

掌握 JavaScript 数组方法:了解如何操作和优化数组

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Android Logcat 命令行工具

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、日常用法3.1 面板介绍3.2 日志过滤…

零代码编程:用ChatGPT批量将多个文件夹中的视频转为音频

有多个文件夹中的 视频&#xff0c;都要批量转换成音频格式。 转换完成后要删除视频。虽然现在已经有很多格式转换软件可以实现这个功能&#xff0c;但是需要一个个文件夹的操作&#xff0c;还要手动去删除视频。用ChatGPT来写一个批量自动操作程序吧&#xff1a; 输入提示词如…

获取el-select选中的下标

accountZbList:[ ]:下拉列表已通过接口获取数据 <el-row><el-col :span"12"><el-form-item label"账簙" prop"accountTook" class"itemzb"><el-select v-model"tableForm.accountTook" placeholder&…