fix(comm): 回退LAN9252批量读写优化并修复多个CAN-EtherCAT桥竞态问题
回退1.6.0引入的LAN9252 PRAM批量读写优化,因其AVAIL_CNT计数器对短读存在语义问题, 导致邮箱短读和探针传输时出现FIFO陈旧数据损坏问题。 同时修复EtherCAT-CAN桥中的多个竞态条件: - 修复消费者在fillRxBatch中直接访问共享ring buffer导致的数据混淆问题 - 修复生产者-消费者间tail指针发布时机不当造成的槽位覆盖竞态 - 修复WIN窗口基址更新位置错误导致电机状态窗口被锁定的问题 - 修复buildInput中断上下文与主循环间的数据竞争和内存撕裂问题 - 添加STATUS帧过滤机制减少批量区压力并解决队列饱和问题 此外还增加了多个诊断计数器用于监控撕裂、溢出和拼接错误,并调整了 输入PDO段布局和大小参数以支持新的48字节STATUS格式。 这些修改解决了上位机观察到的帧标签错误、电机状态丢失和数据拼接问题。
This commit is contained in:
@@ -229,8 +229,12 @@ static void enterState(State st) {
|
||||
|| prev == State::kFinishOta);
|
||||
if (otaActive && !wasActive) {
|
||||
CanFd::setChannelAutoRetrans(s_channel, false); /* OTA 开始:单发 */
|
||||
CanFd::setChannelBrsSuppress(s_channel, true); /* OTA 开始:压 BRS——电机 BOOT 收不了
|
||||
BRS 数据段,nonce/confirm/64B 数据包
|
||||
(DLC>8) 会全部静默丢失 */
|
||||
} else if (!otaActive && wasActive) {
|
||||
CanFd::setChannelAutoRetrans(s_channel, true); /* OTA 结束:恢复重发 */
|
||||
CanFd::setChannelBrsSuppress(s_channel, false); /* OTA 结束:恢复 BRS(EtherCAT 桥接吞吐) */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user