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。