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

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

[复制链接]

该用户从未签到

10

主题

39

回帖

380

积分

中级会员

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

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

使用道具 举报

  • TA的每日心情
    开心
    20 小时前
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    1

    主题

    26

    回帖

    187

    积分

    注册会员

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


    .h里的宏定义

    截图202404251127557814.jpg
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 03:18
  • 签到天数: 137 天

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3990

    积分

    荣誉版主

    积分
    3990
    发表于 2024-4-26 04:14:47 | 显示全部楼层

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

    捕获.JPG


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


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

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 03:18
  • 签到天数: 137 天

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3990

    积分

    荣誉版主

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


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

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

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

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 03:18
  • 签到天数: 137 天

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3990

    积分

    荣誉版主

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

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

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

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

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

    使用道具 举报

  • TA的每日心情
    开心
    20 小时前
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    1

    主题

    26

    回帖

    187

    积分

    注册会员

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

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

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

    使用道具 举报

  • TA的每日心情
    开心
    20 小时前
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    1

    主题

    26

    回帖

    187

    积分

    注册会员

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

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

    使用道具 举报

  • TA的每日心情
    开心
    20 小时前
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    1

    主题

    26

    回帖

    187

    积分

    注册会员

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

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

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

    使用道具 举报

  • TA的每日心情
    开心
    前天 03:18
  • 签到天数: 137 天

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3990

    积分

    荣誉版主

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

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

    使用道具 举报

  • TA的每日心情
    开心
    前天 03:18
  • 签到天数: 137 天

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3990

    积分

    荣誉版主

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

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

    TxBuffer[ ] 数组 放在  edata中,

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

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-5 22:18 , Processed in 0.069847 second(s), 65 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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