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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版