7e77af08a0
推荐清单第 4a 步(结构债 S-2 剩余面里唯一带"静默失效"属性的那条)。 **问题不是风格**:HAL 的 SPI 完成/错误回调是**全局唯一符号**,整个工程只能有一份 实现,当前由 CH395F 代管并按 `hspi->Instance` 分发——于是 GD5F 的完成标志 `g_spi1_dma_done` 被 CH395F 跨模块裸 `extern` 直接写,**GD5F 出错时的"释放等待者" 寄居在别人的 .c 里**。谁哪天做"CH395F 清理",把那两个 `else if (SPI1)` 分支当无关 代码删掉:编译零报错,GD5F 的 DMA 等待在出错时只能干等 `GD5F_SPI_TIMEOUT` 兜底。 **改法(时序一字不动,只换所有权)**: · 标志收为 GD5F 文件内 `static volatile uint8_t s_spi1_dma_done`(6 处引用同步改名) · GD5F 导出 `gd5f_spi1_notify_done()` / `gd5f_spi1_notify_error()`,头文件里写明 "SPI1 分支必须转调这两个函数,否则本模块的 DMA 等待在出错时只能靠超时兜底" · CH395F 删除裸 `extern`、include `gd5f2gq5ue.h`、两个 SPI1 分支改为转调并就地注明 "勿删:少了这行 GD5F 的 DMA 出错只能靠超时退出" `HAL_SPI_AbortCpltCallback`(`HAL_SPI_DMAStop()` 会触发)本次**刻意不做**——它会改 变中止语义、需要真机专项,当前超时兜底可用(已在报告 §0.4 记为观察项)。 **体量代价**:`ch395f.o` −8 B、`gd5f2gq5ue.o` +24 B → `Code` 213,188 → **213,204 B (+16 B)**,RO/RW/ZI 全不变,`ER_IROM1` 231,768 → **231,784 B(22.1%)**。16 B 换 掉一个静默失效类,划算。 **真机 `@test` PASS**:无 `[ERR]`/Fault,复位原因 software;`[STACK] heap free=15800 min_ever=8464` 与改前**逐项相同**;各任务实测峰值 default 2152 / net 1116 / ftp 764 / ui 4052 / timesync 616 / adc 952 / iec104 540 / protect 624, **静态最坏链全部未变**(3024/1912/1456/4052/1264/1320/1456/872)→ 9/9 PASS。 ⚠ 记一条读数陷阱:测试脚本打印的 "boot to net init: OK = 7,907 ms" 是采集窗口 锚点造成的度量偏差,真机日志里 `boot: syslog init OK → net init: OK` 实测 ≈699 ms, 与改前一致,**不是性能回退**。 **数字联动**:`data/ram_report_20261022.md`、`data/stack_report_20261022.md` 重跑; `ram_baseline.py --update/--write`;`check_mem_numbers.py --write`(RAM 方案受管区 + 台账);`gen_memory_svg.py` 常量更新后重新生成 FLASH 与任务栈两张配图(逐文本按 字号与锚点复查越界 = 0;RAM 图无需变更);报告 §1.3/§5.1/§5.4、部署文档 §3.3 的 Flash 数字同步;§0.4/§9 的 S-2 口径改为"24 处手写已消 23 处,只剩 `net_socket.c:77`"。 门禁:`@build` 0 错 0 警告;`cubemx-survival --check`、`mem-numbers`、`mem-budget` (57.4% / 87.9%)、`task-table`、`doc-links --all --sections-strict`(146 文档 0 问题)、 `id-check --strict`(增量拦截通过、可判定 82.83%)全绿;字节卫生 BOM/CR/U+FFFD/尾 空格全清;未提交 UV4 抖动的 `.uvprojx`(本次未被改写)。未推送。
12 KiB
12 KiB
STM32F4-Base RAM/Flash Usage Report
Generated: 2026-10-22 19:14 Map:
STM32F407-Demo.map
1. Grand Totals (全局总量)
| Metric | Value |
|---|---|
| Code (inc. data) | 213,204 B (208.2 KB) |
| RO Data | 18,580 B (18.1 KB) |
| RW Data (initialized) | 1,184 B (1.16 KB) |
| ZI Data (zero-init) | 131,504 B (128.4 KB) |
| Total RO (Code + RO) | 231,784 B (226.4 KB) |
| Total RW (RW + ZI) = SRAM used | 132,688 B (129.58 KB) |
| Total ROM (Code + RO + RW init) | 232,968 B (227.5 KB) |
2. 执行区水位 (Execution Regions)
| Region | Base | Size | Max | Util% |
|---|---|---|---|---|
| ER_IROM1 | 0x08000000 | 231,784 B (226.35 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 | 0x20002054 | 4,096 | 4.00 | Zero | .bss | console_log.o |
| 8 | 0x20001274 | 3,552 | 3.47 | Zero | .bss | sys_log_mcu.o |
| 9 | 0x20003640 | 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 | 0x20000D74 | 1,104 | 1.08 | Zero | .bss | cfg_file_store_mcu.o |
| 14 | 0x20003054 | 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 | 0x20000AB4 | 704 | 0.69 | Zero | .bss | cfg_file.o |
| 19 | 0x200005CC | 560 | 0.55 | Zero | .bss | spi.o |
| 20 | 0x20000844 | 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 | 0x200034C0 | 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 | 0x200011C4 | 176 | 0.17 | Zero | .bss | prot_set_store.o |
| 31 | 0x200004C4 | 168 | 0.16 | Zero | .bss | adc.o |
| 32 | 0x200002B0 | 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 | 0x2000056C | 84 | 0.08 | Zero | .bss | i2c.o |
| 38 | 0x200043F8 | 84 | 0.08 | Zero | .bss | adc_input.o |
| 39 | 0x2000024C | 83 | 0.08 | Data | .data | ftp_cfg.o |
| 40 | 0x200007FC | 72 | 0.07 | Zero | .bss | tim.o |
| 41 | 0x20000A6C | 72 | 0.07 | Zero | .bss | stm32f4xx_hal_timebase_tim.o |
| 42 | 0x2000347C | 68 | 0.07 | Zero | .bss | task_watchdog.o |
| 43 | 0x20000480 | 65 | 0.06 | Zero | .bss | freertos.o |
| 44 | 0x20009F08 | 64 | 0.06 | Zero | .bss | queue.o |
| 45 | 0x20000354 | 60 | 0.06 | Data | .data | tasks.o |
| 46 | 0x2000040C | 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 | 0x20000228 | 36 | 0.04 | Data | .data | net_cfg.o |
| 54 | 0x20000448 | 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 | 0x200001FC | 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 | 0x20000390 | 20 | 0.02 | Data | .data | timers.o |
| 68 | 0x20000468 | 20 | 0.02 | Data | .data | ui_net_sink.o |
| 69 | 0x200003D0 | 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 | 0x20000214 | 16 | 0.02 | Data | .data | net_events.o |
| 73 | 0x200002A0 | 16 | 0.02 | Data | .data | nand_ftl.o |
| 74 | 0x200003EC | 16 | 0.02 | Data | .data | ui_content_page.o |
| 75 | 0x200000D4 | 12 | 0.01 | Data | .data | default_task.o |
| 76 | 0x200001B4 | 12 | 0.01 | Data | .data | stm32f4xx_hal.o |
| 77 | 0x200001E4 | 12 | 0.01 | Data | .data | tpafe5160.o |
| 78 | 0x200001F0 | 12 | 0.01 | Data | .data | net_socket.o |
| 79 | 0x200003A8 | 12 | 0.01 | Data | .data | port.o |
| 80 | 0x200003C4 | 12 | 0.01 | Data | .data | ui_port.o |
| 81 | 0x200003FC | 12 | 0.01 | Data | .data | ui_page_password.o |
| 82 | 0x200005C0 | 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 | 0x200003B4 | 8 | 0.01 | Data | .data | ff.o |
| 89 | 0x200003BC | 8 | 0.01 | Data | .data | ffsystem.o |
| 90 | 0x200003E4 | 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 | 0x20000224 | 4 | 0.00 | Data | .data | net_pending.o |
| 96 | 0x20000350 | 4 | 0.00 | Data | .data | lftpd_io.o |
| 97 | 0x200003A4 | 4 | 0.00 | Data | .data | cmsis_os2.o |
| 98 | 0x2000047C | 4 | 0.00 | Data | .data | mc_w.l(errno.o) |
| 99 | 0x2000014C | 2 | 0.00 | Data | .data | phasor.o |
| 100 | 0x20000408 | 2 | 0.00 | Data | .data | ui_page_net_cfg.o |
| 101 | 0x20000198 | 1 | 0.00 | Data | .data | prot_elm.o |
| 75,239 | 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,108 | 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,916 | 443 | 12 | 416 | 428 |
| 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 | 712 | 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 | (incl. Padding) | 284 | 96 | 16 | 9 | 25 |
| 55 | adc_task.o | 1,520 | 234 | 24 | 0 | 24 |
| 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,204 | 18,580 | 1,184 | 131,504 | 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,108 | 509 | 6,617 |
| 4 | net_socket.o | 4,916 | 443 | 5,359 |
| 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,204 | 18,580 | 231,784 |
自洽校验:per-file 213,204/18,580/1,184/131,504 vs Grand Totals 213,204/18,580/1,184/131,504(CodeΔ=+0 / ROΔ=+0 / RWΔ=+0 / ZIΔ=+0;精确一致(含 '('incl. Generated)'-'(incl. Padding)' 台账行))→ PASS