当前位置: 首页 > news >正文

CAN多节点通信实战:基于系统RTC及系统时钟Tick的心跳风暴抑制方案

方案定义

本方案采用两级时基:

  • 系统RTC:用于计算统一周期起点periodStart
  • 系统时钟Tick:用于保证发送窗口精度

本方案支持两种通信模式:

  • 主从通信:由 Master 周期发布系统 RTC
  • 对等通信:由1号节点周期发布系统 RTC

系统 RTC 发布节点只负责授时,不直接参与其他节点的心跳调度计算。


全局参数

  • Thb:节点心跳周期
  • N:系统容量
  • NodeId:节点号
  • rtcNow:当前节点本地 RTC 时间
  • localTickNow:当前节点本地系统 Tick

当前参数示例:

  • Thb = 30s
  • N = 200
  • 系统 RTC 发布周期 = 10分钟
  • 本地 Tick 精度 = 10ms

系统RTC来源

主从通信模式

系统 RTC 由 Master 周期发布。
Slave 接收后同步本地 RTC。

对等通信模式

系统 RTC 由1号节点周期发布, 其他节点接收后同步本地 RTC。
对等通信模式下,1号节点发送,所有节点仍按统一规则计算心跳周期与发送窗口。


周期起点计算

当前心跳周期起点由节点本地 RTC 直接计算:

periodStart=(rtcNow/Thb)*Thb;

其中:

  • rtcNow为以秒为单位的系统时间戳
  • Thb为以秒为单位的心跳周期

示例:

rtcNow=1719833725;Thb=30;periodStart=(1719833725/30)*30=1719833710;

所有节点只要 RTC 已同步到同一系统时间基准,计算得到的periodStart就一致。


发送窗口计算

每个节点固定映射到一个发送窗口:

windowSize=Thb/N;sendOffset=(NodeId%N)*windowSize;

参数代入:

windowSize=30000ms/200=150ms;

即在每个 30 秒周期内,200 个节点均匀分散到 200 个发送窗口中。


本地Tick映射

在轮询中根据当前 RTC 计算当前周期起点:

periodStartRtc=(rtcNowSec/T_hbSec)*T_hbSec;

若检测到进入新周期,则记录当前本地 Tick:

periodStartTick=localTickNow;

该值表示当前周期起点在本地 Tick 时间轴上的映射时刻。


心跳发送规则

本节点发送偏移为:

sendOffset=(NodeId%N)*windowSize;sendTick=periodStartTick+sendOffset;

发送条件:

if(!sentFlag&&localTickNow>=sendTick){send_heartbeat();sentFlag=1;}

每个周期只发送一次心跳。
进入新周期后清除sentFlag


RTC同步规则

系统 RTC 发布节点周期发送 RTC 同步报文。
节点收到后执行本地 RTC 同步。

RTC 同步报文只用于:

  • 更新本地 RTC

RTC 同步报文不用于:

  • 不直接计算periodStart
  • 不直接修改发送窗口
  • 不直接触发心跳发送

运行流程

1. 节点初始化

初始化上下文参数:

  • 心跳周期Thb
  • 系统容量N
  • 节点号NodeId
  • 本周期发送标志sentFlag

2. 系统RTC同步

系统 RTC 发布节点周期发送 RTC 同步报文, 其他节点接收后同步本地 RTC。

3. 周期轮询

节点周期调用轮询函数,输入:

  • 当前 RTC
  • 当前本地 Tick

4. 计算周期起点

根据当前 RTC 计算:

periodStartRtc=(rtcNowSec/T_hbSec)*T_hbSec;

5. 新周期处理

periodStartRtc发生变化:

  • 更新记录的周期起点
  • 保存新的periodStartTick
  • 清除sentFlag

6. 发送判定

根据节点号计算发送偏移与发送时刻,满足条件后发送一次心跳。


参考实现

#include<stdint.h>typedefstruct{uint32_tlastPeriodStartRtc;// 当前周期起点,单位:秒uint32_tperiodStartTick;// 当前周期起点对应的本地Tick,单位:msuint32_twindowSizeMs;// 窗口宽度,单位:msuint32_tperiodSec;// 心跳周期,单位:秒uint16_tnodeId;uint16_tnodeCount;uint8_tsentFlag;}HeartbeatCtx;voidheartbeat_init(HeartbeatCtx*ctx,uint16_tnodeId,uint16_tnodeCount,uint32_tperiodSec){ctx->lastPeriodStartRtc=0;ctx->periodStartTick=0;ctx->windowSizeMs=(periodSec*1000)/nodeCount;ctx->periodSec=periodSec;ctx->nodeId=nodeId;ctx->nodeCount=nodeCount;ctx->sentFlag=0;}voidheartbeat_poll(HeartbeatCtx*ctx,uint32_trtcNowSec,uint32_tlocalTickNow){uint32_tperiodStartRtc=(rtcNowSec/ctx->periodSec)*ctx->periodSec;if(periodStartRtc!=ctx->lastPeriodStartRtc){ctx->lastPeriodStartRtc=periodStartRtc;ctx->periodStartTick=localTickNow;ctx->sentFlag=0;}uint32_tsendOffset=(uint32_t)(ctx->nodeId%ctx->nodeCount)*ctx->windowSizeMs;uint32_tsendTick=ctx->periodStartTick+sendOffset;if(!ctx->sentFlag&&localTickNow>=sendTick){send_heartbeat();ctx->sentFlag=1;}}

参数示例

按当前项目参数:

  • nodeCount = 200
  • periodSec = 30
  • windowSizeMs = 150
  • RTC 发布周期 = 10分钟
  • local Tick = 10ms

小结

本方案统一以系统 RTC 计算periodStart,以节点号分配固定发送窗口,以本地 Tick 实现窗口级精确发送。系统 RTC 可由 Master 发布,也可在对等通信模式下由 1 号机发布。RTC 同步仅用于统一各节点本地时间,不直接参与心跳调度逻辑。

http://www.jsqmd.com/news/601146/

相关文章:

  • CefFlashBrowser终极指南:5个步骤让Flash内容在现代系统重生
  • HunyuanVideo-Foley效果展示:地铁报站声+车厢内景视频生成实录
  • 虚拟机ping不通网络问题解决方案
  • Fish-Speech-1.5语音驱动动画:3D角色口型同步方案
  • OpenClaw错误处理:千问3.5-35B-A3B-FP8任务失败自动恢复
  • OpenClaw配置优化:千问3.5-35B-A3B-FP8长上下文处理技巧
  • OpenClaw跨平台控制方案:手机端远程触发Qwen2.5-VL-7B图文任务
  • Listen1音乐聚合工具:打破平台壁垒的无缝听歌解决方案
  • Node.js 2025新特性与实战指南,Docker 部署 Nginx 完整指南。
  • 中文文献管理效率提升指南:茉莉花插件的全方位应用
  • 人工智能竞赛中的Qwen3-TTS-12Hz-1.7B-CustomVoice创新应用
  • 亲测9款AI论文神器,一键综述+真实引用,毕业必备! - 麟书学长
  • AgentCPM与Unity引擎的创意结合:可视化金融数据与虚拟报告厅
  • FPGA精简GigE Vision协议栈:从IP相机采集到千兆UDP流的高效转换
  • AI Agent Harness Engineering 技术商业化挑战:标准化与定制化的矛盾解决之道
  • MTKClient完全指南:设备调试与固件管理的创新方法 - 适用于开发者与维修工程师
  • PROJECT MOGFACE多轮对话连贯性展示:复杂技术咨询场景模拟
  • Scarab:自动化解决《空洞骑士》模组依赖冲突的跨平台管理工具
  • 新手友好|Rust实用入门指南:从环境搭建到实战避坑,拒绝纸上谈兵
  • Pixel Aurora Engine 网络编程实践:构建高并发图像生成API服务
  • 智能家居中枢:OpenClaw+Qwen3-14B镜像控制HomeAssistant
  • 远离 8 种有毒人际关系,守住自身能量与运势
  • 手把手教你用Qwen2.5-7B+vLLM:零基础实现本地大模型离线推理
  • seo培训需要学习哪些内容
  • Python3 OS模块详解
  • 音乐格式自由革命:NCMDump终极指南让你轻松解锁网易云加密音乐
  • Qwen3-14B私有部署镜像辅助Android Studio开发:UI代码与资源管理
  • C#的LINQ查询表达式编译原理与性能优化
  • Skyvern云服务实战:每月5美元,如何搭建一个自动化的竞品价格追踪机器人
  • 乙巳马年春联生成终端实战案例:企业年会AI互动展台快速落地