xsemaphoretake返回_FreeRTOS例程3-串口中断接收不定长的数据与二值信号量的使用

本文介绍了如何利用STM32的串口中断接收不定长数据,并结合FreeRTOS的二值信号量实现数据接收与处理任务的同步。通过串口接收中断实时接收数据,空闲中断触发后释放信号量,使得数据分析处理任务能够获取到数据。详细阐述了二值信号量的使用、串口中断配置以及中断服务函数中的信号量释放。
摘要由CSDN通过智能技术生成

1 基础知识点

1.1 串口中断种类

串口中断属于STM32本身的资源,不涉及到FreeRTOS,但可与FreeRTOS配合使用。

串口接收中断

中断标志为:USART_IT_RXNE,即rx none empty,串口只要接收到数据就触发中断,如果是接收一个字符串,则每接收到一个字符就触发一次中断。

串口空闲中断

中断标志为:USART_IT_IDLE,idle即空闲的意思,串口空闲时触发的中断,当然也不是说串口空闲时就一直触发中断,而实在每个连续的接收完成后,触发中断,如果是接收一个字符串,则接收完整个字符串后,触发一次中断。

所以,这两个中断可以配合使用,串口接收中断实时接收数据,接受完一串数据后,空闲中断被触发,就可以对接收的一串数据分析处理了。这种方式不需要知道每次字符串的具体长度,因而可以接收不定长的串口数据。

1.2 信号量

FreeRTOS中的信号量是一种任务间通信的方式,信号量包括:二值信号量、互斥信号量、计数信号量,本次只使用二值信号量。

二值信号量

二值信号量只有两种状态,可以先通俗的理解为它就是个标志,0或1。信号量用于任务间的同步,FreeRTOS是多任务系统,不同任务间可能需要某种同步关系,如串口中断接收完数据后,数据分析处理任务才能拿到数据进行分析,这就是一种同步。

信号量的基本操作有获取信号量和释放信号量,例如:数据分析处理任务需要处理串口数据时,可先尝试获取信号量,若获取不到,也就是信号量是0,则先进入阻塞等待,等待超时可先跳出,之后继续尝试获取信号量。串口空闲中断接受完一串数据后,可执行释放信号量操作,这时,数据分析处理任务就可以获取到信号量,进而可以处理串口数据了,实现了串口数据接收与数据处理的同步。

接下来的程序思路如下:

1.3 API函数

创建二值信号量xSemaphoreCreateBinary()

函数原型(tasks.c中):

SemaphoreHandle_t xSemaphoreCreateBinary( void )

返回值:SemaphoreHandle_t:创建成功的二值信号量句柄,失败返回NULL

释放信号量xSemaphoreGive()

函数原型(tasks.c中):

BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore )

参数:xSemaphore:要释放的信号量句柄

返回值:释放成功返回pdPASS,失败返回errQUEUE_FULL

释放信号量(中断函数中)xSemaphoreGiveFromISR()

BaseType_t xSemaphoreGiveFromISR( SemaphoreHandle_t xSemaphore,

BaseType_t* pxHigherPriorityTaskWoken)

参数:xSemaphore:同上

pxHigherPriorityTaskWoken:标记退出此函数后是否需要进行任务切换

返回值:同上

获取信号量xSemaphoreTake()

函数原型(tas

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值