chore: 优化批量下发缓存与测试模式逻辑

解决问题:南向队列容量的溢出风险,以及状态机的错别字还有快速启动加动态测试的导致没有继电器开启的问题
1.  apps/chrg/applications/thread/chrg_roll_sou.h
   - 调整SOU_COM_BATCH_REG_MAX为32并补充注释说明预留空间
2.  apps/chrg/applications/utils/chrg_sink.h
   - 移除废弃的SINK_WORK_RUNING_2枚举项
   - 重命名测试模式枚举项为更清晰的名称
3.  apps/chrg/applications/thread/chrg_comm.c
   - 更新测试模式匹配逻辑为新枚举项
4.  apps/chrg/applications/thread/chrg_roll_sou.c
   - 新增批量缓存空间回收与异常校验逻辑
   - 优化批量满日志输出信息
5.  apps/chrg/applications/utils/chrg_sink.c
   - 重构测试启动函数为更语义化的名称
   - 调整动态测试命令寄存器数量与内容
   - 更新工作状态分派逻辑适配新枚举项
6.  新增编译日志与程序流程说明文档
This commit is contained in:
yhf
2026-07-19 11:49:38 +08:00
parent ee76d8782d
commit b68ffe3bf3
7 changed files with 393 additions and 19 deletions
+1 -1
View File
@@ -2280,7 +2280,7 @@ static eMBException chrg_mb_write_sys(rt_uint8_t ch, rt_uint16_t reg_offset, rt_
if (curr_test_old == 0)
{
// 从正常模式进入测试模式
pReal->sink.work_mode = (curr_test == 3) ? SINK_WORK_ON_TEST_CHANGE : SINK_WORK_ON_TEST_SHOUT;
pReal->sink.work_mode = (curr_test == 3) ? SINK_WORK_ON_TEST_DYNA : SINK_WORK_ON_TEST_SHORT;
pReal->sink.test.test_mode_old = curr_test;
}
else
+28 -1
View File
@@ -409,6 +409,7 @@ int chrg_sou_com_batch_submit(eIDX_SOU_CH ch, const rt_uint16_t *regs,
struct chrg_thread_t *pTHR = &chrgthr[IDX_THR_ROLL_SOU];
struct chrg_rollsou_t *pROLL = &chrgrollsou;
sou_com_batch_ch_t *pBatch;
rt_uint16_t remaining;
rt_uint8_t i;
if ((ch >= TOTAL_SOU_CHS) || (RT_NULL == regs) || (RT_NULL == vals) ||
@@ -421,9 +422,35 @@ int chrg_sou_com_batch_submit(eIDX_SOU_CH ch, const rt_uint16_t *regs,
}
pBatch = &g_sou_com_batch.ch[ch];
if (pBatch->cur_idx > pBatch->reg_cnt) {
LOG_E("sou com batch index invalid: ch=%d cur=%d cnt=%d",
ch, pBatch->cur_idx, pBatch->reg_cnt);
pBatch->pending = RT_FALSE;
pBatch->cur_idx = 0;
pBatch->reg_cnt = 0;
}
/*
* cur_idx 之前的命令均已收到有效响应,追加新事务前先回收这些空间。
* 否则快速连续写入时,即使大部分命令已经执行完成,也可能因为
* reg_cnt 未清零而误报批队列已满。
*/
if (pBatch->cur_idx > 0) {
remaining = pBatch->reg_cnt - pBatch->cur_idx;
if (remaining > 0) {
memmove(pBatch->reg_list, &pBatch->reg_list[pBatch->cur_idx],
remaining * sizeof(pBatch->reg_list[0]));
memmove(pBatch->val_list, &pBatch->val_list[pBatch->cur_idx],
remaining * sizeof(pBatch->val_list[0]));
}
pBatch->reg_cnt = remaining;
pBatch->cur_idx = 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");
LOG_E("sou com batch reg full: ch=%d queued=%d append=%d max=%d",
ch, pBatch->reg_cnt, count, SOU_COM_BATCH_REG_MAX);
rt_mutex_release(pTHR->mutex);
return -2;
}
@@ -16,7 +16,8 @@
#define THR_NAME_ROLL_SOU "thr.rollsou"
// 单通道批量下发缓存:保存当前需要同步的寄存器列表
#define SOU_COM_BATCH_REG_MAX 16
/* 为连续提交初始化、普通启动和动态启动命令预留足够空间。 */
#define SOU_COM_BATCH_REG_MAX 32
typedef struct
{
rt_uint16_t reg_cnt; // 当前待下发寄存器数量
+17 -13
View File
@@ -524,20 +524,27 @@ static int chrg_sink_nor_work_off(eIDX_SOU_CH idx, struct chrg_switch_t *pSW)
}
//动态测试启动
static int chrg_sink_change_ON(rt_uint8_t ch, struct chrg_switch_t *pSW)
static int chrg_sink_TEST_DYNA_ON(rt_uint8_t ch, struct chrg_switch_t *pSW)
{
struct test *pTest = &pSW->sink.test;
rt_uint16_t regs[6] = {ModbusRTU_DYNA_L1, ModbusRTU_DYNA_T1,
ModbusRTU_DYNA_L2, ModbusRTU_DYNA_T2, ModbusRTU_DYNA_CMD_MODE_FLAG, REG_WORK};
rt_uint16_t vals[6] = {pTest->change_test.curr1_set, pTest->change_test.time1_set,
rt_uint16_t regs[8] = {REG_REL_ON, REG_REL_ON,
ModbusRTU_DYNA_L1, ModbusRTU_DYNA_T1, ModbusRTU_DYNA_L2,
ModbusRTU_DYNA_T2, ModbusRTU_DYNA_CMD_MODE_FLAG, REG_WORK};
rt_uint16_t vals[8] = {0x02, 0x03,
pTest->change_test.curr1_set, pTest->change_test.time1_set,
pTest->change_test.curr2_set, pTest->change_test.time2_set,
ModbusRTU_DYNA_CMD_MODE_RUN, WORK_START};
return chrg_sou_com_batch_submit((eIDX_SOU_CH)ch, regs, vals, 6);
/*
* 动态测试可能在普通 RUNING 状态打开功率板继电器之前进入。
* 因此动态启动流程必须自行打开两路继电器,避免快速从 PD 设置
* 切换到动态测试时,负载已经启动但功率板继电器仍处于关闭状态。
*/
return chrg_sou_com_batch_submit((eIDX_SOU_CH)ch, regs, vals, 8);
}
//短路测试启动
static int chrg_sink_SHOUT_ON(rt_uint8_t ch, struct chrg_switch_t *pSW)
static int chrg_sink_TEST_SHORT_ON(rt_uint8_t ch, struct chrg_switch_t *pSW)
{
rt_uint16_t regs[2] = {ModbusRTU_ShortTest_CMD_MODE_FLAG, REG_WORK};
rt_uint16_t vals[2] = {ModbusRTU_DYNA_CMD_MODE_RUN_ALWAYS_KEPP, WORK_START};
@@ -572,14 +579,11 @@ int chrg_sink_work(eIDX_SOU_CH idx, struct chrg_switch_t *pSW)
case SINK_WORK_RUNING:
ret = chrg_sink_work_volt_runing(idx,pSW);
break;
case SINK_WORK_RUNING_2:
ret = chrg_sink_work_volt_runing(idx,pSW);
break;
case SINK_WORK_ON_TEST_CHANGE:
ret = chrg_sink_change_ON(idx,pSW);
case SINK_WORK_ON_TEST_DYNA:
ret = chrg_sink_TEST_DYNA_ON(idx,pSW);
break;
case SINK_WORK_ON_TEST_SHOUT:
ret = chrg_sink_SHOUT_ON(idx,pSW);
case SINK_WORK_ON_TEST_SHORT:
ret = chrg_sink_TEST_SHORT_ON(idx,pSW);
break;
case SINK_WORK_LOW:
ret = chrg_sink_nor_work_low(idx,pSW);
+2 -3
View File
@@ -206,11 +206,10 @@ enum {
SINK_WORK_WAIT,
SINK_WORK_VOLT_OK,
SINK_WORK_RUNING,
SINK_WORK_RUNING_2,
SINK_WORK_LOW,
SINK_WORK_STOP,
SINK_WORK_ON_TEST_CHANGE,
SINK_WORK_ON_TEST_SHOUT,
SINK_WORK_ON_TEST_DYNA,
SINK_WORK_ON_TEST_SHORT,
};
// sink 参数结构
+18
View File
@@ -0,0 +1,18 @@
*** Using Compiler 'V6.16', folder: 'D:\Program Files\Keil_v5\ARM\ARMCLANG\Bin'
Build target 'chrg'
compiling chrg_roll_nor.c...
compiling chrg_north.c...
compiling chrg_south.c...
compiling chrg_comm.c...
compiling chrg_roll_sou.c...
compiling chrg_lcd.c...
compiling chrg_thread.c...
compiling chrg_sink.c...
compiling chrg_north_pkg.c...
compiling chrg_eload.c...
linking...
Program Size: Code=141040 RO-data=15212 RW-data=8544 ZI-data=13968
FromELF: creating hex file...
After Build - User command #1: fromelf --bin .\build\keil\Obj\chrg.axf -o build/chrg.bin
".\build\keil\Obj\chrg.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:06