【Freertos基础入门】任务调度

简介: 【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,先不使用这个功能。

fbd1a02fff65422688d52f565856d1db.png

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

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

configUSE_PREEMPTION

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

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

14bcd915c5d34e099070c5e4701c1c9a.png

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 执行时间。

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

b8a50794cfeb4c96a02abbbbfa1eef85.png

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

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

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


总结


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


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

相关文章
|
12月前
|
API
FreeRTOS学习笔记—FreeRTOS移植
本文学习了如何移植FreeRTOS到自己的STM32工程。最后,根据正点原子提供的测试main函数,测试了移植效果。
390 0
FreeRTOS学习笔记—FreeRTOS移植
|
12月前
|
传感器 调度 开发者
【Freertos基础入门】freertos任务的优先级
【Freertos基础入门】freertos任务的优先级
394 0
|
4月前
|
消息中间件 算法 编译器
【FreeRTOS(一)】FreeRTOS新手入门——初识FreeRTOS
【FreeRTOS(一)】FreeRTOS新手入门——初识FreeRTOS
|
4月前
|
传感器 物联网 调度
从0入门FreeRTOS之第一节 什么是FreeRTOS?
FreeRTOS(Free Real-Time Operating System)是一款开源的实时操作系统(RTOS),专为嵌入式系统设计。由Real Time Engineers Ltd.开发和维护,FreeRTOS以其小巧、高效、易于使用的特点广受欢迎。FreeRTOS支持多种微控制器和微处理器平台,提供丰富的实时操作系统功能,使开发者能够轻松构建高效、实时响应的应用程序。
267 0
|
4月前
|
存储 安全 算法
从0入门FreeRTOS之第二节FreeRTOS的体系结构
FreeRTOS的体系结构设计精巧且高效,专为嵌入式系统量身打造。理解FreeRTOS的体系结构对开发高效、稳定的嵌入式应用至关重要。下面,我们详细介绍FreeRTOS的核心组件、内核机制、中断管理和内存管理等内容。
137 0
|
5月前
|
消息中间件 算法 调度
|
5月前
|
消息中间件 调度
FreeRTOS入门教程(任务状态)
FreeRTOS入门教程(任务状态)
196 0
|
12月前
|
调度 C语言 芯片
FreeRTOS学习笔记—基础知识
本文简要介绍了什么是RTOS,介绍了前后台系统和RTOS的工作流程。此外,简单介绍了FreeRTOS的特点,相关概念和优点。最后,介绍了下载FreeRTOS的方法。
246 0
FreeRTOS学习笔记—基础知识
|
5月前
|
消息中间件 存储 数据采集
FreeRTOS入门教程(任务通知)
FreeRTOS入门教程(任务通知)
74 0
|
5月前
|
存储 API 调度
FreeRTOS深入教程(任务创建的深入和任务调度机制分析)
FreeRTOS深入教程(任务创建的深入和任务调度机制分析)
258 0