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