FreeRTOS 任务调度详解

目录

一、引言

二、FreeRTOS 任务调度概述

1.任务的概念

2.任务调度的作用

三、FreeRTOS 任务调度策略

1.优先级抢占式调度

2.时间片轮转调度

四、FreeRTOS 任务调度相关 API

1.任务创建函数

2. 任务删除函数

3.任务挂起和恢复函数 

4.任务延迟函数 

五、注意事项 

1.任务优先级的设置

2.任务堆栈大小的选择

3.避免任务死锁和优先级反转

六、总结


一、引言

        在嵌入式系统开发中,实时操作系统(RTOS)的任务调度是一个关键环节。FreeRTOS 作为一款流行的开源实时操作系统,提供了灵活高效的任务调度机制。本文将深入探讨 FreeRTOS 的任务调度原理、策略以及相关的 API 使用方法,帮助读者更好地理解和应用 FreeRTOS 的任务调度功能。

二、FreeRTOS 任务调度概述

1.任务的概念

  • 在 FreeRTOS 中,任务是独立的执行单元,类似于传统操作系统中的线程。每个任务都有自己的堆栈、优先级和状态。
  • 任务可以处于就绪、运行、阻塞等状态,由 FreeRTOS 的任务调度器负责管理任务的状态转换和执行顺序。

2.任务调度的作用

  • 任务调度的主要作用是合理分配 CPU 资源,确保高优先级的任务能够及时得到执行,同时兼顾低优先级任务的执行机会,以提高系统的整体性能和响应速度。
  • 通过任务调度,可以实现多任务并发执行,提高系统的资源利用率和处理能力。

三、FreeRTOS 任务调度策略

1.优先级抢占式调度

  • FreeRTOS 采用优先级抢占式调度策略,即高优先级的任务可以随时抢占低优先级任务的执行权。
  • 当一个高优先级的任务进入就绪状态时,任务调度器会立即暂停当前正在执行的低优先级任务,转而执行高优先级任务
  • 这种调度策略可以确保关键任务能够及时得到执行,适用于对实时性要求较高的系统。

2.时间片轮转调度

  • 当多个任务具有相同的优先级时,FreeRTOS 采用时间片轮转调度策略。每个任务在一个时间片内轮流执行,当时间片用完后,任务调度器会切换到下一个任务执行。
  • 时间片的大小可以在 FreeRTOS 的配置文件中进行设置,通常以系统时钟节拍为单位。
  • 时间片轮转调度可以保证多个任务在相同优先级下公平地共享 CPU 资源。

四、FreeRTOS 任务调度相关 API

1.任务创建函数

  • xTaskCreate():用于创建一个新的任务。该函数需要指定任务函数、任务名称、任务堆栈大小、任务参数以及任务优先级等参数。
  • 例如:
 #include "FreeRTOS.h"
     #include "task.h"

     void taskFunction(void *pvParameters)
     {
         while (1)
         {
             // 任务执行的代码
         }
     }

     int main()
     {
         xTaskCreate(taskFunction, "Task1", 128, NULL, 1, NULL);
         // 启动任务调度器
         vTaskStartScheduler();
         return 0;
     }

2. 任务删除函数

  • vTaskDelete():用于删除一个任务。该函数需要指定要删除的任务句柄。
  • 例如:
TaskHandle_t taskHandle;

     void taskFunction(void *pvParameters)
     {
         while (1)
         {
             if (some_condition)
             {
                 // 删除当前任务
                 vTaskDelete(taskHandle);
             }
         }
     }

     int main()
     {
         xTaskCreate(taskFunction, "Task1", 128, NULL, 1, &taskHandle);
         vTaskStartScheduler();
         return 0;
     }

3.任务挂起和恢复函数 

  • vTaskSuspend():用于挂起一个任务。该函数需要指定要挂起的任务句柄。
  • vTaskResume():用于恢复一个被挂起的任务。该函数需要指定要恢复的任务句柄。
  • 例如:
TaskHandle_t taskHandle;

     void taskFunction(void *pvParameters)
     {
         while (1)
         {
             if (some_condition)
             {
                 // 挂起当前任务
                 vTaskSuspend(taskHandle);
             }
             else if (other_condition)
             {
                 // 恢复被挂起的任务
                 vTaskResume(taskHandle);
             }
         }
     }

     int main()
     {
         xTaskCreate(taskFunction, "Task1", 128, NULL, 1, &taskHandle);
         vTaskStartScheduler();
         return 0;
     }

4.任务延迟函数 

  • vTaskDelay():用于让任务延迟一段时间,任务调度主要用到的函数,延迟时间结束后任务会成为就绪状态,前面没有更高优先级的任务就绪或者运行的时候,这个任务就会运行。该函数需要指定延迟的时间,以系统时钟节拍为单位。
  • 例如:
void taskFunction(void *pvParameters)
     {
         while (1)
         {
             // 执行一些任务
             vTaskDelay(100); // 延迟 100 个系统时钟节拍
         }
     }

五、注意事项 

1.任务优先级的设置

  • 合理设置任务优先级非常重要。过高的优先级可能导致低优先级任务长时间得不到执行,而过低的优先级可能导致关键任务无法及时响应
  • 一般来说,应该根据任务的重要性和实时性要求来设置任务优先级。

2.任务堆栈大小的选择

  • 任务堆栈大小的选择需要根据任务的复杂程度和可能的最大调用深度来确定。如果堆栈大小设置过小,可能会导致任务堆栈溢出,从而引发系统故障。
  • 可以通过实际测试和调试来确定合适的任务堆栈大小。

3.避免任务死锁和优先级反转

  • 在多任务系统中,任务之间可能会出现死锁和优先级反转的情况。死锁是指两个或多个任务相互等待对方释放资源,从而导致系统无法继续执行。优先级反转是指低优先级任务持有高优先级任务所需的资源,从而导致高优先级任务无法及时执行。
  • 为了避免死锁和优先级反转,可以采用一些同步机制,如信号量、互斥锁等。

六、总结

        FreeRTOS 的任务调度是其核心功能之一,通过合理地设置任务优先级、选择合适的调度策略以及正确使用相关的 API,可以实现高效的多任务并发执行,提高嵌入式系统的性能和响应速度。在实际应用中,需要根据具体的系统需求和硬件资源来进行任务调度的优化和调整,以确保系统的稳定性和可靠性。希望本文对读者理解和应用 FreeRTOS 的任务调度功能有所帮助。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/903483.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

健康之路押注医药零售:毛利率下滑亏损扩大,医疗咨询人次大幅减少

《港湾商业观察》黄懿 2024年9月13日,健康之路股份有限公司(下称“健康之路”)再次递表港交所,建银国际为独家保荐人。健康之路国内运营主体为健康之路(中国)信息技术有限公司和福建健康之路信息技术有限公…

(二)HTML入门

目录 1.标题排版 2.标题样式 3.正文排版 4.页面布局 5.表格、表单标签 1.标题排版 图片标签&#xff1a;<img>&#xff0c;src&#xff1a;指定图像的url(绝对路径/相对路径) width&#xff1a;图像的宽度(像素/相对于父元素的百分比) height&#xff1a;图像的高…

若依框架部署到服务器刷新或者是退出登录出现404

登出错误404 改成/登出的时候重定向到根路径&#xff0c;让nginx匹配去找dist目录下的index.html文件 或者是直接改为/index.html&#xff0c;少一步可能会快一点&#xff1f; 不过会变得很丑,算了还是根目录吧 原版是index&#xff0c;那玩意是 针对路由的&#xff0c;而打包…

mysql 5.7实现组内排序(连续xx天数)

需求&#xff1a;查询出连续登录的用户及其连续登录的天数 我先说一下思路&#xff1a;要实现连续登录的判断&#xff0c;可以找一下他们之间的规律。这里我拿一个用户来说&#xff0c;如果这个用户在1、2、3号都有登录记录&#xff0c;可以对这个用户的数据按照时间排序&…

QT 从ttf文件中读取图标

最近在做项目时&#xff0c;遇到需要显示一些特殊字符的需求&#xff0c;这些特殊字符无法从键盘敲出来&#xff0c;于是乎&#xff0c;发现可以从字体库文件ttf中读取显示。 参考博客&#xff1a;QT 图标字体类IconHelper封装支持Font Awesome 5-CSDN博客 该博客封装的很不错…

【Python字符串操作】常用方法和高级技巧

包含编程资料、学习路线图、源代码、软件安装包等&#xff01;【[点击这里]】领取&#xff01; Python作为一种强大的编程语言&#xff0c;在处理文本数据方面提供了丰富而灵活的工具。字符串是Python中最常用的数据类型之一&#xff0c;掌握字符串操作不仅能提高代码效率&…

深度学习系列——RNN/LSTM/GRU,seq2seq/attention机制

1、RNN/LSTM/GRU可参考&#xff1a; https://zhuanlan.zhihu.com/p/636756912 &#xff08;1&#xff09;对于这里面RNN的表示中&#xff0c;使用了输入x和h的拼接描述&#xff0c;其他公式中也是如此 &#xff08;2&#xff09;各符号图含义如下 2、关于RNN细节&#xff0c;…

VMware虚拟机启动报错“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”

之前正常使用的VMware虚拟机&#xff0c;突然启动时报错&#xff1a;此主机支持 Intel VT-x&#xff0c;但 Intel VT-x 处于禁用状态&#xff0c;详细信息如下截图所示。   百度错误信息&#xff0c;根据参考文献1中的方案&#xff0c;进入BIOS设置启动VT-x。进入BIOS后&…

顺序表-数组逆置

今天开始进入算法环节&#xff0c;从头开始手撸各种算法&#xff0c;这里使用C语言&#xff0c;后续我会补充Java版的。 大家都知道顺序表是一个线性表&#xff0c;那么他就具有线性表的特性&#xff0c;那就是随机存取&#xff0c;它的逻辑地址跟物理地址都是相同的&#xff…

一个简单的 uas_send_bye.xml for SIPp

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE scenario SYSTEM "sipp.dtd"> <scenario name"iinv-o200-obye.xml -- wjd 2014"><recv request"INVITE" rrs"true"/><send>&l…

单片机串口和电脑串口连接

单片机串口和电脑串口连接&#xff1a; 先将MCU的TTL电平转换为RS232电平&#xff0c;才可以和电脑的串口DB9相连接。见下图所示&#xff1a; 翻看自己以前记录的笔记&#xff0c;真是初级到极点了。

Java Lock Semaphore 总结

前言 相关系列 《Java & Lock & 目录》&#xff08;持续更新&#xff09;《Java & Lock & Semaphore & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Java & Lock & Semaphore & 总结》&#xff08;学习总结/最新最准…

文案语音图片视频管理分析系统-视频矩阵

文案语音图片视频管理分析系统-视频矩阵 1.产品介绍 产品介绍方案 产品名称&#xff1a; 智驭视频矩阵深度分析系统&#xff08;SmartVMatrix&#xff09; 主要功能&#xff1a; 深度学习驱动的视频内容分析多源视频整合与智能分类高效视频检索与编辑实时视频监控与异常预警…

C#判断点是否在多边形内

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff01;人工智能学习网站 前言&#xff1a; 大家好&#xff0c;我是上位机马工&#xff0c;硕士毕业4年年入40万&#xff0c;目前在一家自动化公司担任…

【SQL Server】解决因使用 varchar 类型存储 Unicode 字符串导致的中文显示乱码问题

问题描述 导入 SQL 到 SQL Server 数据库后&#xff0c;存在部分列的中文显示异常的问题。 原因分析 观察发现显示异常的字段的数据类型是 varchar&#xff0c;而显示正常的字段的数据类型是 nvarchar。 而且&#xff0c;SQL 文件中所有字符串前面都带有 N 的前缀。 在 SQL 中…

su user更换用户后无法打开图形屏幕Cannot open your terminal ‘/dev/pts/0‘ 解决办法

我在docker内使用了su john更换了用户&#xff0c;执行petalinux-config -c kernel时打不开图形屏幕窗口&#xff0c;需要执行命令script /dev/null 进入docker和配置状态的所有命令行命令如下&#xff1a; johnjohn-hp:~/zynq$ ./docker_ubuntu16.sh rootjohn-hp:/home/john/…

【永中软件-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

Oracle自动处理表空间不足脚本

关注过我的朋友们应该知道我分享过一些常用的监控脚本&#xff0c;其中最常用的就是监控表空间使用率的脚本&#xff0c;具体可以参考如下链接​&#xff1b; oracle常用监控脚本&#xff08;纯干货&#xff0c;没有EMCC,ZABBIX也不怕&#xff09;_oracle 监控及日常处理脚本-…

如何用示波器测实时时钟信号和主时钟信号

使用示波器测量实时时钟信号&#xff08;RTC&#xff09;和主时钟信号&#xff08;Main Clock Signal&#xff09;的步骤如下&#xff1a; 1. 准备工作 选择合适的探头&#xff1a;使用高品质的示波器探头&#xff0c;通常10X衰减探头适合大部分情况。校准探头&#xff1a;确…

NVR设备ONVIF接入平台EasyCVR视频融合平台智慧小区视频监控系统建设方案

一、方案背景 智慧小区构成了“平安城市”建设的基石。随着社会的进步&#xff0c;社区安全问题逐渐成为公众关注的热点。诸如高空抛物、乱丢垃圾、破坏车辆、入室盗窃等不文明行为和违法行为频繁出现。目前&#xff0c;许多小区的物业管理和安全防护系统仍然较为简单和陈旧&a…