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