FreeRTOS基础知识三

63 阅读2分钟

1. FreeRTOS任务挂起与恢复

1.1 任务的挂起与恢复的API函数

  • 挂起任务

      挂起任务类似暂停,可恢复;删除任务,无法恢复
      vTaskSuspend(),使用时需要将宏 INCLUDE_vTaskSupend 配置为1.
      无论优先级如何,被挂起的任务都将不会再被执行,直到任务被恢复。
      当函数传入的参数为NULL,则代表挂起任务自身(当前正在运行的任务)。
    
  • 恢复挂起的任务

      恢复被挂起的任务
      vTaskResume(),宏 INCLUDE_vTaskSuspend 必须定义为1.任务无论被vTaskSuspend()挂起多少次,
      只需在任务中调用vTaskResume()恢复一次,就可以继续运行。且被恢复的任务会进入就绪态。
    
  • 在中断中恢复被挂起的任务

      xTaskResumeFROMISR(),带FromISR是在中断函数中专用的API函数。
      宏 INCLUDE_vTaskSuspend 和 INCLUDE_xTaskResumeFromlSR 必须定义为1,用于解挂被挂起任务
    

image.png

中断服务程序中要调用freeRTOS的API函数则中断优先级不能高于FreeRTOS所管理的最高优先级

2. FreeRTOS中断管理

2.1 中断

让CPU打断正常程序的运行,转而紧急处理的事件(程序),就叫中断。

image.png

2.2 中断优先级分组设置

ARM Cortex-M使用了8位宽的寄存器来配置中断的优先等级,这个寄存器就是中断优先级配置寄存器

但STM32,只用了中断优先级配置寄存器的高4位[7∶4],所以STM32提供了最大16级的中断优先等级

image.png STM32的中断优先级可以分为抢占优先级和子优先级:

  • 抢占优先级: 抢占优先级高的中断可以打断正在执行但抢占优先级低的中断
  • 子优先级: 当同时发生具有相同抢占优先级的两个中断时,子优先级数值小的优先执行

2.2.1 5种优先级分组分配方式

调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)

image.png

2.2.2 特点

  1. 中断优先级数值越小越优先!!任务优先级数值越大越优先
  2. 将所有优先级位指定为抢占优先级可以方便FreeRTOS管理
  3. 低于configMAX_SYSCALL_INTERRUPT_PRIORITY优先级的中断里才允许调用FreeRTOS的API函数

2.3 中断相关寄存器

三个系统中断优先级配置寄存器,分别为SHPR1、SHPR2、SHPR3。

     通过SHPR3将PendSV和SysTick的中断优先级设置为最低优先级,保证系统任务切换不会阻塞系统其他中断的响应

三个中断屏蔽寄存器,分别为PRIMASK、FAULTMASK和BASEPRI

    FreeRTOS所使用的中断管理就是利用BASEPRI这个寄存器。
    BASEPRI:屏蔽优先级低于某一个阈值的中断,当设置为0时,则不关闭任何中断