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

前言

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

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

在这里插入图片描述
提示将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的配置中也可看到
在这里插入图片描述在这里插入图片描述
而FreeRTOS系统创建的每个任务都由自己的中断优先级
在这里插入图片描述

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

### STM32CubeMX FreeRTOS 中断配置教程 #### 配置FreeRTOS支持 为了使STM32项目能够利用FreeRTOS操作系统来管理任务并优化中断响应,在STM32CubeMX环境中初始化新工程时,需勾选中间件选项下的FreeRTOS组件[^1]。 #### 创建硬件定时器用于时间基准 对于基于ARM Cortex-M系列MCU的开发板而言,通常会设置SysTick作为RTOS的时间片分配机制;然而也可以选用其他类型的计数器比如TIMx外设来充当HAL层所需的基础时钟源。当选择后者时,则涉及到额外添加`stm32f4xx_hal_timebase_tim.c`这样的特定实现文件[^3]。 #### 调整FreeRTOS参数设定 编辑`FreeRTOSConfig.h`头文件中的宏定义可以定制化内核行为特性,例如最大优先级数量、堆栈大小等重要属性。这些自定义化的调整有助于确保应用程序能够在资源受限环境下稳定运行的同时保持高效的性能表现。 #### 实现延迟执行逻辑转换至后台线程 为了让ISR(Interrupt Service Routine)尽可能简洁高效,推荐做法是在其中仅完成必要的状态记录工作,并借助队列(queue)或信号量(semaphore)通知处于等待态的工作单元去进一步处理后续流程。这样做的好处是可以减少打断正常业务操作所带来的负面影响,同时也便于维护代码结构清晰度[^2]。 ```c // 假定已声明了一个二值型同步对象 SemaphoreHandle_t xBinarySemaphore; void EXTI1_IRQHandler(void){ BaseType_t xHigherPriorityTaskWoken; // 清除外部中断标志位 __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1); // 发送事件给目标任务, 如果该任务因此获得更高优先权则唤醒它 xSemaphoreGiveFromISR(xBinarySemaphore,&xHigherPriorityTaskWoken); portYIELD_FROM_ISR(xHigherPriorityTaskWoken); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值