4c21cff753
现象:抓自检台账基线那次 FTP 会话一结束,设备就打 `[ERR] [FTP] error reading next command`, 本次 `@test` 直接 FAIL(Forbidden 含 `[ERR]`)。查下去发现 lftpd 把**全部**异常路径一律按 error 级打,其中九处其实由外部输入决定:客户端关窗口、连上就走、PASV 后不建数据连接、 运维改 IP 触发监听重建。两条代价:① 任何人"连 21 端口一下就断开"就能把一次启动测试打成 FAIL;② 同样的动作可以**无限制造固件级 ERROR 日志**——日志面与门禁面都可被外部驱动, 工业现场过不了审。 **做法**:`private/lftpd_log.h` 新增 `lftpd_log_peer()`(info 级,带 `[FTP]` 前缀),而不是 就地改成 `DBG_INFO`——让"谁才算真故障"在读代码时一目了然,也防止后来者顺手把对端行为升回 error。降级的九处:控制通道被对端关闭(原 `error reading next command`,改为 `control channel closed by peer (ret=%d)`,措辞原先把正常收尾写成故障、误导过排查方向)、 发送 220 前对端已走、`listener rebuilt`(网络重建,原因由 accept 层自己记)、四处 `data accept failed`(PASV 后没来数据连接)、`accept timeout`。 **刻意留在 error 的**:create/bind/listen/取端口失败、写通道失败、文件打开失败、 `DOWNLOAD/UPLOAD FAILED`(对端中途退出确实让一次传输没走完 = 数据完整性事件, `../问题记录/CH395F_Trap_Records.md` 的中止家族要靠这些锚点定位)、 `data listener disarmed`(控制连接还活着而我方数据监听已不在服役 = 本侧异常,就地注明)。 **实测划清的边界**:客户端**干净收尾**(发 `QUIT` 或 FIN 半关)现在整条链路没有任何 `[ERR]`; 但 **RST 硬拆**(`SO_LINGER` 清零 / 进程被杀 / 拔线)仍会留一条 `[ERR][NET] sockN TIMEOUT`—— 那是 net 层的套接字超时锚点,网络自愈架构判据要读它,不在本次降级范围。所以"采集窗口内别跑 `data listener disarmed`(控制连接还活着而我方数据监听已不在服役 = 本侧异常,就地注明)。 **真机验证**:`@build` 0 错 0 警告;`@test --require-selftest-pass --device-ip` → **PASS** (基线 29 条 → 本次无新增;`net init: OK` 726 ms);专门写了 RST 复现脚本(登录后 `SO_LINGER` 清零直接关)→ 串口得到 `[FTP] control channel closed by peer (ret=-1)`,**不再是 `[ERR]` 行**; 同一份日志里 QUIT 收尾的那次会话完全没有错误行。 体量:`Code` 213,236 → **213,264 B(+28)**、`RO` 18,580 → **18,652 B(+72)**(措辞变长), 同一份日志里 QUIT 收尾的那次会话完全没有错误行。 `ZI` 131,500、`RW_IRAM1` 75,264 B 57.4% / `RW_CCM` 57,376 B 87.9% 全不变)。数字联动照做: 两份 `data/` 快照、`ram_baseline --update/--write`、`check_mem_numbers --write`、FLASH 配图 常量重算重生成(桶合计 = 231,916 与 `Code+RO` 相符;越界复查 0)、报告 §1.3/§5.1/§5.4 与 部署文档 §3.3 同步。 口径落文:新增 `docs/架构设计/STM32F4-Base存储架构说明.md` §10.3「FTP 日志级别划分:对端行为 vs 固件故障」(含两类的判据表与边界),并更新 `docs/测试说明/自动化测试流程.md` 的采集窗口警示。 顺手把 `private/lftpd_log.h` 工作区的 CRLF 混用归一回 LF(仓库里 blob 本来就是 LF,diff 无影响)。 门禁:`doc-links --all --sections-strict` 146 文档 0 问题、`id-check --strict` 增量拦截通过 (可判定 82.82%)、`mem-numbers` / `mem-budget` / `layer-deps` 全绿;改动文件字节卫生 BOM 无 / CR 0 / U+FFFD 0 / 无行尾空格。未推送。
12 KiB
12 KiB
STM32F4-Base RAM/Flash Usage Report
Generated: 2026-10-22 22:26 Map:
STM32F407-Demo.map
1. Grand Totals (全局总量)
| Metric | Value |
|---|---|
| Code (inc. data) | 213,264 B (208.3 KB) |
| RO Data | 18,652 B (18.2 KB) |
| RW Data (initialized) | 1,188 B (1.16 KB) |
| ZI Data (zero-init) | 131,500 B (128.4 KB) |
| Total RO (Code + RO) | 231,916 B (226.5 KB) |
| Total RW (RW + ZI) = SRAM used | 132,688 B (129.58 KB) |
| Total ROM (Code + RO + RW init) | 233,104 B (227.6 KB) |
2. 执行区水位 (Execution Regions)
| Region | Base | Size | Max | Util% |
|---|---|---|---|---|
| ER_IROM1 | 0x08000000 | 231,916 B (226.48 KB) | 1,048,576 B (1024 KB) | 22.1% |
| RW_CCM | 0x10000000 | 57,376 B (56.03 KB) | 65,280 B (64 KB) | 87.9% |
| UNINIT_CCM | 0x1000FF00 | 48 B (0.05 KB) | 256 B (0 KB) | 18.8% |
| RW_IRAM1 | 0x20000000 | 75,264 B (73.50 KB) | 131,072 B (128 KB) | 57.4% |
3. RW_IRAM1 逐符号明细(ZI + RW,按大小降序)
| # | Address | Size (B) | Size (KB) | Type | Section | Object |
|---|---|---|---|---|---|---|
| 1 | 0x2000ADC8 | 16,384 | 16.00 | Zero | .bss | lv_mem_core_builtin.o |
| 2 | 0x20007EB4 | 7,724 | 7.54 | Zero | .bss | lftpd.o |
| 3 | 0x200107A4 | 6,746 | 6.59 | Zero | .bss | ui_net_sink.o |
| 4 | 0x2000EDC8 | 6,408 | 6.26 | Zero | .bss | ui_port.o |
| 5 | 0x2000667C | 6,200 | 6.05 | Zero | .bss | nand_ftl.o |
| 6 | 0x20004E18 | 4,152 | 4.05 | Zero | .bss | ch395f.o |
| 7 | 0x20002058 | 4,096 | 4.00 | Zero | .bss | console_log.o |
| 8 | 0x20001278 | 3,552 | 3.47 | Zero | .bss | sys_log_mcu.o |
| 9 | 0x20003644 | 2,724 | 2.66 | Zero | .bss | default_task.o |
| 10 | 0x2000A524 | 1,720 | 1.68 | Zero | .bss | cmsis_os2.o |
| 11 | 0x2000444C | 1,440 | 1.41 | Zero | .bss | sample_ring.o |
| 12 | 0x20009F48 | 1,220 | 1.19 | Zero | .bss | tasks.o |
| 13 | 0x20000D78 | 1,104 | 1.08 | Zero | .bss | cfg_file_store_mcu.o |
| 14 | 0x20003058 | 1,064 | 1.04 | Zero | .bss | soe_store.o |
| 15 | 0x20012200 | 1,024 | 1.00 | Zero | startup_stm32f407xx.o | |
| 16 | 0x20005E50 | 800 | 0.78 | Zero | .bss | gd5f2gq5ue.o |
| 17 | 0x200040E8 | 712 | 0.70 | Zero | .bss | iec104_serv.o |
| 18 | 0x20000AB8 | 704 | 0.69 | Zero | .bss | cfg_file.o |
| 19 | 0x200005D0 | 560 | 0.55 | Zero | .bss | spi.o |
| 20 | 0x20000848 | 552 | 0.54 | Zero | .bss | usart.o |
| 21 | 0x20009CE0 | 552 | 0.54 | Zero | .bss | lftpd_io.o |
| 22 | 0x2000ABDC | 492 | 0.48 | Zero | .bss | lv_init.o |
| 23 | 0x20004C38 | 480 | 0.47 | Zero | .bss | freq.o |
| 24 | 0x2000629C | 416 | 0.41 | Zero | .bss | net_socket.o |
| 25 | 0x200064DC | 416 | 0.41 | Zero | .bss | net_pending.o |
| 26 | 0x200034C4 | 384 | 0.38 | Zero | .bss | task_prof.o |
| 27 | 0x20004A8C | 320 | 0.31 | Zero | .bss | prot_set.o |
| 28 | 0x2000A40C | 280 | 0.27 | Zero | .bss | timers.o |
| 29 | 0x20006190 | 268 | 0.26 | Zero | .bss | rs485.o |
| 30 | 0x200011C8 | 176 | 0.17 | Zero | .bss | prot_set_store.o |
| 31 | 0x200004C8 | 168 | 0.16 | Zero | .bss | adc.o |
| 32 | 0x200002B4 | 160 | 0.16 | Data | .data | lftpd.o |
| 33 | 0x200049EC | 160 | 0.16 | Zero | .bss | phasor.o |
| 34 | 0x200106D0 | 152 | 0.15 | Zero | .bss | ui_menu_view.o |
| 35 | 0x2000643C | 128 | 0.12 | Zero | .bss | net_listener.o |
| 36 | 0x20004BCC | 108 | 0.11 | Zero | .bss | prot_elm.o |
| 37 | 0x20000570 | 84 | 0.08 | Zero | .bss | i2c.o |
| 38 | 0x200043F8 | 84 | 0.08 | Zero | .bss | adc_input.o |
| 39 | 0x20000250 | 83 | 0.08 | Data | .data | ftp_cfg.o |
| 40 | 0x20000800 | 72 | 0.07 | Zero | .bss | tim.o |
| 41 | 0x20000A70 | 72 | 0.07 | Zero | .bss | stm32f4xx_hal_timebase_tim.o |
| 42 | 0x20003480 | 68 | 0.07 | Zero | .bss | task_watchdog.o |
| 43 | 0x20000484 | 65 | 0.06 | Zero | .bss | freertos.o |
| 44 | 0x20009F08 | 64 | 0.06 | Zero | .bss | queue.o |
| 45 | 0x20000358 | 60 | 0.06 | Data | .data | tasks.o |
| 46 | 0x20000410 | 60 | 0.06 | Data | .data | ui_page_selftest.o |
| 47 | 0x20010768 | 60 | 0.06 | Zero | .bss | ui_page_runlog.o |
| 48 | 0x20000150 | 48 | 0.05 | Data | .data | adc_health.o |
| 49 | 0x200043C8 | 48 | 0.05 | Zero | .bss | iec104_pts.o |
| 50 | 0x20000000 | 44 | 0.04 | Data | .data | freertos.o |
| 51 | 0x2000009C | 44 | 0.04 | Data | .data | task_watchdog.o |
| 52 | 0x20000044 | 36 | 0.04 | Data | .data | sys_log_mcu.o |
| 53 | 0x2000022C | 36 | 0.04 | Data | .data | net_cfg.o |
| 54 | 0x2000044C | 32 | 0.03 | Data | .data | ui_standby.o |
| 55 | 0x20006170 | 32 | 0.03 | Zero | .bss | tpafe5160.o |
| 56 | 0x200064BC | 32 | 0.03 | Zero | .bss | net_events.o |
| 57 | 0x20000128 | 28 | 0.03 | Data | .data | adc_input.o |
| 58 | 0x20000068 | 24 | 0.02 | Data | .data | console_log.o |
| 59 | 0x200000E4 | 24 | 0.02 | Data | .data | adc_task.o |
| 60 | 0x20000180 | 24 | 0.02 | Data | .data | prot_set.o |
| 61 | 0x2000019C | 24 | 0.02 | Data | .data | freq.o |
| 62 | 0x20000200 | 24 | 0.02 | Data | .data | net_listener.o |
| 63 | 0x200043B0 | 24 | 0.02 | Zero | .bss | protect_task.o |
| 64 | 0x20000030 | 20 | 0.02 | Data | .data | cfg_file.o |
| 65 | 0x20000080 | 20 | 0.02 | Data | .data | soe_store.o |
| 66 | 0x200001D0 | 20 | 0.02 | Data | .data | gd5f2gq5ue.o |
| 67 | 0x20000394 | 20 | 0.02 | Data | .data | timers.o |
| 68 | 0x2000046C | 20 | 0.02 | Data | .data | ui_net_sink.o |
| 69 | 0x200003D4 | 18 | 0.02 | Data | .data | ui_menu.o |
| 70 | 0x200000FC | 16 | 0.02 | Data | .data | iec104_serv.o |
| 71 | 0x20000118 | 16 | 0.02 | Data | .data | iec104_pts.o |
| 72 | 0x200001F0 | 16 | 0.02 | Data | .data | net_socket.o |
| 73 | 0x20000218 | 16 | 0.02 | Data | .data | net_events.o |
| 74 | 0x200002A4 | 16 | 0.02 | Data | .data | nand_ftl.o |
| 75 | 0x200003F0 | 16 | 0.02 | Data | .data | ui_content_page.o |
| 76 | 0x200000D4 | 12 | 0.01 | Data | .data | default_task.o |
| 77 | 0x200001B4 | 12 | 0.01 | Data | .data | stm32f4xx_hal.o |
| 78 | 0x200001E4 | 12 | 0.01 | Data | .data | tpafe5160.o |
| 79 | 0x200003AC | 12 | 0.01 | Data | .data | port.o |
| 80 | 0x200003C8 | 12 | 0.01 | Data | .data | ui_port.o |
| 81 | 0x20000400 | 12 | 0.01 | Data | .data | ui_page_password.o |
| 82 | 0x200005C4 | 12 | 0.01 | Zero | .bss | iwdg.o |
| 83 | 0x200001C4 | 10 | 0.01 | Data | .data | ch395f.o |
| 84 | 0x20000094 | 8 | 0.01 | Data | .data | sys_clock.o |
| 85 | 0x200000C8 | 8 | 0.01 | Data | .data | task_prof.o |
| 86 | 0x2000010C | 8 | 0.01 | Data | .data | protect_task.o |
| 87 | 0x20000144 | 8 | 0.01 | Data | .data | sample_ring.o |
| 88 | 0x200003B8 | 8 | 0.01 | Data | .data | ff.o |
| 89 | 0x200003C0 | 8 | 0.01 | Data | .data | ffsystem.o |
| 90 | 0x200003E8 | 8 | 0.01 | Data | .data | ui_menu_view.o |
| 91 | 0x2000002C | 4 | 0.00 | Data | .data | app_main.o |
| 92 | 0x200000D0 | 4 | 0.00 | Data | .data | vol_lock.o |
| 93 | 0x200000E0 | 4 | 0.00 | Data | .data | net_task.o |
| 94 | 0x200001C0 | 4 | 0.00 | Data | .data | system_stm32f4xx.o |
| 95 | 0x20000228 | 4 | 0.00 | Data | .data | net_pending.o |
| 96 | 0x20000354 | 4 | 0.00 | Data | .data | lftpd_io.o |
| 97 | 0x200003A8 | 4 | 0.00 | Data | .data | cmsis_os2.o |
| 98 | 0x20000480 | 4 | 0.00 | Data | .data | mc_w.l(errno.o) |
| 99 | 0x2000014C | 2 | 0.00 | Data | .data | phasor.o |
| 100 | 0x2000040C | 2 | 0.00 | Data | .data | ui_page_net_cfg.o |
| 101 | 0x20000198 | 1 | 0.00 | Data | .data | prot_elm.o |
| 75,243 | 73.48 | Total |
4. Image Component Sizes(RW + ZI > 0,按大小降序)
| # | Object | Code | RO | RW | ZI | RW+ZI |
|---|---|---|---|---|---|---|
| 1 | heap_4.o | 512 | 69 | 32 | 57,344 | 57,376 |
| 2 | lv_mem_core_builtin.o | 410 | 0 | 0 | 16,384 | 16,384 |
| 3 | lftpd.o | 6,180 | 509 | 160 | 7,724 | 7,884 |
| 4 | ui_net_sink.o | 1,126 | 67 | 20 | 6,746 | 6,766 |
| 5 | ui_port.o | 418 | 0 | 12 | 6,408 | 6,420 |
| 6 | nand_ftl.o | 2,352 | 175 | 16 | 6,200 | 6,216 |
| 7 | ch395f.o | 3,978 | 603 | 10 | 4,152 | 4,162 |
| 8 | console_log.o | 980 | 55 | 24 | 4,096 | 4,120 |
| 9 | sys_log_mcu.o | 3,074 | 83 | 36 | 3,552 | 3,588 |
| 10 | default_task.o | 2,332 | 280 | 12 | 2,724 | 2,736 |
| 11 | cmsis_os2.o | 1,496 | 0 | 4 | 1,720 | 1,724 |
| 12 | sample_ring.o | 292 | 0 | 8 | 1,440 | 1,448 |
| 13 | tasks.o | 4,342 | 0 | 60 | 1,220 | 1,280 |
| 14 | cfg_file_store_mcu.o | 380 | 24 | 0 | 1,104 | 1,104 |
| 15 | soe_store.o | 816 | 28 | 20 | 1,064 | 1,084 |
| 16 | startup_stm32f407xx.o | 36 | 392 | 0 | 1,024 | 1,024 |
| 17 | gd5f2gq5ue.o | 3,954 | 478 | 20 | 800 | 820 |
| 18 | iec104_serv.o | 1,188 | 16 | 16 | 712 | 728 |
| 19 | cfg_file.o | 5,970 | 810 | 20 | 704 | 724 |
| 20 | spi.o | 584 | 0 | 0 | 560 | 560 |
| 21 | lftpd_io.o | 1,198 | 0 | 4 | 552 | 556 |
| 22 | usart.o | 884 | 0 | 0 | 552 | 552 |
| 23 | freq.o | 764 | 8 | 24 | 480 | 504 |
| 24 | lv_init.o | 156 | 0 | 0 | 492 | 492 |
| 25 | net_socket.o | 4,944 | 443 | 16 | 416 | 432 |
| 26 | net_pending.o | 1,400 | 0 | 4 | 416 | 420 |
| 27 | task_prof.o | 638 | 185 | 8 | 384 | 392 |
| 28 | prot_set.o | 844 | 640 | 24 | 320 | 344 |
| 29 | timers.o | 1,232 | 0 | 20 | 280 | 300 |
| 30 | rs485.o | 120 | 0 | 0 | 268 | 268 |
| 31 | prot_set_store.o | 236 | 74 | 0 | 176 | 176 |
| 32 | adc.o | 580 | 0 | 0 | 168 | 168 |
| 33 | phasor.o | 420 | 258 | 2 | 160 | 162 |
| 34 | task_watchdog.o | 1,110 | 137 | 44 | 116 | 160 |
| 35 | ui_menu_view.o | 2,034 | 16 | 8 | 152 | 160 |
| 36 | net_listener.o | 948 | 207 | 24 | 128 | 152 |
| 37 | adc_input.o | 592 | 27 | 28 | 84 | 112 |
| 38 | freertos.o | 716 | 592 | 44 | 65 | 109 |
| 39 | prot_elm.o | 708 | 227 | 1 | 108 | 109 |
| 40 | i2c.o | 168 | 0 | 0 | 84 | 84 |
| 41 | ftp_cfg.o | 152 | 225 | 83 | 0 | 83 |
| 42 | stm32f4xx_hal_timebase_tim.o | 152 | 0 | 0 | 72 | 72 |
| 43 | tim.o | 168 | 0 | 0 | 72 | 72 |
| 44 | iec104_pts.o | 1,082 | 132 | 16 | 48 | 64 |
| 45 | queue.o | 2,840 | 0 | 0 | 64 | 64 |
| 46 | ui_page_runlog.o | 28 | 105 | 0 | 60 | 60 |
| 47 | ui_page_selftest.o | 28 | 109 | 60 | 0 | 60 |
| 48 | adc_health.o | 432 | 0 | 48 | 0 | 48 |
| 49 | net_events.o | 1,994 | 809 | 16 | 32 | 48 |
| 50 | tpafe5160.o | 808 | 67 | 12 | 32 | 44 |
| 51 | net_cfg.o | 832 | 103 | 36 | 0 | 36 |
| 52 | protect_task.o | 840 | 68 | 8 | 24 | 32 |
| 53 | ui_standby.o | 1,208 | 67 | 32 | 0 | 32 |
| 54 | adc_task.o | 1,520 | 234 | 24 | 0 | 24 |
| 55 | (incl. Padding) | 284 | 96 | 16 | 5 | 21 |
| 56 | ui_menu.o | 760 | 137 | 18 | 0 | 18 |
| 57 | ui_content_page.o | 1,664 | 81 | 16 | 0 | 16 |
| 58 | iwdg.o | 28 | 0 | 0 | 12 | 12 |
| 59 | port.o | 762 | 73 | 12 | 0 | 12 |
| 60 | stm32f4xx_hal.o | 116 | 0 | 12 | 0 | 12 |
| 61 | ui_page_password.o | 686 | 175 | 12 | 0 | 12 |
| 62 | ff.o | 7,962 | 282 | 8 | 0 | 8 |
| 63 | ffsystem.o | 204 | 20 | 8 | 0 | 8 |
| 64 | sys_clock.o | 1,788 | 286 | 8 | 0 | 8 |
| 65 | app_main.o | 2,272 | 65 | 4 | 0 | 4 |
| 66 | net_task.o | 1,460 | 72 | 4 | 0 | 4 |
| 67 | system_stm32f4xx.o | 16 | 24 | 4 | 0 | 4 |
| 68 | vol_lock.o | 92 | 0 | 4 | 0 | 4 |
| 69 | errno.o | 20 | 0 | 4 | 0 | 4 |
| 70 | ui_page_net_cfg.o | 1,004 | 105 | 2 | 0 | 2 |
| All .o files | 213,264 | 18,652 | 1,188 | 131,500 | 132,688 |
5. Flash (Code + RO Data) Top-30(按大小降序)
| # | Object | Code | RO Data | Code+RO |
|---|---|---|---|---|
| 1 | ff.o | 7,962 | 282 | 8,244 |
| 2 | cfg_file.o | 5,970 | 810 | 6,780 |
| 3 | lftpd.o | 6,180 | 509 | 6,689 |
| 4 | net_socket.o | 4,944 | 443 | 5,387 |
| 5 | lv_indev.o | 4,928 | 0 | 4,928 |
| 6 | ch395f.o | 3,978 | 603 | 4,581 |
| 7 | ui_font_cn_12.o | 0 | 4,545 | 4,545 |
| 8 | lv_obj_pos.o | 4,526 | 16 | 4,542 |
| 9 | lv_refr.o | 4,486 | 0 | 4,486 |
| 10 | gd5f2gq5ue.o | 3,954 | 478 | 4,432 |
| 11 | tasks.o | 4,342 | 0 | 4,342 |
| 12 | lv_obj_scroll.o | 4,126 | 0 | 4,126 |
| 13 | lv_obj_style.o | 4,106 | 0 | 4,106 |
| 14 | lv_draw_sw_mask.o | 3,862 | 0 | 3,862 |
| 15 | stm32f4xx_hal_spi.o | 3,586 | 0 | 3,586 |
| 16 | lv_draw_sw_box_shadow.o | 3,246 | 0 | 3,246 |
| 17 | sys_log_mcu.o | 3,074 | 83 | 3,157 |
| 18 | lv_indev_scroll.o | 3,068 | 0 | 3,068 |
| 19 | lv_obj.o | 2,982 | 43 | 3,025 |
| 20 | lv_draw_sw_img.o | 2,960 | 0 | 2,960 |
| 21 | queue.o | 2,840 | 0 | 2,840 |
| 22 | journal.o | 2,834 | 0 | 2,834 |
| 23 | iec104_link.o | 2,824 | 0 | 2,824 |
| 24 | net_events.o | 1,994 | 809 | 2,803 |
| 25 | default_task.o | 2,332 | 280 | 2,612 |
| 26 | nand_ftl.o | 2,352 | 175 | 2,527 |
| 27 | app_main.o | 2,272 | 65 | 2,337 |
| 28 | printfa.o | 2,312 | 0 | 2,312 |
| 29 | stm32f4xx_hal_i2c.o | 2,294 | 0 | 2,294 |
| 30 | lv_display.o | 2,284 | 0 | 2,284 |
| All .o files | 213,264 | 18,652 | 231,916 |
自洽校验:per-file 213,264/18,652/1,188/131,500 vs Grand Totals 213,264/18,652/1,188/131,500(CodeΔ=+0 / ROΔ=+0 / RWΔ=+0 / ZIΔ=+0;精确一致(含 '('incl. Generated)'-'(incl. Padding)' 台账行))→ PASS