feat(can): 新增CAN通道收发器Silent模式功能

- 新增SPI 0xC8命令用于切换CAN通道收发器Silent模式(只听不发)
- 在canFdSetTxSilent函数中实现静默模式控制逻辑
- 在HTTP API中添加POST /can/silent端点
- 更新CAN协议文档,记录新命令和错误码E6
- 修改bus_state位图,添加bit5表示静默状态

fix(can): 优化CAN反馈任务内存使用和链路离线处理

- 将任务栈上的临时缓冲区改为静态分配,防止栈溢出
- 添加链路在线检测,在离线状态下进入休眠退避
- 修复queryMotorStatePages和queryAdcFeedback函数返回值类型
- 优化UDP日志发送的冷却退避机制

chore(config): 更新调试日志配置和版本信息

- 在VSCode设置中添加ESP-IDF串口配置
- 添加SPI调试日志级别编译期开关CONFIG_SPI_DEBUG_LOG_LEVEL
- 更新固件版本至0.5.2,记录相关变更内容
- 调整SPI和CAN反馈任务的栈大小配置
This commit is contained in:
小龙虾
2026-10-10 02:25:12 +08:00
parent 84f496c22c
commit 1b50ce1657
15 changed files with 391 additions and 47 deletions
+8 -3
View File
@@ -676,9 +676,13 @@ esp_err_t DebugLog::send(const uint8_t *data, size_t len)
uart_ret = uartSend(data, len);
}
/* UDP:堆紧 / 无 IP 时跳过 sendto */
/* UDP:堆紧 / 无 IP 时跳过 sendto;增加关闭后 10s 冷却退避,防连续失败时反复创建/销毁 socket 造成堆抖动 */
static TickType_t s_lastUdpCloseTick = 0;
const TickType_t now_tick = xTaskGetTickCount();
const bool udp_in_cooloff = (s_lastUdpCloseTick != 0) &&
((now_tick - s_lastUdpCloseTick) < pdMS_TO_TICKS(10000));
if (m_initialized && free_now >= kSkipUdpFree && udpNetifHasIp()) {
if (m_udpSock < 0) {
if (m_udpSock < 0 && !udp_in_cooloff) {
(void)ensureUdpSocket();
}
@@ -703,12 +707,13 @@ esp_err_t DebugLog::send(const uint8_t *data, size_t len)
}
if (m_udpFailStreak >= kUdpFailRecreate) {
closeUdpSocket();
s_lastUdpCloseTick = xTaskGetTickCount();
m_udpFailStreak = 0;
const TickType_t now = xTaskGetTickCount();
if (m_lastUdpFailWarnTick == 0 ||
(now - m_lastUdpFailWarnTick) >= warnIntervalTicks()) {
m_lastUdpFailWarnTick = now;
static const char kMsg[] = "[W][LOG] UDP 连续失败,已重建 socket\n";
static const char kMsg[] = "[W][LOG] UDP 连续失败,暂停发送 10s 后重建\n";
ringPush(kMsg, (int)sizeof(kMsg) - 1);
}
}