【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 进行任务管理时,开发者需要注意任务的资源管理、优先级设置和调度策略等方面,以确保系统能够稳定地运行,并满足实时性和响应性的要求。

相关文章
|
存储 算法 安全
【Freertos基础入门】队列(queue)的使用
【Freertos基础入门】队列(queue)的使用
1694 0
|
传感器 调度 开发者
【Freertos基础入门】freertos任务的优先级
【Freertos基础入门】freertos任务的优先级
2151 0
|
1月前
|
中间件 项目管理 芯片
Keil MDK(uVision5)完全指导手册(个人总结,篇幅有限)
本指南系统讲解Keil MDK5开发全流程:涵盖环境搭建、首个STM32项目(LED闪烁)、工程配置、断点调试与内存监视、编译优化、中间件集成(USB/文件系统)及常见问题排错,助力嵌入式开发者高效入门与进阶。(239字)
1254 2
|
存储 安全 API
基于FreeRTOS中的串口不定长接收(使用队列进行数据传输)
基于FreeRTOS中的串口不定长接收(使用队列进行数据传输)
2126 0
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
编译器 调度
FreeRTOS任务的创建(动态方法和静态方法)
FreeRTOS任务的创建(动态方法和静态方法)
3292 0
简单易操作 VsCoe离线安装插件【步骤+图片+插件】
这篇文章介绍了在Visual Studio Code (VSCode) 中进行离线安装插件的详细步骤,包括如何下载插件、以SVN插件为例的离线安装过程、通过命令行安装以及一个更加简单的离线安装方式,还提供了操作界面的截图帮助理解。
简单易操作 VsCoe离线安装插件【步骤+图片+插件】

热门文章

最新文章

下一篇
开通oss服务