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

相关文章
|
4月前
|
人工智能 自然语言处理 监控
Browser Use:打造你的浏览器自动化助手
你是否曾希望用简单的一句话就能让浏览器自动填表、抓数据或做测试?Browser Use 让这成为现实。它结合了语言模型的智能和传统自动化的稳定,能听懂自然语言指令,自己规划步骤,还能应对网页变动和错误。无论是开发者还是普通用户,都能用它高效完成日常操作,省时省力。安装简单,写行指令就能马上体验。
|
Java Android开发 开发者
Android10 修改开发者选项中动画缩放默认值
Android10 修改开发者选项中动画缩放默认值
645 0
|
9月前
|
运维 NoSQL Cloud Native
国内独家|阿里云首发MongoDB 8.0,性能提升“快”人一步
阿里云作为MongoDB的最佳战略合作伙伴,在国内独家发布了8.0版本,支撑广大用户进一步提升业务效率。
|
11月前
|
缓存 小程序 API
微信小程序页面导航与路由:实现多页面跳转与数据传递
本文深入探讨微信小程序的页面导航与路由机制,介绍多种页面跳转方式如`wx.navigateTo`、`wx.redirectTo`、`wx.switchTab`等,并讲解通过URL、全局变量和事件传递数据的方法。结合案例实现多页面跳转与数据传递,帮助开发者掌握这一重要技能。
|
10月前
|
人工智能 智能设计 数据可视化
AIGC设计点亮巴黎奥运AI科技之旅
AIGC设计点亮巴黎奥运AI科技之旅
|
人工智能 自然语言处理 算法
AI 应用之成本节约实践
本文探讨了如何避免高成本的模型微调,通过任务拆解和提示词调优实现业务目标。文中提到,当大语言模型不能直接满足需求时,微调涉及大量工作,包括数据准备、模型训练及GPU资源。为降低成本,作者提出了两步方法:1) 任务拆解,将复杂任务分解为简单子任务,利用模型优势处理部分;2) 提示词调优,优化输入以引导模型更高效地响应。虽然这可能不适用于所有情况,但能有效减少对模型微调的依赖。
741 1
|
tengine 负载均衡 应用服务中间件
Nginx+Keepalived高可用集群部署详细文档
Nginx+Keepalived高可用集群部署详细文档
801 0
|
安全 Shell Linux
【Shell 命令集合 设备管理 】⭐⭐⭐ Linux 关机 poweroff命令 使用指南
【Shell 命令集合 设备管理 】⭐⭐⭐ Linux 关机 poweroff命令 使用指南
566 0
【Shell 命令集合 设备管理 】⭐⭐⭐ Linux 关机 poweroff命令 使用指南
|
芯片
STM32CubeMX 串口数据收发
STM32CubeMX 串口数据收发
592 2
|
Linux
LINUX查看OpenGL信息
LINUX查看OpenGL信息
657 0