zhx
发表于 2024-4-25 11:24:22
采果农 发表于 2024-4-25 10:57
等你做CAN发送就知道了,怎么把总线资源榨干,一个拓展帧是284us加上间隔6.2us,500K总线,满载情况下每 ...
我做过 串口转发,同样有这个问题,但是串口我可以自己指定两块缓存交替使用,所以我理解你的意识
采果农
发表于 2024-4-25 11:28:24
zxcv1973 发表于 2024-4-25 11:13
你这个WRITE_CAN是用的宏定义还是用的函数调用?
.h里的宏定义
LAOXU
发表于 2024-4-26 04:14:47
神农鼎 发表于 2024-4-24 12:47
大家帮忙下楼主
XFR 全部移到 edata 没用,问题依然存在.
解决方案1:
将 CAN 两个 寄存器地址, 从 XFR 移到 SFR, CAN模块不用修改, 提速 N倍, 完美解决.
解决方案2:
修改CAN模块, 取消 CAN 两个 寄存器地址, 将 CAN有关寄存器, 以STC一惯风格(摆地摊方式), 全部放在 XFR 中, 可提速 2-3倍(使用字读写, 可提速3-5倍), 也能解决问题.
LAOXU
发表于 2024-4-26 04:31:34
CAN 接受缓冲区有 64字节, 我估计 CAN 发送缓冲区也有 64字节,
建议楼主做一下简单测试,
在 CAN 发送期间, 继续 写入 CAN 发送缓冲区数据, 当作双缓冲区(同一地址) 使用.
不知行不行, 如行, 楼主的问题就不复存在了 {:biggrin:}
LAOXU
发表于 2024-4-26 07:09:28
楼主顶楼说:
在发送完一帧数据后进入发送完成中断,我们没办法直接启动下次发送,必须将新数据写入BUFFER后再启动发送。
-----------------------------------------------------------------------------
在 CAN 发送期间, 继续 写入 CAN 发送缓冲区数据(12字节), 当作双缓冲区(同一地址) 使用. 余下 4字节(含填充0), 等发送完一帧数据后进入发送完成中断,
再续续写入余下 4字节(含填充0), 启动发送, ....反复循环上述过程.
如下一帧不丢数据(发送 13字节), 则此方法可行, 可继续改为 写入 CAN 发送缓冲区数据(13-15字节), 当作双缓冲区(同一地址) 使用. 余下 3-1字节(填充0), 等发送完一帧数据后进入发送完成中断,再续续写入, 启动发送,分别测试验证.以寻找最佳方案.
如下一帧丢数据(仅发送最后 1字节), 则此方法行不通, 彻底没戏了.
采果农
发表于 2024-4-26 08:13:50
LAOXU 发表于 2024-4-26 04:14
XFR 全部移到 edata 没用,问题依然存在.
XFR,SFR,这两个速度问题我不懂
CAN模块这两个寄存器问题,是因为CAN是外挂模块,相当于CAN是另一个芯片集成到单片机的,只能通过间接寻址访问
采果农
发表于 2024-4-26 08:14:20
LAOXU 发表于 2024-4-26 04:31
CAN 接受缓冲区有 64字节, 我估计 CAN 发送缓冲区也有 64字节,
建议楼主做一下简单测试,
发送缓冲区只有16字节,而不是64字节
采果农
发表于 2024-4-26 08:16:45
LAOXU 发表于 2024-4-26 07:09
楼主顶楼说:
在发送完一帧数据后进入发送完成中断,我们没办法直接启动下次发送,必须将新数据写入BUFFER后 ...
这个方法不行的,缓存区有写保护的,没发送完不能写缓存区
目前减少写入BUF时间的办法就只有用代码量换取时间,
写buf的时候不进行任何判断循环,直接堆代码,提高运行效率。
LAOXU
发表于 2024-4-26 08:38:36
你那 TxBuffer[ ] 数组, 是放在 xram 中 , 还是 edata中 ?
放在 edata中 , 速度最快.放在 xdata中, 速度其次, 放在 far中, 速度最慢
LAOXU
发表于 2024-4-26 09:07:33
本帖最后由 LAOXU 于 2024-4-26 09:08 编辑
要我帮你汇编优化一下吗?
TxBuffer[ ] 数组 放在edata中,
如需要, 请将 发送中断函数 单独存个 c文件, 将此文件打开 src , 再和项目一起编译,
编译成功 请将此 发送中断函数 (src 文件) 上传, 我用汇编优化后给你, 估计可减少 十几条指令的执行时间.