硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1458|回复: 12
收起左侧

[技术讨论] 串口FIFO+DMA

[复制链接]

11

主题

50

回帖

83

积分

初级会员

积分
83
QQ
发表于 2024-10-23 16:51:14 | 显示全部楼层 |阅读模式
现在有个需求,一直在稳定的使用串口FIFO。很方便,也很稳定。
但是现在有个串口外设的波特率很低,传输一次数据就要15ms,影响了整个控制的频率,这是就像如果在FIFO的基础上增加DMA就好了。
现在在做这个尝试,有什么建议吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117517
QQ
发表于 2024-10-24 11:41:21 | 显示全部楼层
1、15ms传输一次也没关系,串口FIFO的CPU利用率很低,波特率低的话,应该1% CPU利用率都不到。
2、串口DMA的话,一般用法都是再配合空闲中断。比如此贴这个


基于V6的CMSIS-Driver串口应用,支持8串口DMA不定长收发,比CubeMX还要省事
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=93714

回复

使用道具 举报

11

主题

50

回帖

83

积分

初级会员

积分
83
QQ
 楼主| 发表于 2024-10-24 18:39:14 | 显示全部楼层
eric2013 发表于 2024-10-24 11:41
1、15ms传输一次也没关系,串口FIFO的CPU利用率很低,波特率低的话,应该1% CPU利用率都不到。
2、串口DMA ...

嗯,我原先理解有误,现在才理解,其实采用DMA节省的时间仅仅是中断中操作寄存器的时间,以及将发送数据转移到FIFO发送缓冲区的时间,这个时间其实没啥太大影响。
原来理解的是串口在这个波特率下数据传输时间也算在cpu时间上了,其实cpu仅仅是操作寄存器的时间,剩下的是靠串口芯片根据波特率处理。
谢谢
回复

使用道具 举报

3

主题

85

回帖

94

积分

初级会员

积分
94
发表于 2024-10-24 23:48:54 | 显示全部楼层
可以试试 乒乓dma搭配fifo
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117517
QQ
发表于 2024-10-25 09:33:29 | 显示全部楼层
wgco98 发表于 2024-10-24 18:39
嗯,我原先理解有误,现在才理解,其实采用DMA节省的时间仅仅是中断中操作寄存器的时间,以及将发送数据 ...

对,是这样的。
回复

使用道具 举报

11

主题

50

回帖

83

积分

初级会员

积分
83
QQ
 楼主| 发表于 2024-10-25 09:54:42 | 显示全部楼层
gjeoi 发表于 2024-10-24 23:48
可以试试 乒乓dma搭配fifo

我了解下其思想。不过现在感觉FIFO完全足够用,因为目前还不是大数据量的传输,对于cpu操作寄存器的时间还可以接受。之前的ADC采集系统则必须采用DMA。
对于目前的系统更侧重通用性和灵活性,就是单字节数据处理,这时DMA其实相对没有太大优势,不定长数据的收发等。觉得FIFO非常合适。
回复

使用道具 举报

7

主题

158

回帖

179

积分

初级会员

积分
179
发表于 2024-10-25 17:38:33 | 显示全部楼层
FIFO 就是DMA 意思,如果非要选的话我情愿用带FIFO的外设 也比DMA方便。DMA还要你自己管理配置。FIFO 就是只读只写当成缓存一样用
回复

使用道具 举报

11

主题

50

回帖

83

积分

初级会员

积分
83
QQ
 楼主| 发表于 2024-10-28 11:06:52 | 显示全部楼层

现有有个问题就是关于CAN的,是否也可以用这个FIFO技术方法,因为我现在有个实际问题就是,系统中有12个电机,我发送同步帧后,12个电机的配置的参数都会发送,这时MCU就会在CAN中断接收数据,占用很长时间,因为我也在CAN中断中解析了数据,这也是常规的做法。但是为啥不常见像串口+FIFO一样,CAN中断里也仅仅存储数据到FIFO中,在main函数进行解析即可。我也在像怎么实现,发现好像不像串口那么实现
回复

使用道具 举报

3

主题

85

回帖

94

积分

初级会员

积分
94
发表于 2024-10-28 11:17:56 | 显示全部楼层
不要在中断解析数据,中断程序的处理时间越短越好
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117517
QQ
发表于 2024-10-28 11:18:39 | 显示全部楼层
wgco98 发表于 2024-10-28 11:06
现有有个问题就是关于CAN的,是否也可以用这个FIFO技术方法,因为我现在有个实际问题就是,系统中有12 ...

也可以的,完全没问题。

不过像CANFD,他有比较大的硬件接收FIFO和buffer可以缓存数据。
回复

使用道具 举报

11

主题

50

回帖

83

积分

初级会员

积分
83
QQ
 楼主| 发表于 2024-10-28 14:27:49 | 显示全部楼层
eric2013 发表于 2024-10-28 11:18
也可以的,完全没问题。

不过像CANFD,他有比较大的硬件接收FIFO和buffer可以缓存数据。

我想问下,为啥您之前的例程中关于bsp_CAN的操作,没有采用FIFO的方式,是怎么考虑的,有什么理由吗
回复

使用道具 举报

11

主题

50

回帖

83

积分

初级会员

积分
83
QQ
 楼主| 发表于 2024-10-28 14:29:22 | 显示全部楼层
gjeoi 发表于 2024-10-28 11:17
不要在中断解析数据,中断程序的处理时间越短越好

嗯,但是,如果不处理解析数据,就要使用FIFO才行,现在意识到这,是因为,现在发现这个过程决然耗时3ms左右的时间,对于控制系统还是挺长的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117517
QQ
发表于 2024-10-29 09:37:27 | 显示全部楼层
wgco98 发表于 2024-10-28 14:27
我想问下,为啥您之前的例程中关于bsp_CAN的操作,没有采用FIFO的方式,是怎么考虑的,有什么理由吗

因为内置的硬件FIFO和BUFFER已经不小了,足够用。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 09:32 , Processed in 0.044676 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表