feat(comm): 1.6.51 CAN 空通道自动静默 + PDO 诊断 + OTA 布局共用头
变更点: 1. CAN-FD(device/CANFD.cpp、sys/config.h) - 发送统一 FD+BRS(DLC≤8 不再回退经典 CAN);OTA 期仍按通道压制 BRS - 空通道自动识别:连续 5 个 1Hz 窗口无有效帧且有错误 → 静默上报;有帧即恢复 - 三路 CAN 默认全开;RX parse budget 48→64 2. EtherCAT 桥 / PDO - 段1 增 txtxid/rx00ff;版本应答 0x00FF 粘滞发布,避免被 CONFIG 冲掉 - STATUS 禁止写入 xrx 快照;processSeq 新鲜度救援 3. OTA / 配置 - sys/config.h include 仓库内 shared/ota_layout.h(与 BOOT 共用,不再依赖仓外路径) - ota_boot_request 对齐配置页 word 布局 4. docs/audit_ecat_spi_wifi_ota_compatibility.md:ECAT/SPI/WiFi/OTA 兼容性审计 5. .gitignore:忽略 .trae/、docs/traework-import、评审过程稿
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
/**
|
||||
* @file ethercat_pdo.h
|
||||
* @brief EtherCAT 过程数据(PDO)收发模块(1.5.54 由 dc_app.c 的散装 C 代码类化)。
|
||||
* @brief EtherCAT 过程数据(PDO)收发模块。
|
||||
*
|
||||
* 一个 EtherCAT 周期在 SSC 里被拆成三个回调,本类按这三步各提供一个入口:
|
||||
* 1. APPL_OutputMapping() → readOutputs() 从 ESC 取走主站下发的输出数据
|
||||
@@ -11,7 +11,7 @@
|
||||
* 是 SDO 存储,必须留在 C 侧)与三行 extern "C" 转发。这样"收发"这件事只有一个
|
||||
* 归属:想加新的过程数据语义只改本类,不必再动 SSC 移植层。
|
||||
*
|
||||
* @note 1.5.55 起输出/输入**长度不再相等**(64B / 384B),为电机控制台腾出
|
||||
* @note 输出/输入**长度不相等**(64B / 384B),为电机控制台腾出
|
||||
* 状态窗口空间。长度常量统一由 ethercat_can_bridge.h 提供,避免三处各写
|
||||
* 一个魔数后失配。
|
||||
*
|
||||
@@ -49,11 +49,11 @@ public:
|
||||
static void readOutputs(const uint8_t *esc);
|
||||
|
||||
/**
|
||||
* @brief 输出探针(1.6.0 输出按需全量读,配合 SSC PDO_OutputMapping)。
|
||||
* @brief 输出探针(输出按需全量读,配合 SSC PDO_OutputMapping)。
|
||||
* @param[in] head 输出 PDO 头 12B(覆盖 SEQ@0 / WIN@8 / FLAGS@3)。
|
||||
* @return true=需要全量读(seq 沿或清统计请求);false=本周期跳过全量读。
|
||||
* @note 每周期由 PDI_Isr 在读 ESC 前调用:做 seq 基准 priming 与沿判定;
|
||||
* s_lastSeq 的推进仍留在全量路径(processOutput)。1.6.21 起不再
|
||||
* s_lastSeq 的推进仍留在全量路径(processOutput)。不再
|
||||
* 维护 win_base(段 2 电机整轮密排,无滑窗)。
|
||||
*/
|
||||
static bool outputProbe(const uint8_t *head);
|
||||
@@ -73,7 +73,7 @@ public:
|
||||
static void writeInputs(uint8_t *esc);
|
||||
|
||||
/**
|
||||
* @brief 稀疏写 ESC 的两段计划(1.6.22):段1+段2有效区、段3+段5;跳过空槽区。
|
||||
* @brief 稀疏写 ESC 的两段计划:段1+段2有效区、段3+段5;跳过空槽区。
|
||||
* @param[out] off0/len0 第一段相对 PDO 起点的偏移与长度
|
||||
* @param[out] off1/len1 第二段
|
||||
* @return true=可按两段写;false=应回退整包 600B(开关关/非密排/count 越界/两段相接)
|
||||
@@ -83,7 +83,7 @@ public:
|
||||
uint16_t *off1, uint16_t *len1);
|
||||
|
||||
/**
|
||||
* @brief 输入 PDO 写 ESC 的多段计划(1.6.25 差分写;未启用时回退稀疏/整包)。
|
||||
* @brief 输入 PDO 写 ESC 的多段差分计划(未启用时回退稀疏/整包)。
|
||||
* @param[out] offs 段偏移数组,至少 kEscPlanMaxSegs 项
|
||||
* @param[out] lens 段长度数组,至少 kEscPlanMaxSegs 项
|
||||
* @return 段数 1..kEscPlanMaxSegs;调用方逐段 HW_EscWriteIsr。
|
||||
@@ -102,6 +102,9 @@ public:
|
||||
|
||||
/** @brief 累计交回输入的周期数。 */
|
||||
static uint32_t inputCycles() { return s_inputCycles; }
|
||||
/** @brief process() 完整填完一拍输入的序号。新鲜度救援看这个,而不是
|
||||
* InputMapping 的 s_inMapSeq——后者只证明「在拷陈旧 s_in」。 */
|
||||
static uint32_t processSeq() { return s_processSeq; }
|
||||
/** @brief process() 被重入拦下的次数。持续增长 = 跨上下文抢占确实在发生
|
||||
* (PDI_Isr / Sync0_Isr / Sync1_Isr / MainLoop 互相打断),也就证明了
|
||||
* 批量区跨轮次拼接的成因;恒为 0 则说明该机制推断有误。 */
|
||||
@@ -118,7 +121,7 @@ public:
|
||||
|
||||
private:
|
||||
/**
|
||||
* @brief 填充输入 PDO 段 5 设备诊断区(尾部 8 字节,1.5.61)。
|
||||
* @brief 填充输入 PDO 段 5 设备诊断区(尾部 8 字节)。
|
||||
* @param[out] in 全长输入过程数据缓冲。
|
||||
* @note 布局常量 ECAT_DIAG_OFF_* 见 ethercat_can_bridge.h;当前携带
|
||||
* CPU 负载率(0.1% 单位) + 窗口序号,取自 sys/cpu_load.h。
|
||||
@@ -136,7 +139,7 @@ private:
|
||||
* ECAT_Application() 会在 PDI_Isr / Sync0_Isr / Sync1_Isr / MainLoop 四个
|
||||
* 上下文被调用并互相抢占,直接写 s_in 会让读侧取到跨轮次的半成品。 */
|
||||
alignas(4) static uint8_t s_build[kPdoInBytes];
|
||||
/** @brief 写 ESC 差分影子(1.6.25):段1 / 段2 / 段3+5 三区。 */
|
||||
/** @brief 写 ESC 差分影子:段1 / 段2 / 段3+5 三区。 */
|
||||
alignas(4) static uint8_t s_escSh1[32];
|
||||
alignas(4) static uint8_t s_escSh2[ECAT_XRX_OFF_CH - 32U];
|
||||
alignas(4) static uint8_t s_escSh3[kEcatPdoInBytes - ECAT_XRX_OFF_CH];
|
||||
@@ -151,6 +154,7 @@ private:
|
||||
|
||||
static volatile uint32_t s_outputCycles;
|
||||
static volatile uint32_t s_inputCycles;
|
||||
static volatile uint32_t s_processSeq;
|
||||
};
|
||||
|
||||
extern "C" {
|
||||
@@ -160,6 +164,10 @@ void EcatPdo_ReadOutputs(const uint8_t *esc);
|
||||
void EcatPdo_Process(void);
|
||||
/** @brief 供 dc_app.c 调用:交回输入过程数据。 */
|
||||
void EcatPdo_WriteInputs(uint8_t *esc);
|
||||
/** @brief 供 dc_app.c 新鲜度救援:process() 是否还在推进。 */
|
||||
uint32_t EcatPdo_ProcessSeq(void);
|
||||
/** @brief PDO_OutputMapping 探针命中并完成全量读后调用(本拍 s_out 已新鲜)。 */
|
||||
void EcatPdo_NoteOutputMapped(void);
|
||||
}
|
||||
|
||||
#endif /* COMM_ETHERCAT_PDO_H */
|
||||
|
||||
Reference in New Issue
Block a user