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

STM32F103移植FreeRTOS必须搞明白的系列知识---1(Cortex-CM3中断优先级)

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

STM32F103移植FreeRTOS必须搞明白的系列知识---3(堆栈)

STM32F103移植FreeRTOS必须搞明白的系列知识---4(FreeRTOSConfig.h配置文件)
 

目录

一、 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个中断源(例如:18个中断源),怎么办呢?

                可以将多个中断源定义到同一种中断类型上,例如:可以将USART1、USART2、SPI2的抢占优先级都定义为12,这样就可以实现支持无数个中断源啦,满足工程需要。

          4、不同种类型的中断之间可以实现中断嵌套,相同种类型的中断之间不允许中断嵌套。

          例如:USART1、USART2、SPI2的抢占优先级都分定义为12(它们属于相同种类的中断,它们之间不允许中断嵌套),IIC的抢占优先级定义为10(IIC和USART1属于不同种类的中断,它们之间允许中断嵌套,IIC可以抢占USART1)。

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

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

                       

二、 FreeRTOS任务优先级

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

        FreeRTOS 任务最大优先级是通过 FreeRTOSConfig.h 文件configMAX_PRIORITIES 宏确定。

        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。

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
移植FreeRTOSSTM32F103上需要以下步骤: 1. 下载FreeRTOS的源代码 2. 在STM32F103上创建一个工程 3. 将FreeRTOS的源代码添加到工程中 4. 配置FreeRTOS的内核参数 5. 添加RTOS相关的头文件和源文件 6. 配置STM32F103的硬件参数 7. 编写应用程序 接下来,我将逐步介绍每个步骤。 1. 下载FreeRTOS的源代码 您可以从FreeRTOS官方网站(https://www.freertos.org/)下载最新版本的源代码。 2. 在STM32F103上创建一个工程 在您的编译器中创建一个新的工程,并选择适当的芯片(STM32F103),以便编译器可以正确地设置和编译程序。 3. 将FreeRTOS的源代码添加到工程中 将FreeRTOS的源代码添加到您的工程中。您可以使用FreeRTOS提供的完整源代码,也可以只使用与您的应用程序相关的部分。 4. 配置FreeRTOS的内核参数 在您的应用程序中,您需要配置FreeRTOS的内核参数,例如任务优先级和堆栈大小等。 5. 添加RTOS相关的头文件和源文件 将FreeRTOS相关的头文件和源文件添加到您的应用程序中,以便您可以使用FreeRTOS的API函数。 6. 配置STM32F103的硬件参数 在您的应用程序中,您需要配置STM32F103的硬件参数,例如时钟和外设等。您可以使用STM32F103的手册来获得有关如何配置硬件的更多信息。 7. 编写应用程序 在您的应用程序中,您需要创建和管理FreeRTOS任务,并使用FreeRTOS API函数来实现任务间的通信和同步。 以上是移植FreeRTOSSTM32F103的基本步骤。移植FreeRTOS需要一定的编程经验和对STM32F103硬件的了解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值