文章目录
- 前言
- 对于前面博客的总结
- 一、任务调度算法是什么?
- 1.调度算法是什么以及freertos的调度算法
- 2.抢占式优先级调度
- 3.时间片轮转调度
- 二、配置调度算法
- 总结
前言
本系列基于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 进行任务管理时,开发者需要注意任务的资源管理、优先级设置和调度策略等方面,以确保系统能够稳定地运行,并满足实时性和响应性的要求。