
现在想用SPI接收固定长度数据。STM32F103单片机,中断检测到PC6引脚电平变低,表示准备接收数据,开启SPI的DMA中断接收函数。 担心数据处理的太慢,想尝试下双缓冲或环形缓冲。 有以下问题想求教: 1.双缓冲和环形缓冲各有什么优劣? 2.双缓冲的话,想这样实现,设置两个缓冲数组,再设置个标志位,在PC6中断完成的回掉函数里,根据标志位来开启DMA接收中断函数,轮流放到两个数组里。 数据处理的话,如何处理?如何知道哪个数组刚接收完数据需要处理? 3.环形缓冲的话,像这样实现,因为接收的是固定长度的数据,那么缓冲数组就设为接收长度的整数倍,在DMA的接收完成回掉函数里处理缓冲区的首尾指针。这样做行不行?感觉HAL库的中断处理的各种判断太多,会影响接收的效率吧? 4.如果接收的是不定长数据,SPI想用DMA方式接收的话,又该怎么做呢? |
类似的RTOS的消息队列就是这样做的,FIFO模式,LIFO模式,想怎样处理数据都行。
正在用FREERTOS,看教程,消息队列的发送函数,常用的有2个,xQueueSend()和xQueueSendFromISR(),第一个用在任务里,第二个用在中断里。如果我DMA的中断完成回掉函数里发送消息队列的话,应该用哪个函数呢?
------------------------------------------------------------------------------------------
额,HAL库,已经把这两个函数再封装了,封装进osMessageGet()函数里,该函数内根据inHandlerMode()函数来判断是否在中断状态,进而调用上述两个函数中的一个。
那么,在回掉函数里处理的话,是不是就调用的是xQueueSend()函数了?
Q:如果我DMA的中断完成回掉函数里发送消息队列的话,应该用哪个函数呢?
A:xQueueSendFromISR()