当前位置: 首页 > news >正文

STM32F103移植FreeRTOS必须搞明白的系列知识---2(FreeRTOS任务优先级)

目录

一、 STM32F103  Cortex-CM3的中断优先级

二、 FreeRTOS任务优先级

1、FreeRTOS 任务的最高优先级      

2、任务优先级分配方案

三、中断优先级和任务优先级区别


一、 STM32F103  Cortex-CM3的中断优先级

        博主前面一篇文档介绍了STM32F103  Cortex-CM3的抢占优先级和响应优先级。其中:抢占优先级和响应优先级是硬件中断的优先级

        STM32F103  Cortex-CM3中,抢占优先级和响应优先级的关系图:

高优先级                                             ------>                                                         低优先级

            0-->1-->2-->3-->4-->5-->6-->7-->8-->9-->10-->11 -->12 -->13 -->14 -->15

         STM32F103  Cortex-CM3只有16种中断类型(0-15),中断优先级数值越小,优先级越高;中断优先级数值越大,优先级越低。

        例如:0(0类型的中断)的中断优先级最高,15(15类型的中断)的中断优先级最低。

提示:

          1、STM32F103  Cortex-CM3只有16种中断类型(0-15)。

          2、优先级数值越小,优先级越高。(0:优先级最高,15:优先级最低)

           3、STM32F103  Cortex-CM3有16种中断类型,并不代表最大只支持16个中断源,实际的工程项目中,经常可能会超过16个中断源。可以将多个中断源定义到同一种中断源,例如:可以将USART1、USART2、SPI2的抢占优先级都分配为12。

           4、不同种类的中断可以实现中断嵌套,相同种类的中断不允许中断嵌套。例如:USART1、USART2、SPI2的抢占优先级都分配为12,IIC的抢占优先级为10。

                 (1)、如果当前正在USART1中断服务程序,此时触发USART2中断,由于USART1中断和USART2中断是同一种类的中断级别,因此系统仍然执行USART1中断服务程序,当退出USART1中断服务程序后,才会进入USART2中断服务程序。(相同种类的中断不允许中断嵌套,即:级别相同的中断类型不允许打断另外一个同级别的中断类型

                 (2)、如果当前正在USART1中断服务程序,此时触发IIC中断,由于IIC中断的优先级比USART1中断的优先级别高,因此系统会打断USART1中断服务程序的执行,跳转到IIC中断服务程序执行,当系统退出IIC中断服务程序后,才会进入USART1中断服务程序继续执行剩余的程序段。(级别高的中断类型允许中断嵌套级别低的中断类型,即:级别高的中断类型允许打断级别低的中断类型)                       

                       

二、 FreeRTOS任务优先级

        FreeRTOS任务的优先级数量理论上最大可以支持65535个,但是由于单片机资源的限制,实际上肯定支持不了那么多。FreeRTOS任务优先级数值越小,优先级越低;FreeRTOS任务的优先级数值越大,优先级越高

        FreeRTOS官网建议FreeRTOS任务的优先级数量(即用户任务可以使用的优先级 最大值不要超过 32(范围是0到31)。 FreeRTOS任务优先级0的优先级最低,FreeRTOS任务优先级31的优先级最高。

        

        因为对于CM内核的移植文件,用户任务的优先级大于等于32的话, portmacro.h文件中的宏定义configUSE_PORT_OPTIMISED_TASK_SELECTION会优化优先级列表中要执行的最高优先级任务的获取算法。

1、FreeRTOS 任务的最高优先级      

        FreeRTOS 任务的最高优先级是通过 FreeRTOSConfig.h 文件中的configMAX_PRIORITIES 进行配置的,参见下图的 FreeRTOSConfig.h 文件。

        用户实际可以使用的优先级范围是 0 到 configMAX_PRIORITIES – 1。比如我们配置此宏定
义为 5,那么用户可以使用的优先级号是 0,1,2,3,4,不包含 5,对于这一点,初学者要特别的注意。

       警告:如果宏configMAX_PRIORITIES配置为5,如果用户创建任务时使用了优先级5,6,就会造成系统崩溃。

       (1)、用户配置任务的优先级数值越小,那么此任务的优先级越低,空闲任务的优先级是 0。用户配置任务的优先级数值越大,那么此任务的优先级越高。
       (2)、建议用户配置宏定义 configMAX_PRIORITIES 的最大值不要超过 32,即用户任务可以使用的优先级范围是0到31

2、任务优先级分配方案

        对于初学者,有时候会纠结任务优先级设置为多少合适,因为任务优先级设置多少是没有标准的。对于这个问题,我们这里为大家推荐一个标准,任务优先级设置推荐方式如下图  所示:

         (1)、IRQ 任务:IRQ 任务是指通过中断服务程序进行触发的任务,此类任务应该设置为所有任务里面优先级最高的。

         (2)、高优先级后台任务:比如按键检测,触摸检测,USB 消息处理,串口消息处理等,都可以归为这一类任务。

         (3)、低优先级的时间片调度任务:比如 emWin 的界面显示,LED 数码管的显示等不需要实时执行的都可以归为这一类任务。 实际应用中用户不必拘泥于将这些任务都设置为优先级 1 的同优先级任务,可以设置多个优先级,只需注意这类任务不需要高实时性。

         (4)、空闲任务:空闲任务是系统任务,系统自动创建,优先级固定为0。

        特别注意:IRQ 任务和高优先级任务必须设置为阻塞式(调用消息等待或者延迟等函数即可),只有这样,高优先级任务才会释放 CPU 的使用权,从而低优先级任务才有机会得到执行。

三、中断优先级和任务优先级区别

        部分初学者也容易在这两个概念上面出现问题。 简单的说,这两个之间没有任何关系,不管中断的优先级是多少,中断的优先级永远高于任何任务的优先级,即任务在执行的过程中,中断来了就开始执行中断服务程序。
        另外对于STM32F103来说,中断优先级的数值越小,优先级越高。 而FreeRTOS的任务优先级是,任务优先级数值越小,任务优先级越低

        另外STM32F103最大只支持16种类型的中断优先级(并不是说最大只支持16个中断源,如果多于16个中断源,可以将多个中断源定义为同级别的中断优先级),FreeRTOS的任务优先级理论上可以支持无限多,但是官网建议最大支持32个优先级(0到31),最大数量由宏configMAX_PRIORITIES确定,用户可以使用的优先级范围是0到configMAX_PRIORITIES–1 。比如我们配置此宏定义为 5,那么用户可以使用的优先级号是 0,1,2,3,4,不包含 5,系统空闲任务的优先级固定为0。

相关文章:

  • ijkplayer播放器剖析(四)音频解码与音频输出机制分析
  • 本地web项目如何使用外网访问?教你轻松使用cpolar在windows搭建内网穿透
  • MySQL复合查询
  • 你需要的导航网站,这里都有
  • [SV]SystemVerilog中指定打印格式
  • 长期主义就是坚持重复的做一件事?
  • 各位程序员们,睡眠不足产生的后果超出你想象!
  • c++学习
  • 6步搭建一个飞机大战游戏
  • 前端与后端传递数据 — — JSON
  • CANoe/CAPL ,QQ消息远程通知
  • 3D 视觉算法初学概述
  • 特征点检测和特征点匹配(ORB)
  • MySQL事务篇:ACID原则、事务隔离级别及事务机制原理剖析
  • 【Spring依赖循环】提前曝光,直接曝光到二级缓存已经可以解决循环依赖问题了,为什么一定要三级缓存?
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • const let
  • ES6之路之模块详解
  • JavaScript设计模式之工厂模式
  • Laravel 实践之路: 数据库迁移与数据填充
  • mysql innodb 索引使用指南
  • PHP 7 修改了什么呢 -- 2
  • Python socket服务器端、客户端传送信息
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • ------- 计算机网络基础
  • 记录一下第一次使用npm
  • 浅谈Golang中select的用法
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (52)只出现一次的数字III
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (区间dp) (经典例题) 石子合并
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (万字长文)Spring的核心知识尽揽其中
  • (一一四)第九章编程练习
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .NET 5种线程安全集合
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .net反编译的九款神器
  • .NET简谈设计模式之(单件模式)
  • .NET开发者必备的11款免费工具
  • .Net面试题4
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • //解决validator验证插件多个name相同只验证第一的问题
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • @RequestMapping 的作用是什么?
  • [ NOI 2001 ] 食物链