refactor(UI): U2 合并运行/自检记录两页为共享组件 ui_w_records

ui_page_runlog.c 与 ui_page_selftest.c 各 102 行,逐行比对后差异全是命名:
唯一的功能变量是日志 ID(SYSLOG_RUN / SYSLOG_SELFTEST),计数、每记录 2 行、
同记录读盘缓存、空态伪行的实现两边逐字相同。是真重复,不是推测出的抽象。

## 落地
新建 Drivers/BSP/UI/ui_w_records.{c,h}(已在 uvprojx + CMakeLists 双端注册;
生成器只自动管 ui_page_*.c,故这两处手工加)。两页各留一个实例与两个薄跳板,
.count_cb/.refresh 名字不变 => 注册表与生成器零改动。
净效果:两页 90 删 / 28 增(−62 行),重复逻辑收成一份。

## 合并唯一的真陷阱:缓存归属
count_cb/refresh 签名里没有 user context,最容易写的版本是把
s_cache_valid / s_last_rec / s_ts / s_desc 留成组件级静态——那样两页共用一份
缓存,从 A 页切到 B 页会因记录号相同而直接命中缓存,显示另一页的陈旧行,
是静默错数据而非崩溃。故缓存内嵌进实例(ui_w_records_t),每页各一份。

## 验证
@build 0 错 0 警;golden 经真实 ui-golden 钩子跑通:菜单 8 状态 + 内容页
11 页(含这两页)逐字节一致,未用 --update 刷基线 => 语义搬迁行为等价有证。
ER_IROM1 232,052 → 231,936 B(−116 B)。RW_IRAM1 75,232 → 75,240 B(+8 B),
原因如实记录:原先 4 个文件级静态零初始化落 ZI,现在 s_rec 带 .id 初值整个
结构体落 .data(RW),两页合计净 +8 B;要压回 0 需把 .id 留零再加 init 钩子,
为 8 字节引入运行时初始化顺序不值得,故保留并把账写在此处。
stack_report FAIL 行数 0(间接层未顶破栈预算);mem-budget / mem-numbers 已
按 @build 后规定回填台账。

## 过程中的两处自我失误(已修复,记录以免重犯)
① 用 stem[:2] 生成函数前缀,对 selftest 得到 se_ 而非 st_,锚点失配。
② 撤销脚本里 ${UI_DIR} 被 PowerShell here-string 插值吞掉,导致"边校验边写"
   把树留在引用组件但未注册的链接错误态。教训:回滚脚本必须比正向脚本更保守,
   全部校验通过后才允许写盘。
This commit is contained in:
2026-10-20 22:57:13 +08:00
parent 44dec5c49b
commit 64abefaa00
9 changed files with 172 additions and 99 deletions
+15 -46
View File
@@ -9,12 +9,14 @@
* 创建日期:2026-09-14 * 创建日期:2026-09-14
* 修改记录: * 修改记录:
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/子系统设计/运行与自检记录设计说明.md §5.3) * v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/子系统设计/运行与自检记录设计说明.md §5.3)
* v1.1 2026-10-20 王建锋 改用 ui_w_records 共享组件(W6 U2:合并两页重复实现)
*/ */
/* 头文件包含区 */ /* 头文件包含区 */
#include <string.h> #include <string.h>
#include "ui_page_runlog.h" #include "ui_page_runlog.h"
#include "ui_w_records.h"
#include "ui_tokens.h" #include "ui_tokens.h"
@@ -23,10 +25,7 @@
/* 静态变量定义区 */ /* 静态变量定义区 */
/* 最近读取的记录缓存(偶数行读盘后,奇数行复用;避免同记录重复 I/O) */ /* 最近读取的记录缓存(偶数行读盘后,奇数行复用;避免同记录重复 I/O) */
static uint8_t s_cache_valid; /* 缓存有效标志(0 = 无缓存) */ /* 静态变量定义区:见下方 s_rec */
static uint32_t s_last_rec; /* 已缓存的记录序号 */
static char s_ts[SYSLOG_TS_LEN + 1u];
static char s_desc[SYSLOG_DESC_MAX + 1u];
/* 函数定义区 */ /* 函数定义区 */
@@ -35,49 +34,19 @@ static char s_desc[SYSLOG_DESC_MAX + 1u];
* 入口参数:无 * 入口参数:无
* 返回值:总行数 uint16_t * 返回值:总行数 uint16_t
*/ */
static uint16_t rl_count_cb(void) { /*
uint32_t n = syslog_count(SYSLOG_RUN); * 记录页薄跳板:内容全部走 ui_w_records 共享组件(W6 U2)。
* 实例 s_rec 携带日志 ID 与**本实例自己的**读盘缓存——两页共用组件代码,
* 但缓存不得共享,否则切页会命中上一记录号而显示另一页的陈旧行。
*/
static ui_w_records_t s_rec = { SYSLOG_RUN };
if (n == 0u) { static uint16_t pg_count(void) {
return 1u; /* 空态伪行(页脚"共 1 页",避免"共 0 页") */ return ui_w_records_count(&s_rec);
}
return (uint16_t)(n * 2u);
} }
/* static void pg_refresh(uint16_t row, char *name, char *value) {
* 函数功能:逐行取数(偶数行 = 时间戳、奇数行 = 描述;值列恒空) ui_w_records_refresh(&s_rec, row, name, value);
* 入口参数:row - 全局行下标 uint16_t
* name - 名输出缓冲(框架栈缓冲 UI_BUF_STRLEN=32,含 NUL) char *
* value - 值输出缓冲(同上;本页恒写空串) char *
* 限定条件:页面打开中(框架绘制/按键上下文,uiTask)
*/
static void rl_refresh(uint16_t row, char *name, char *value) {
uint32_t n = syslog_count(SYSLOG_RUN);
value[0] = '\0';
if (n == 0u) {
(void)memcpy(name, "无记录", sizeof("无记录"));
return;
}
{
uint32_t rec = row / 2u;
if (!s_cache_valid || rec != s_last_rec) {
if (syslog_get_record(SYSLOG_RUN, rec, s_ts, sizeof(s_ts), s_desc, sizeof(s_desc)) != 0) {
name[0] = '\0'; /* 读失败(越界/存储异常):空行防御 */
return;
}
s_last_rec = rec;
s_cache_valid = 1u;
}
if ((row % 2u) == 0u) {
(void)memcpy(name, s_ts, sizeof(s_ts));
}
else {
(void)memcpy(name, s_desc, sizeof(s_desc));
}
}
} }
/* /*
@@ -97,6 +66,6 @@ const content_page_def_t ui_page_runlog_desc = {
.left_x = UI_LIST_LEFT_X, .left_x = UI_LIST_LEFT_X,
.right_x = UI_LIST_RIGHT_X, .right_x = UI_LIST_RIGHT_X,
.rows_per_page = UI_LIST_ROWS, .rows_per_page = UI_LIST_ROWS,
.count_cb = rl_count_cb, .count_cb = pg_count,
.refresh = rl_refresh, .refresh = pg_refresh,
}; };
+15 -46
View File
@@ -9,12 +9,14 @@
* 创建日期:2026-09-14 * 创建日期:2026-09-14
* 修改记录: * 修改记录:
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/子系统设计/运行与自检记录设计说明.md §5.4) * v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/子系统设计/运行与自检记录设计说明.md §5.4)
* v1.1 2026-10-20 王建锋 改用 ui_w_records 共享组件(W6 U2:合并两页重复实现)
*/ */
/* 头文件包含区 */ /* 头文件包含区 */
#include <string.h> #include <string.h>
#include "ui_page_selftest.h" #include "ui_page_selftest.h"
#include "ui_w_records.h"
#include "ui_tokens.h" #include "ui_tokens.h"
@@ -23,10 +25,7 @@
/* 静态变量定义区 */ /* 静态变量定义区 */
/* 最近读取的记录缓存(偶数行读盘后,奇数行复用;避免同记录重复 I/O) */ /* 最近读取的记录缓存(偶数行读盘后,奇数行复用;避免同记录重复 I/O) */
static uint8_t s_cache_valid; /* 缓存有效标志(0 = 无缓存) */ /* 静态变量定义区:见下方 s_rec */
static uint32_t s_last_rec; /* 已缓存的记录序号 */
static char s_ts[SYSLOG_TS_LEN + 1u];
static char s_desc[SYSLOG_DESC_MAX + 1u];
/* 函数定义区 */ /* 函数定义区 */
@@ -35,49 +34,19 @@ static char s_desc[SYSLOG_DESC_MAX + 1u];
* 入口参数:无 * 入口参数:无
* 返回值:总行数 uint16_t * 返回值:总行数 uint16_t
*/ */
static uint16_t st_count_cb(void) { /*
uint32_t n = syslog_count(SYSLOG_SELFTEST); * 记录页薄跳板:内容全部走 ui_w_records 共享组件(W6 U2)。
* 实例 s_rec 携带日志 ID 与**本实例自己的**读盘缓存——两页共用组件代码,
* 但缓存不得共享,否则切页会命中上一记录号而显示另一页的陈旧行。
*/
static ui_w_records_t s_rec = { SYSLOG_SELFTEST };
if (n == 0u) { static uint16_t pg_count(void) {
return 1u; /* 空态伪行(页脚"共 1 页",避免"共 0 页") */ return ui_w_records_count(&s_rec);
}
return (uint16_t)(n * 2u);
} }
/* static void pg_refresh(uint16_t row, char *name, char *value) {
* 函数功能:逐行取数(偶数行 = 时间戳、奇数行 = 故障描述;值列恒空) ui_w_records_refresh(&s_rec, row, name, value);
* 入口参数:row - 全局行下标 uint16_t
* name - 名输出缓冲(框架栈缓冲 UI_BUF_STRLEN=32,含 NUL) char *
* value - 值输出缓冲(同上;本页恒写空串) char *
* 限定条件:页面打开中(框架绘制/按键上下文,uiTask)
*/
static void st_refresh(uint16_t row, char *name, char *value) {
uint32_t n = syslog_count(SYSLOG_SELFTEST);
value[0] = '\0';
if (n == 0u) {
(void)memcpy(name, "无记录", sizeof("无记录"));
return;
}
{
uint32_t rec = row / 2u;
if (!s_cache_valid || rec != s_last_rec) {
if (syslog_get_record(SYSLOG_SELFTEST, rec, s_ts, sizeof(s_ts), s_desc, sizeof(s_desc)) != 0) {
name[0] = '\0'; /* 读失败(越界/存储异常):空行防御 */
return;
}
s_last_rec = rec;
s_cache_valid = 1u;
}
if ((row % 2u) == 0u) {
(void)memcpy(name, s_ts, sizeof(s_ts));
}
else {
(void)memcpy(name, s_desc, sizeof(s_desc));
}
}
} }
/* /*
@@ -97,6 +66,6 @@ const content_page_def_t ui_page_selftest_desc = {
.left_x = UI_LIST_LEFT_X, .left_x = UI_LIST_LEFT_X,
.right_x = UI_LIST_RIGHT_X, .right_x = UI_LIST_RIGHT_X,
.rows_per_page = UI_LIST_ROWS, .rows_per_page = UI_LIST_ROWS,
.count_cb = st_count_cb, .count_cb = pg_count,
.refresh = st_refresh, .refresh = pg_refresh,
}; };
+70
View File
@@ -0,0 +1,70 @@
/*
* 模块名称:UI 记录页共享组件实现
* 模块功能:见 ui_w_records.h(逻辑照搬合并前的 ui_page_runlog.c / ui_page_selftest.c,
* 两文件差异仅为日志 ID 与符号名,其余逐字相同)
* 适用范围:Drivers/BSP/UI
* 作者:王建锋
* 创建日期:2026-10-20
* 修改记录:
* v1.0 2026-10-20 王建锋 创建(W6 U2)
*/
#include <string.h>
#include "ui_w_records.h"
#include "ui_tokens.h"
/* 函数定义区 */
/*
* 函数功能:总行数(动态;每条记录 2 行,空日志 = 单条伪行"无记录")
* 入口参数:a_inst - 记录页实例 ui_w_records_t *
* 返回值:总行数 uint16_t
*/
uint16_t ui_w_records_count(ui_w_records_t *a_inst) {
uint32_t n = syslog_count(a_inst->id);
if (n == 0u) {
return 1u; /* 空态伪行(页脚"共 1 页",避免"共 0 页") */
}
return (uint16_t)(n * 2u);
}
/*
* 函数功能:逐行取数(偶数行 = 时间戳、奇数行 = 描述;值列恒空)
* 入口参数:a_inst - 记录页实例 ui_w_records_t *
* a_row - 全局行下标 uint16_t
* a_name - 名输出缓冲 char *
* a_value- 值输出缓冲(恒写空串) char *
* 限定条件:页面打开中(框架绘制/按键上下文,uiTask)
*/
void ui_w_records_refresh(ui_w_records_t *a_inst, uint16_t a_row, char *a_name, char *a_value) {
uint32_t n = syslog_count(a_inst->id);
a_value[0] = '\0';
if (n == 0u) {
(void)memcpy(a_name, "无记录", sizeof("无记录"));
return;
}
{
uint32_t rec = a_row / 2u;
if (!a_inst->cache_valid || rec != a_inst->last_rec) {
if (syslog_get_record(a_inst->id, rec, a_inst->ts, sizeof(a_inst->ts),
a_inst->desc, sizeof(a_inst->desc)) != 0) {
a_name[0] = '\0'; /* 读失败(越界/存储异常):空行防御 */
return;
}
a_inst->last_rec = rec;
a_inst->cache_valid = 1u;
}
if ((a_row % 2u) == 0u) {
(void)memcpy(a_name, a_inst->ts, sizeof(a_inst->ts));
}
else {
(void)memcpy(a_name, a_inst->desc, sizeof(a_inst->desc));
}
}
}
+59
View File
@@ -0,0 +1,59 @@
/*
* 模块名称:UI 记录页共享组件(运行记录 / 自检记录两页的公共实现)
* 模块功能:把"定长记录 -> 每记录 2 行(偶数行时间戳、奇数行描述)+ 同记录读盘缓存
* + 空态单条伪行"这套逻辑收成一份,供多个日志页按实例复用
* 适用范围:Drivers/BSP/UI(仅 UI 层,数据源固定为 sys_log API)
* 说明:缓存必须按实例存放而非文件级静态——两页共用代码但各有独立实例,
* 若共享缓存,从 A 页切到 B 页会命中上一记录号而显示另一页的陈旧行(静默错数据)。
* 作者:王建锋
* 创建日期:2026-10-20
* 修改记录:
* v1.0 2026-10-20 王建锋 创建(W6 U2:合并 ui_page_runlog / ui_page_selftest 的重复实现)
*/
#ifndef UI_W_RECORDS_H
#define UI_W_RECORDS_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include "sys_log.h"
/*
* 记录页实例:日志源 + 该实例自己的读盘缓存
* 用法:页面文件里 static ui_w_records_t s_rec = { SYSLOG_XXX };
* 其余字段自动清零,即"缓存初始无效",与合并前两页的行为一致。
*/
typedef struct {
syslog_id_t id; /* 日志源 ID(决定读哪个记录文件) */
uint8_t cache_valid; /* 缓存有效标志(0 = 无缓存) */
uint32_t last_rec; /* 已缓存的记录序号 */
char ts[SYSLOG_TS_LEN + 1u]; /* 时间戳缓存(含 NUL) */
char desc[SYSLOG_DESC_MAX + 1u];/* 描述缓存(含 NUL) */
} ui_w_records_t;
/*
* 函数功能:总行数(动态;每条记录 2 行,空日志 = 单条伪行"无记录")
* 入口参数:inst - 记录页实例 ui_w_records_t *
* 返回值:总行数 uint16_t
*/
uint16_t ui_w_records_count(ui_w_records_t *a_inst);
/*
* 函数功能:逐行取数(偶数行 = 时间戳、奇数行 = 描述;值列恒空)
* 入口参数:inst - 记录页实例 ui_w_records_t *
* row - 全局行下标 uint16_t
* name - 名输出缓冲(框架栈缓冲 UI_BUF_STRLEN=32,含 NUL) char *
* value - 值输出缓冲(同上;本组件恒写空串) char *
* 限定条件:页面打开中(框架绘制/按键上下文,uiTask)
*/
void ui_w_records_refresh(ui_w_records_t *a_inst, uint16_t a_row, char *a_name, char *a_value);
#ifdef __cplusplus
}
#endif
#endif /* UI_W_RECORDS_H */
+5
View File
@@ -3506,6 +3506,11 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\Drivers\BSP\UI\ui_page_registry.c</FilePath> <FilePath>..\Drivers\BSP\UI\ui_page_registry.c</FilePath>
</File> </File>
<File>
<FileName>ui_w_records.c</FileName>
<FileType>1</FileType>
<FilePath>..\Drivers\BSP\UI\ui_w_records.c</FilePath>
</File>
<File> <File>
<FileName>ui_style.c</FileName> <FileName>ui_style.c</FileName>
<FileType>1</FileType> <FileType>1</FileType>
@@ -36,10 +36,10 @@
<!-- MEM_SNAPSHOT:BEGIN generated by scripts/check_mem_numbers.py --> <!-- MEM_SNAPSHOT:BEGIN generated by scripts/check_mem_numbers.py -->
| 区域 | 用量 | 容量 | 占比 | | 区域 | 用量 | 容量 | 占比 |
|---|---|---|---| |---|---|---|---|
| ER_IROM1 | 232,052 B (226.61 KB) | 1,048,576 B (1024 KB) | 22.1% | | ER_IROM1 | 231,936 B (226.50 KB) | 1,048,576 B (1024 KB) | 22.1% |
| RW_IRAM1 | 75,232 B (73.47 KB) | 131,072 B (128 KB) | 57.4% | | RW_IRAM1 | 75,240 B (73.48 KB) | 131,072 B (128 KB) | 57.4% |
| RW_CCM | 57,376 B (56.03 KB) | 65,280 B (64 KB) | 87.9% | | RW_CCM | 57,376 B (56.03 KB) | 65,280 B (64 KB) | 87.9% |
| **Flash (ROM 合计)** | **233,192 B (227.7 KB)** | 1,048,576 B (1024 KB) | **22.2%** | | **Flash (ROM 合计)** | **233,120 B (227.7 KB)** | 1,048,576 B (1024 KB) | **22.2%** |
<!-- MEM_SNAPSHOT:END --> <!-- MEM_SNAPSHOT:END -->
各区的容量与常量来源: 各区的容量与常量来源:
+3 -3
View File
@@ -15,16 +15,16 @@
<!-- MEM_BUDGET:BEGIN generated by scripts/ram_baseline.py --> <!-- MEM_BUDGET:BEGIN generated by scripts/ram_baseline.py -->
| 区域 | 用量 | 容量 | 占比 | 门禁(≤92%) | | 区域 | 用量 | 容量 | 占比 | 门禁(≤92%) |
|---|---|---|---|---| |---|---|---|---|---|
| ER_IROM1 (Flash) | 232,052 B | 1,048,576 B | 22.1% | 参考 | | ER_IROM1 (Flash) | 231,936 B | 1,048,576 B | 22.1% | 参考 |
| RW_CCM | 57,376 B | 65,280 B | 87.9% | PASS | | RW_CCM | 57,376 B | 65,280 B | 87.9% | PASS |
| UNINIT_CCM | 48 B | 256 B | 18.8% | 参考 | | UNINIT_CCM | 48 B | 256 B | 18.8% | 参考 |
| RW_IRAM1 | 75,232 B | 131,072 B | 57.4% | PASS | | RW_IRAM1 | 75,240 B | 131,072 B | 57.4% | PASS |
| 子系统(静态 RW+ZI;除 RTOS 堆在 CCM 外均在 SRAM1) | 现值 | 配额 | 状态 | | 子系统(静态 RW+ZI;除 RTOS 堆在 CCM 外均在 SRAM1) | 现值 | 配额 | 状态 |
|---|---|---|---| |---|---|---|---|
| 网络 | 13,690 B | 12 KB | ⚠ 超 1.4 KB | | 网络 | 13,690 B | 12 KB | ⚠ 超 1.4 KB |
| 存储 | 7,056 B | 12 KB | OK | | 存储 | 7,056 B | 12 KB | OK |
| UI | 30,416 B | 16 KB | ⚠ 超 13.7 KB | | UI | 30,422 B | 16 KB | ⚠ 超 13.7 KB |
| RTOS 堆 | 57,376 B | 56 KB | 堆=配额 | | RTOS 堆 | 57,376 B | 56 KB | 堆=配额 |
| 应用 | 14,911 B | 8 KB | ⚠ 超 6.6 KB | | 应用 | 14,911 B | 8 KB | ⚠ 超 6.6 KB |
| 其它 | 9,184 B | — | 参考 | | 其它 | 9,184 B | — | 参考 |
+1 -1
View File
@@ -3,4 +3,4 @@ date code ro rw zi er_irom1 er_pct iram1 iram1_pct ccm ccm_pct top_rwzi
2026-10-13 211456 18760 1104 154232 230216 22.0 97912 74.7 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=40960;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;default_task.o=2736;sys_log_mcu.o=1924 2026-10-13 211456 18760 1104 154232 230216 22.0 97912 74.7 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=40960;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;default_task.o=2736;sys_log_mcu.o=1924
2026-10-14 212296 18740 1112 154456 231036 22.0 98144 74.9 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=40960;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;default_task.o=2736;sys_log_mcu.o=1924 2026-10-14 212296 18740 1112 154456 231036 22.0 98144 74.9 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=40960;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;default_task.o=2736;sys_log_mcu.o=1924
2026-10-15 213540 18740 1136 131520 232280 22.2 75232 57.4 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;sys_log_mcu.o=3588;default_task.o=2736 2026-10-15 213540 18740 1136 131520 232280 22.2 75232 57.4 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;sys_log_mcu.o=3588;default_task.o=2736
2026-10-20 213472 18580 1140 131516 232052 22.1 75232 57.4 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;sys_log_mcu.o=3588;default_task.o=2736 2026-10-20 213356 18580 1184 131480 231936 22.1 75240 57.4 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;sys_log_mcu.o=3588;default_task.o=2736
1 date code ro rw zi er_irom1 er_pct iram1 iram1_pct ccm ccm_pct top_rwzi
3 2026-10-13 211456 18760 1104 154232 230216 22.0 97912 74.7 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=40960;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;default_task.o=2736;sys_log_mcu.o=1924
4 2026-10-14 212296 18740 1112 154456 231036 22.0 98144 74.9 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=40960;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;default_task.o=2736;sys_log_mcu.o=1924
5 2026-10-15 213540 18740 1136 131520 232280 22.2 75232 57.4 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;sys_log_mcu.o=3588;default_task.o=2736
6 2026-10-20 213472 213356 18580 1140 1184 131516 131480 232052 231936 22.1 75232 75240 57.4 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;sys_log_mcu.o=3588;default_task.o=2736
+1
View File
@@ -96,6 +96,7 @@ set(UI_SOURCES
${UI_DIR}/ui_net_sink.c ${UI_DIR}/ui_net_sink.c
${UI_DIR}/ui_page_registry.c ${UI_DIR}/ui_page_registry.c
${UI_DIR}/ui_style.c ${UI_DIR}/ui_style.c
${UI_DIR}/ui_w_records.c
) )
# 运行/自检记录引擎(双端共享核心 + 平台存储后端;MCU 端编 sys_log_mcu.c,见 Keil 工程) # 运行/自检记录引擎(双端共享核心 + 平台存储后端;MCU 端编 sys_log_mcu.c,见 Keil 工程)