FreeRTOS系统-二值信号量的使用

本文详细介绍了在FreeRTOS系统中如何使用二值信号量,以解决中断延迟导致的问题。通过二值信号量实现任务与中断间的同步,提升系统效率。在中断服务函数中使用xSemaphoreGiveFromISR释放信号量,而在任务中使用xSemaphoreTake获取,确保系统流畅运行。
摘要由CSDN通过智能技术生成

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
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值