【Freertos基础入门】任务调度

文章目录


前言

本系列基于stm32系列单片机来使用freerots

任务管理是实时操作系统(RTOS)的核心功能之一,它允许开发者以并发的方式组织和管理多个任务。FreeRTOS 是一个流行的开源RTOS,它提供了强大的任务管理功能,让开发者能够轻松创建和控制任务。本文将介绍 FreeRTOS 的任务管理功能,包括任务的创建、删除、挂起、恢复和优先级控制等方面的内容。


对于前面博客的总结

这些知识在前面都提到过了,这里总结一下。

正在运行的任务,被称为"正在使用处理器",它处于运行状态。在单处理系统中,任何时间里只能有一

个任务处于运行状态。

非运行状态的任务,它处于这3中状态之一:阻塞(Blocked)、暂停(Suspended)、就绪(Ready)。就绪态

的任务,可以被调度器挑选出来切换为运行状态,调度器永远都是挑选最高优先级的就绪态任务并让它

进入运行状态。

阻塞状态的任务,它在等待"事件",当事件发生时任务就会进入就绪状态。事件分为两类:时间相关的

事件、同步事件。所谓时间相关的事件,就是设置超时时间:在指定时间内阻塞,时间到了就进入就绪

状态。使用时间相关的事件,可以实现周期性的功能、可以实现超时功能。同步事件就是:某个任务在

等待某些信息,别的任务或者中断服务程序会给它发送信息。怎么"发送信息"?方法很多,有:任务通

知(task notification)、队列(queue)、事件组(event group)、信号量(semaphoe)、互斥量(mutex)等。

这些方法用来发送同步信息,比如表示某个外设得到了数据。

一、任务调度算法是什么?

1.调度算法是什么以及freertos的调度算法

当我们在设计多任务程序时,需要有一种机制来决定哪个任务应该执行,这就是任务调度算法。FreeRTOS 使用的任务调度算法是基于抢占式优先级调度的。

2.抢占式优先级调度

抢占式优先级调度是一种简单而高效的调度算法。它根据每个任务的优先级来确定任务的执行顺序。优先级越高的任务越先执行。当有多个任务处于就绪状态(可以执行)时,FreeRTOS 会选择优先级最高的任务来执行。

3.时间片轮转调度

同时,FreeRTOS 还支持时间片轮转调度。当有多个任务拥有相同的最高优先级时,它们会以轮流的方式分享 CPU 的执行时间。每个任务被分配一个小段时间(时间片),当时间片用完后,任务会被暂停,让其他任务有机会执行。这样,所有任务都能够公平地分享 CPU 执行时间。

二、配置调度算法

所谓调度算法,就是怎么确定哪个就绪态的任务可以切换为运行状态。

通过配置文件FreeRTOSConfig.h的两个配置项来配置调度算法:configUSE_PREEMPTION、

configUSE_TIME_SLICING。

还有第三个配置项:configUSE_TICKLESS_IDLE,它是一个高级选项,用于关闭Tick中断来实现省电,后续单独讲解。现在我们假设configUSE_TICKLESS_IDLE被设为0,先不使用这个功能。

所需的文件在这里。如上图。

在 FreeRTOS 中,configUSE_PREEMPTION 和 configUSE_TIME_SLICING 是两个配置选项,用来决定任务调度算法的行为。

configUSE_PREEMPTION

当 configUSE_PREEMPTION 设置为 1 时,表示启用抢占式调度。这意味着高优先级任务可以抢占正在执行的低优先级任务,以确保及时响应紧急事件。当有高优先级任务就绪时,当前任务可能会被暂停,新的高优先级任务会立即开始执行。

当 configUSE_PREEMPTION 设置为 0 时,表示禁用抢占式调度。这意味着任务在开始执行后,只有在主动放弃执行或完成之后才会切换到下一个就绪任务。这种情况下,任务之间的切换只会在任务主动让出 CPU 或者发生中断等特殊情况时发生。

configUSE_TIME_SLICING:

configUSE_TIME_SLICING 设置为 1 时,表示启用时间片轮转调度。当有多个具有相同优先级的任务就绪时,它们会按照时间片的形式轮流分享 CPU 的执行时间。每个任务被分配一个小段时间(时间片),当时间片用完后,任务会被暂停,切换到下一个就绪任务。

当 configUSE_TIME_SLICING 设置为 0 时,表示禁用时间片轮转调度。此时,在具有相同优先级的就绪任务中,只有当任务发生阻塞或让出 CPU 时,才会切换到下一个就绪任务。

综上所述,configUSE_PREEMPTION 和 configUSE_TIME_SLICING 是 FreeRTOS 中用来配置任务调度算法的选项:

configUSE_PREEMPTION 用来决定是否启用抢占式调度,即高优先级任务可以抢占低优先级任务。

configUSE_TIME_SLICING 用来决定是否启用时间片轮转调度,即任务轮流分享 CPU 执行时间。

这些配置选项可以根据应用程序的需求进行灵活的设置,以满足不同任务调度策略的要求。

调度算法的行为主要体现在两方面:高优先级的任务先运行、同优先级的就绪态任务如何被选中。调度

算法要确保同优先级的就绪态任务,能"轮流"运行,策略是"轮转调度"(Round Robin Scheduling)。轮

转调度并不保证任务的运行时间是公平分配的,我们还可以细化时间的分配方法。


总结

任务管理是 FreeRTOS 提供的一个强大功能,它允许开发者以并发的方式组织和管理多个任务。通过任务的创建、删除、挂起、恢复和优先级控制等操作,开发者可以灵活地控制任务的执行顺序和调度策略,从而实现复杂的系统功能。任务通信与同步机制进一步增强了任务的协同工作能力,使任务之间能够高效地共享数据和协调操作。借助 FreeRTOS 提供的任务管理功能,开发者可以更加方便地构建实时嵌入式系统,并具备可靠性和高效性。

需要注意的是,在使用 FreeRTOS 进行任务管理时,开发者需要注意任务的资源管理、优先级设置和调度策略等方面,以确保系统能够稳定地运行,并满足实时性和响应性的要求。

相关推荐
ZLRRLZ31 分钟前
【C++】多态
开发语言·c++
TANGLONG2221 小时前
【初阶数据结构与算法】八大排序之非递归系列( 快排(使用栈或队列实现)、归并排序)
java·c语言·数据结构·c++·算法·蓝桥杯·排序算法
第二层皮-合肥1 小时前
硬件设计-时钟振荡器
嵌入式硬件
不想当程序猿_1 小时前
【蓝桥杯每日一题】与或异或——DFS
c++·算法·蓝桥杯·深度优先
cccccc语言我来了2 小时前
c++-----------------多态
java·开发语言·c++
sunny-ll2 小时前
【C++】explicit关键字详解(explicit关键字是什么? 为什么需要explicit关键字? 如何使用explicit 关键字)
c语言·开发语言·c++·算法·面试
轩源源2 小时前
C++草原三剑客之一:继承
开发语言·数据结构·c++·算法·青少年编程·继承·组合
未知陨落2 小时前
leetcode题目(1)
c++·leetcode
半盏茶香4 小时前
C语言勘破之路-最终篇 —— 预处理(下)
c语言·开发语言·c++·算法
_君莫笑8 小时前
【视频】将yuv420p的一帧数据写入文件
c++·音视频·yuv420p