FreeRTOS系统-二值信号量的使用
日期 | 作者 | 版本 | 说明 |
---|---|---|---|
2020.12.26 | Hxj | V1.0 | 完成主体 |
2021.01.08 | Hxj | V1.1 | 加入了串口中断使用二值信号量 |
提示:以下文章基于FreeRTOS全部移植完成,能够正常运行.
文章目录
前言
FreeRTOS系统的引入可以极大的提高程序的运行效率,搭建的框架也提高了程序的易写性,提高编程效率.
在使用FreeRTOS系统的过程中,笔者发现GPIO触发外部中断,在中断服务函数中做一个Delay_ms(20)的延时消抖时,会导致FreeRTOS系统停止工作,这样会导致系统效率降低更严重的情况会导致一些需要实时性的功能断层.
一、FreeRTOS系统的中断管理?
configLIBRARY_LOWEST_INTERRUPT_PRIORITY]
这个宏是可以定义的中断最低优先级,由于STM32中断管理只用了4位来分配抢占优先级和子优先级,并且FreeRTOS使用优先级分组4(没有子优先级),所以该宏设为15
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
这个宏是系统可管理的最高中断优先级,即为一个阈值,低于该值的可以调用一些fromISR的函数。高于该优先级的中断则不响应打开和关断中断(一直都可以进行中断操作)。
configKERNEL_INTERRUPT_PRIORITY
这个宏定义是( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
,实质上就是把15左移4位当作真正的优先级。(因为第四位保留了)
configMAX_SYSCALL_INTERRUPT_PRIORITY
相当于( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
,原因与configKERNEL_INTERRUPT_PRIORITY
相同。
经过对上面configLIBRARY_LOWEST_INTERRUPT_PRIORITY]
与configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
的宏定义便确定了在这个优先级范围内能够调用FreeRTOS系统的API了。
这个优先级范围的确定,接下来我们在外部中断的优先级定义就必须在此范围内,否则FreeRTOS的API的调用在中断服务函数中卡死。
二、二值信号量
1.二值信号量介绍
二值型信号量可以理解为任务与中断间或者两个任务间的标志,该标志非“满”即“空”。Give操作相当把该标志置“满”,Take操作相关与把该标志取"空",经过send和receive操作实现任务与中断间或者两任务的操作同步。
需要用到的头文件
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
创建信号量
函数 | 描述 |
---|---|
xSemaphoreCreateBinary() | 动态创建二值信号量 |
vSemaphoreCreateBinaryStatic() | 静态创建二值信号量 |
使用(示例):
SemaphoreHandle_t Semaphore_Exit1 = NULL;//声明变量 用来接收创建二值信号量的句柄
Semaphore_Exit1 = xSemaphoreCreateBinary();//创建外部中断1 二值信号量
释放信号量
函数 | 描述 |
---|---|
xSemaphoreGive() | 任务级释放二值信号量 |
xSemaphoreGiveFromISR() | 中断中释放二值信号量 |
以上两个释放二值信号量的函数,需用户根据自己的使用环境进行选择。在中断服务函数中一定选择 xSemaphoreGiveFromISR()
使用(示例):
//在外部1中释放Semaphore_Exi