FreeRTOS 任务优先级问题
来源:互联网 发布:软件测试通过的标准 编辑:程序博客网 时间:2024/06/06 05:08
任务优先级说明
- FreeRTOS 中任务的最高优先级是通过 FreeRTOSConfig.h 文件中的 configMAX_PRIORITIES 进行配置的,用户实际可以使用的优先级范围是 0 到 configMAX_PRIORITIES – 1。比如我们配置此宏定义为 5,那么用户可以使用的优先级号是 0,1,2,3,4,不包含 5,对于这一点,初学者要特别的注意。
- 用户配置任务的优先级数值越小,那么此任务的优先级越低,空闲任务的优先级是 0。
- 建议用户配置宏定义 configMAX_PRIORITIES 的最大值不要超过 32,即用户任务可以使用的优先级范围是0到31。因为对于CM内核的移植文件,用户任务的优先级不是大于等于32的话,portmacro.h文件中的宏定义configUSE_PORT_OPTIMISED_TASK_SELECTION会优化优先级列表中要执行的最高优先级任务的获取算法(对于 CM 内核的移植文件,此宏定义默认是使能的,当然,用户也可以在FreeRTOSConfig.h 文件中进行配置)。 相比通用的最高优先级任务获取算法,这两种方式的对比如下:
- 通用方式,没有优化—配置宏定义 configUSE_PORT_OPTIMISED_TASK_SELECTION 为 0:
- 所有平台的移植文件都可以配置为 0,因为这是通用方式。
- 纯 C 编写,比专用方式效率低。
- 可用的优先级数量不限制。
- 专用方式,进行优化—配置宏定义 configUSE_PORT_OPTIMISED_TASK_SELECTION 为为 1:
- 部分平台支持。
- 这些平台架构有专用的汇编指令,比如 CLZ(Count Leading Zeros)指令,通过这些指令可以加速算法执行速度。
- 比通用方式高效。
- 有最大优先级数限制,通常限制为 32 个。
- 如果用户在 FreeRTOSConfig.h 文件中配置宏定义 configUSE_TIME_SLICING 为 1,或者没有配置此宏定义,时间片调度都是使能的。 另外,只要芯片资源允许,可以配置任意多个同优先级任务。(备注:没有定义 configUSE_TIME_SLICING,也能使用时间片调度是因为此宏定义默认已经在FreeRTOS.h 文件中使能)
- FreeRTOS 中处于运行状态的任务永远是当前能够运行的最高优先级任务。
任务优先级分配方案
对于初学者,有时候会纠结任务优先级设置为多少合适,因为任务优先级设置多少是没有标准的。对于这个问题,这里为大家推荐一个参考标准,任务优先级设置推荐方式如下图所示:
- IRQ 任务:IRQ 任务是指通过中断服务程序进行触发的任务,此类任务应该设置为所有任务里面优先级最高的。
- 高优先级后台任务:比如按键检测,触摸检测,USB 消息处理,串口消息处理等,都可以归为这一类任务。
- 低优先级的时间片调度任务:比如 emWin 的界面显示,LED 数码管的显示等不需要实时执行的都可以归为这一类任务。 实际应用中用户不必拘泥于将这些任务都设置为优先级 1 的同优先级任务,可以设置多个优先级,只需注意这类任务不需要高实时性。
- 空闲任务:空闲任务是系统任务。
- 特别注意:IRQ 任务和高优先级任务必须设置为阻塞式(调用消息等待或者延迟等函数即可),只有这样,高优先级任务才会释放 CPU 的使用权,从而低优先级任务才有机会得到执行。
- 这里的优先级分配方案是我们推荐的一种方式,实际项目也可以不采用这种方法。 调试出适合项目需求的才是最好的。
中断优先级和任务优先级的区别
- 刚开始接触 FreeRTOS 容易在这两个概念上面出现疑惑。简单的说,这两个之间没有任何关系,不管中断的优先级是多少,中断的优先级永远高于任何任务的优先级,即任务在执行的过程中,中断来了就开始执行中断服务程序。
- 另外对于STM32来说,中断优先级的数值越小,优先级越高。而FreeRTOS的任务优先级正好相反(UCOS也是数值越小优先级越高),任务优先级数值越小,任务优先级越低。
不受 FreeRTOS 管理的中断
- 讲解不受 FreeRTOS 管理的中断之前要说一个小知识点—-中断延迟。 中断延迟时间是衡量 RTOS 实时操作系统的一项重要指标,那什么又是中断延迟呢?从中断触发到执行中断服务程序的第一条指令这段时间就是中断延迟时间。
- FreeRTOS 内核源码中有多处开关全局中断的地方,这些开关全局中断会加大中断延迟时间。 比如在源码的某个地方关闭了全局中断,但是此时有外部中断触发,这个中断的服务程序就需要等到再次开启全局中断后才可以得到执行。开关中断之间的时间越长,中断延迟时间就越大,这样极其影响系统的实时性。如果这是一个紧急的中断事件,得不到及时执行的话,后果是可想而知的。
- 针对这种情况,FreeRTOS 就专门做了一种新的开关中断实现机制。 关闭中断时仅关闭受 FreeRTOS管理的中断,不受 FreeRTOS 管理的中断不关闭,这些不受管理的中断都是高优先级的中断,用户可以在这些中断里面加入需要实时响应的程序。 FreeRTOS 能够实现这种功能的奥秘就在于 FreeRTOS 开关中断使用的是寄存器 basepri,而像 uCOS 这种使用的是 primask,详情请看下面整理的表格:
对寄存器 basepri 我们举一个例子,帮助大家理解,比我们配置寄存器 basepri 的数值为 16,所有优先级数值大于等于 16 的中断都会被关闭,优先级数值小于 16 的中断不会被关闭。 对寄存器 basepri 寄存器赋值 0,那么被关闭的中断会被打开。 这个就是 FreeRTOS 开关中断的实现方案。
阅读全文
2 0
- FreeRTOS 任务优先级问题
- FreeRTOS 任务优先级问题
- FreeRTOS----任务优先级
- FreeRTOS任务优先级和中断优先级的区别
- freeRTOS 优先级设置 configMAX_SYSCALL_INTERRUPT_PRIORITY
- FreeRTOS任务相关API函数---查询/改变某个任务的优先级+获取全部/某个任务状态信息
- FreeRTOS任务切换解析
- FreeRTOS任务间通讯
- FreeRTOS任务切换解析
- FreeRTOS的任务管理
- FreeRTOS详解---任务管理
- FreeRTOS 任务通知
- HEXIWEAR---FreeRTOS之任务
- FreeRTOS---任务切换
- FreeRTOS中的任务状态
- FreeRTOS任务基础知识总结
- FreeRTOS任务创建
- FreeRTOS任务调度研究
- 第五周项目2-建立链栈算法库
- 2.2.7锁定非this对象synchronized(this)
- XZ_iOS之将图片保存到手机导致崩溃的问题
- 洛谷 P1609 最小回文数
- 如何用centos 7 搭建自己的vpn(以及自己在用的时候出现的坑)
- FreeRTOS 任务优先级问题
- Eclipse配置Tomcat和JDK方法
- Python学习笔记(二)
- 浅谈EasyUI常用控件的禁用方法
- MAC 更改mysql初始密码,亲测ok
- LoadRunner参数化详解
- 684. Redundant Connection
- mysql数据库修改字符编码
- 文章标题