你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

HAL库如何设置DMA双缓冲及环形缓冲?

[复制链接]
any012 提问时间:2017-5-5 09:52 /
悬赏50ST金币已解决
现在想用SPI接收固定长度数据。STM32F103单片机,中断检测到PC6引脚电平变低,表示准备接收数据,开启SPI的DMA中断接收函数。

担心数据处理的太慢,想尝试下双缓冲或环形缓冲。
有以下问题想求教:

1.双缓冲和环形缓冲各有什么优劣?

2.双缓冲的话,想这样实现,设置两个缓冲数组,再设置个标志位,在PC6中断完成的回掉函数里,根据标志位来开启DMA接收中断函数,轮流放到两个数组里。
数据处理的话,如何处理?如何知道哪个数组刚接收完数据需要处理?

3.环形缓冲的话,像这样实现,因为接收的是固定长度的数据,那么缓冲数组就设为接收长度的整数倍,在DMA的接收完成回掉函数里处理缓冲区的首尾指针。这样做行不行?感觉HAL库的中断处理的各种判断太多,会影响接收的效率吧?

4.如果接收的是不定长数据,SPI想用DMA方式接收的话,又该怎么做呢?

最佳答案

查看完整内容

如果是定长数据可以直接整个二维数组,一边存数据一边解析数据。 类似的RTOS的消息队列就是这样做的,FIFO模式,LIFO模式,想怎样处理数据都行。
收藏 1 评论3 发布时间:2017-5-5 09:52

举报

3个回答
creep 回答时间:2017-5-5 09:52:10
如果是定长数据可以直接整个二维数组,一边存数据一边解析数据。
类似的RTOS的消息队列就是这样做的,FIFO模式,LIFO模式,想怎样处理数据都行。
any012 回答时间:2017-5-5 15:42:58
本帖最后由 any012 于 2017-5-5 16:16 编辑
creep 发表于 2017-5-5 10:35
如果是定长数据可以直接整个二维数组,一边存数据一边解析数据。
类似的RTOS的消息队列就是这样做的,FIFO ...

正在用FREERTOS,看教程,消息队列的发送函数,常用的有2个,xQueueSend()和xQueueSendFromISR(),第一个用在任务里,第二个用在中断里。如果我DMA的中断完成回掉函数里发送消息队列的话,应该用哪个函数呢?

------------------------------------------------------------------------------------------

额,HAL库,已经把这两个函数再封装了,封装进osMessageGet()函数里,该函数内根据inHandlerMode()函数来判断是否在中断状态,进而调用上述两个函数中的一个。
那么,在回掉函数里处理的话,是不是就调用的是xQueueSend()函数了?


奏奏奏 回答时间:2017-5-5 17:04:19
any012 发表于 2017-5-5 15:42
正在用FREERTOS,看教程,消息队列的发送函数,常用的有2个,xQueueSend()和xQueueSendFromISR(),第一个 ...

Q:如果我DMA的中断完成回掉函数里发送消息队列的话,应该用哪个函数呢?
A:xQueueSendFromISR()

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版