fix(chrg_roll_sou): 优化电流命令处理与线程超时设置
0. 加快指令下发和返回时间,电压电流最新值覆盖旧值 1. 新增SOU_RESPONSE_TIMEOUT_MS宏定义,统一超时时间配置 2. 添加电流命令最新值有效策略,避免队列堆积过时指令 3. 将线程接收消息超时改为毫秒转系统节拍的标准写法 4. 移除冗余的线程延迟等待逻辑
This commit is contained in:
@@ -22,6 +22,7 @@
|
||||
#include <rtdbg.h>
|
||||
|
||||
#define SOU_MUTEX_TIMEOUT_MS 100
|
||||
#define SOU_RESPONSE_TIMEOUT_MS 20
|
||||
#define SOU_COM_MAX_ATTEMPTS 3
|
||||
|
||||
chrg_rollsou_com_t g_sou_com_batch = {0};
|
||||
@@ -77,6 +78,23 @@ int chrg_sou_com_batch_submit(eIDX_SOU_CH ch, const rt_uint16_t *regs,
|
||||
pBatch->cur_idx = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* 电流调节采用最新值有效策略。若同一通道仍有尚未发送的电流命令,
|
||||
* 直接覆盖旧值,避免四通道快速测试时队列积累过时的电流设置。
|
||||
* 当前命令已经发送时不覆盖,保证响应仍与原命令匹配。
|
||||
*/
|
||||
if ((count == 1) && (regs[0] == (REG_CURRENT_OUT + 1))) {
|
||||
for (i = pBatch->cur_idx; i < pBatch->reg_cnt; i++) {
|
||||
if (pBatch->reg_list[i] == regs[0]) {
|
||||
pBatch->val_list[i] = vals[0];
|
||||
pBatch->pending = RT_TRUE;
|
||||
pROLL->run = RUN_COM;
|
||||
rt_mutex_release(pTHR->mutex);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((pBatch->reg_cnt > SOU_COM_BATCH_REG_MAX) ||
|
||||
(count > (SOU_COM_BATCH_REG_MAX - pBatch->reg_cnt))) {
|
||||
LOG_E("sou com batch reg full: ch=%d queued=%d append=%d max=%d",
|
||||
@@ -391,7 +409,8 @@ void chrg_roll_sou_thread_entry (void *data)
|
||||
}
|
||||
|
||||
pMB_R = RT_NULL;
|
||||
ret = rt_mb_recv(pTS->mb, (rt_uint32_t *)&pMB_R, 50);
|
||||
ret = rt_mb_recv(pTS->mb, (rt_uint32_t *)&pMB_R,
|
||||
rt_tick_from_millisecond(SOU_RESPONSE_TIMEOUT_MS));
|
||||
if ((RT_EOK == ret) && (RT_NULL != pMB_R)) {
|
||||
rt_bool_t response_valid;
|
||||
|
||||
@@ -424,7 +443,6 @@ void chrg_roll_sou_thread_entry (void *data)
|
||||
}
|
||||
|
||||
sou_msg_free(&pMB_R);
|
||||
rt_thread_mdelay(20);
|
||||
} else {
|
||||
sou_msg_free(&pMB_R);
|
||||
if ((run == RUN_COM) && command_valid) {
|
||||
|
||||
Reference in New Issue
Block a user