0%

freeRTOS中断和信号量以及任务管理

freeRTOS中断和信号量

使用freeRTOS中断与使用正常的中断区别不大(不使用FreeRTOS自带的API),直接使用系统给的中断函数即可

  • 手动启动这两个

  • image-20211220221301553

  • 注意,使用EXTI的时候(外部中断),需要自己手动定义中断处理函数

    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {

    }

    系统没有给出这个函数的定义,可以自己在任意文件中定义

  • 设置的优先级比系统(RTOS)的话,中断处理函数就不会被系统打断执行

  • 注意,在中断函数中调用FreeRTOS的API的时候,需要采用Fron_ISR的API。FreeRTOS对于一些系统API函数提供两种版本,一种是供任务调用的,一种是供中断调用的(Interrupt Safe API)。由中断调用的API函数后缀上会有“FromISR”。

信号量

  • 简单而言就是一个进程通过一个信号变量指示另一个线程是阻塞还是运行,详见https://zhuanlan.zhihu.com/p/139469342

  • 有两种调用方式,一种是使用CMSIS_OS中的osSemaphoreId osSemaphoreCreate (const osSemaphoreDef_t *semaphore_def, int32_t count);int32_t osSemaphoreWait (osSemaphoreId semaphore_id, uint32_t millisec);osStatus osSemaphoreRelease (osSemaphoreId semaphore_id);函数

  • 或者是手动#include "semphr.h",然后使用知乎网页上的SemaphoreHandle_t xSemaphoreCreateBinary( void )BaseType_t xSemaphoreTake( SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait )BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );以及中断函数中的BaseType_t xSemaphoreGiveFromISR( SemaphoreHandle_t xSemaphore, BaseType_t *pxHigherPriorityTaskWoken )

  • 注意,xSemaphoreGiveFromISR函数的第二个参数是可选的,不需要的时候可以给NULL,具体作用详见https://blog.csdn.net/weixin_45045399/article/details/103238514

  • xTicksToWait 如果信号量不可用的话任务处于阻塞状态的最长时间,设置为 portMAX_DELAY的话任务会一直处于阻塞状态直到信号量可用,设置为0的话如果信号量不可用的话会直接返回

  • 假如准备在对应的中断中调用系统的API的话,注意勾选这个选项并且调整相应的中断优先级否则会卡死

  • image-20211220234334003

  • 经过测试,虽然osSemaphoreId与FreeRTOS原生的API要求的SemaphoreHandle_t不同,但是两种API都可以运行,直接替换即可。

优先级倒置

参考知乎文章https://zhuanlan.zhihu.com/p/139469342

互斥量

同上

关键区

同上