找回密码
 立即注册
楼主: 采果农

STC32G的2组CAN模块的缓冲区读写不够快,后续CAN-FD新品建议优化提升

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-04-17 09:50:59

17

主题

91

回帖

755

积分

高级会员

积分
755
发表于 2024-4-25 11:24:22 | 显示全部楼层
采*** 发表于 2024-4-25 10:57
等你做CAN发送就知道了,怎么把总线资源榨干,一个拓展帧是284us加上间隔6.2us,500K总线,满载情况下每 ...

我做过 串口转发,同样有这个问题,但是串口我可以自己指定两块缓存交替使用,所以我理解你的意识
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-01-01 20:46:17

2

主题

29

回帖

214

积分

中级会员

积分
214
发表于 2024-4-25 11:28:24 | 显示全部楼层
zxcv*** 发表于 2024-4-25 11:13
你这个WRITE_CAN是用的宏定义还是用的函数调用?


.h里的宏定义

截图202404251127557814.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2024-4-26 04:14:47 | 显示全部楼层
神*** 发表于 2024-4-24 12:47
大家帮忙下楼主

XFR 全部移到 edata 没用,  问题依然存在.

捕获.JPG


解决方案1:
将 CAN 两个 寄存器地址, 从 XFR 移到 SFR, CAN模块不用修改, 提速 N倍, 完美解决.


解决方案2:
修改CAN模块, 取消 CAN 两个 寄存器地址, 将 CAN有关寄存器, 以STC一惯风格(摆地摊方式), 全部放在 XFR 中, 可提速 2-3倍(使用字读写, 可提速3-5倍), 也能解决问题.

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2024-4-26 04:31:34 | 显示全部楼层
捕获.JPG


CAN 接受缓冲区有 64字节, 我估计 CAN 发送缓冲区也有 64字节,  
建议楼主做一下简单测试,

在 CAN 发送期间, 继续 写入 CAN 发送缓冲区数据, 当作双缓冲区(同一地址) 使用.

不知行不行, 如行, 楼主的问题就不复存在了

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2024-4-26 07:09:28 | 显示全部楼层
楼主顶楼说:
在发送完一帧数据后进入发送完成中断,我们没办法直接启动下次发送,必须将新数据写入BUFFER后再启动发送。

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

在 CAN 发送期间, 继续 写入 CAN 发送缓冲区数据(12字节), 当作双缓冲区(同一地址) 使用. 余下 4字节(含填充0), 等发送完一帧数据后进入发送完成中断,
再续续写入余下 4字节(含填充0), 启动发送, ....反复循环上述过程.

如下一帧不丢数据(发送 13字节), 则此方法可行, 可继续改为 写入 CAN 发送缓冲区数据(13-15字节), 当作双缓冲区(同一地址) 使用. 余下 3-1字节(填充0), 等发送完一帧数据后进入发送完成中断,再续续写入, 启动发送,  分别测试验证.  以寻找最佳方案.

如下一帧丢数据(仅发送最后 1字节), 则此方法行不通, 彻底没戏了.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-01-01 20:46:17

2

主题

29

回帖

214

积分

中级会员

积分
214
发表于 2024-4-26 08:13:50 | 显示全部楼层
LAO*** 发表于 2024-4-26 04:14
XFR 全部移到 edata 没用,  问题依然存在.

XFR,SFR,这两个速度问题我不懂

CAN模块这两个寄存器问题,是因为CAN是外挂模块,相当于CAN是另一个芯片集成到单片机的,只能通过间接寻址访问
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-01-01 20:46:17

2

主题

29

回帖

214

积分

中级会员

积分
214
发表于 2024-4-26 08:14:20 | 显示全部楼层
LAO*** 发表于 2024-4-26 04:31
CAN 接受缓冲区有 64字节, 我估计 CAN 发送缓冲区也有 64字节,  
建议楼主做一下简单测试,

发送缓冲区只有16字节,而不是64字节
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-01-01 20:46:17

2

主题

29

回帖

214

积分

中级会员

积分
214
发表于 2024-4-26 08:16:45 | 显示全部楼层
LAO*** 发表于 2024-4-26 07:09
楼主顶楼说:
在发送完一帧数据后进入发送完成中断,我们没办法直接启动下次发送,必须将新数据写入BUFFER后 ...

这个方法不行的,缓存区有写保护的,没发送完不能写缓存区

目前减少写入BUF时间的办法就只有用代码量换取时间,
写buf的时候不进行任何判断循环,直接堆代码,提高运行效率。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2024-4-26 08:38:36 | 显示全部楼层
你那 TxBuffer[ ] 数组, 是放在 xram 中 , 还是 edata中 ?

放在 edata中 , 速度最快.  放在 xdata中, 速度其次, 放在 far中, 速度最慢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2024-4-26 09:07:33 | 显示全部楼层
本帖最后由 LAOXU 于 2024-4-26 09:08 编辑

要我帮你汇编优化一下吗?

TxBuffer[ ] 数组 放在  edata中,

如需要, 请将 发送中断函数 单独存个 c文件, 将此文件打开 src , 再和项目一起编译,

编译成功 请将此 发送中断函数 (src 文件) 上传, 我用汇编优化后给你, 估计可减少 十几条指令的执行时间.
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 00:32 , Processed in 0.127841 second(s), 112 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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