[STM32][CubeMX][FreeRTOS]cubemx管理freertos中断优先级

时间:2024-04-02 15:37:21

前言

freertos:在嵌入式领域中,嵌入式实时操作系统正得到越来越广泛的应用。采用嵌入式实时操作系统(RTOS)可以更合理、更有效地利用CPU的资源,简化应用软件的设计,缩短系统开发时间,更好地保证系统的实时性和可靠性。
CubeMX为我们提供了便捷的创建freertos系统的方法,点一点鼠标就可以实现freertos系统的移植,

用CubeMX生成工程代码的时候会有个WARNING

[STM32][CubeMX][FreeRTOS]cubemx管理freertos中断优先级
提示将timebase源切换到非systick,因为freertos为实时操作系统,所以对时间的准确性要求高,确保中断能够立即得到相应,所以在使用freertos时cubemx会自动将systick强制为最低优先级,此时hal timebase用system作为时钟源的话就可能产生计数不准的情况。

freertos任务状态

阻塞态 blocked

任务可以进入阻塞态以等待以下两种不同类型的事件:

  1. 定时(时间相关)事件——这类事件可以是延迟到期或是绝对时间到点。比如说某个任务可以进入阻塞态以延迟10ms。
  2. 同步事件——源于其它任务或中断的事件。比如说,某个任务可以进入阻塞态以等待队列中有数据到来。同步事件囊括了所有板级范围内的事件类型。

任务可以在进入阻塞态以等待同步事件时指定一个等待超时时间,这样可以有效地实现阻塞状态下同时等待两种类型的事件。

我们可以利用阻塞态进行相应的延时操作提高系统的效率,原来使用for循环或者while循环进行延时,处理器进行的都是很多无用的操作。使用阻塞态进行延时时,处理器可以处理其他任务。从而提高了系统的效率。调用osDelay() 函数来代替空循环即可。
osStatus osDelay (uint32_t millisec);
任务的延时就是让任务进入阻塞状态,交出cpu的使用权

挂起状态 suspended

让一个任务进入挂起状态的唯一办法就是调用 osThreadSuspend()而把一个挂起状态的任务唤醒的途径就是调用osThreadResume() 。
The function osThreadSuspend suspends the execution of the thread identified by parameter thread_id. The thread is put into the BLOCKED state (osThreadBlocked). The thread is not executed until restarted with the function osThreadResume. Threads that are already BLOCKED are suspended and become ready after they are resumed.

就绪状态 ready

任务处于非运行状态,但既没有阻塞也没有挂起,则这个任务处于就绪(ready,准备或就绪)状态。处于就绪态的任务能够被运行,但是没有运行。当前状态的任务已经具有了所有可执行的条件,只等待处理器将他进行调度。

FreeRTOS中断优先级

为了更方便管理中断优先级,ST官方建议并且默认使用第5分组:NVIC_PriorityGroup_4,其优先级寄存器为8位寄存器,CM3只使用了高4位,构成0~15共16个优先级,在CubeMX的配置中也可看到
[STM32][CubeMX][FreeRTOS]cubemx管理freertos中断优先级[STM32][CubeMX][FreeRTOS]cubemx管理freertos中断优先级
而FreeRTOS系统创建的每个任务都由自己的中断优先级
[STM32][CubeMX][FreeRTOS]cubemx管理freertos中断优先级

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