LAOXU
发表于 2024-4-24 06:40:23
神农鼎 发表于 2024-4-23 23:16
明请乘风帮用 42MHz, 汇编实际跑下,
能否解决你这个500K双CAN的速度问题。
最近在做一个项目,基本功能就是把CAN2接收到的帧通过CAN1发送出去,中间做点转换。
-----------------------------------------------------------------------------------------------------------------
没用的,单纯把 CAN2接收到的帧 写入 CAN1 发送缓冲区, 用不了多少时间,
30MHz下, C(1-2us), asm(<1us),
关健点是 用户 中间做点转换. 这个时间可能比较长超差.
LAOXU
发表于 2024-4-24 06:50:28
我不知楼主的转换程序格式, 估计是这样写的,
CAN2接收中断 --> CAN2接收到的帧 --> 读入+转换 --> 写入 CAN1 发送缓冲区,
这个程序执行时间估计超时.
建议换种格式:
1. CAN2接收到中断 --> CAN2接收到的帧 --> 读入+转换 --> 写入 buff 缓冲区
2. CAN1发送完中断 --> buff 缓冲区 ---> CAN1发送帧 --> 启动发送
这样, 哪怕用 11.0592MHz , 时间估计也足够不会超差.
LAOXU
发表于 2024-4-24 07:03:20
4组串口UART使用DMA收发 @STC32G,易用,高效,稳定 !精品实战代码
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=5211
(出处: 国芯论坛-STC全球32位8051爱好者互助交流社区)
这个贴子里面的争论, 建议楼主思考一下.
采果农
发表于 2024-4-24 08:42:41
LAOXU 发表于 2024-4-24 07:03
4组串口UART使用DMA收发 @STC32G,易用,高效,稳定 !精品实战代码
https://www.stcaimcu.com/forum.php?mod ...
你这是串口,不一样的东西
采果农
发表于 2024-4-24 08:54:05
LAOXU 发表于 2024-4-24 06:50
我不知楼主的转换程序格式, 估计是这样写的,
CAN2接收中断 --> CAN2接收到的帧 --> 读入+转换 --> 写入 CA ...
我这个说的问题不是软件层面的问题哦,你可能没有仔细看。
平时串口是一个字节一个字节发送,发送中断来的时候直接写一个字节就行,而且写这个字节是直接寻址的,这个时候速度快。这个可能1us内就能执行完成
CAN这个不一样,CAN这个发送中断来了以后,要往BUF写16个字节,而且还是间接写入寄存器,写入一个字节的时间翻倍,再加上中间需要判断buf3,运行时间就拉长了。这个在我的程序中和执行了16us。
就算使用汇编节省50%的时间也要8us,还是跟不上接受的速度
你看看16楼的比喻就懂了,,,,而且我目前这个程序没有转换操作,就是有转换操作也不会在中断里执行,中断里现在就是写发送FIFO的时间
LAOXU
发表于 2024-4-24 09:46:21
STC32 间接写不慢(不是 51), 而且可以字操作读写(比字节操作快 1倍).
若是可以的话, 请把核心 CAN2-->CAN1 读写程序, 打包个函数(能成功编译) 发上来.
一起帮忙看看, 能否进一步优化,我估计 30MHz的主频,3us以内的时间足够.
LAOXU
发表于 2024-4-24 09:58:54
另外, BUFF缓冲区是否放在片内 EDATA ?如放在片外 XDATA 中, 速度要慢此.
我想起来了, 以前我也犯过此错误, 片内 MCU 扩展 RAM 数据总线时钟控制寄存器(CKCON)
是否开机时设置为 0 ?上电复位值为 7(指令执行时间慢 7倍) , 如没设置, 则执行 时间 16MS 也正常.
请检查一下.
采果农
发表于 2024-4-24 10:11:45
LAOXU 发表于 2024-4-24 09:58
另外, BUFF缓冲区是否放在片内 EDATA ?如放在片外 XDATA 中, 速度要慢此.
我想起来了, 以前我也犯过此错 ...
等你们乘风做完实验再说吧
zxcv1973
发表于 2024-4-24 11:41:58
LAOXU 发表于 2024-4-24 09:46
STC32 间接写不慢(不是 51), 而且可以字操作读写(比字节操作快 1倍).
若是可以的话, 请把核心 CAN2-->CAN1...
XFR寄存器不支持字操作,并且CAN模块操作效率确实很低,这种外挂模块连地址自动增1都不支持
zxcv1973
发表于 2024-4-24 11:47:50
想效率高,就不能用官方提供的例程