Files
STM32F4-Base/docs/内存管理/data/ram_report_20261022.md
T
wandering1 7e77af08a0 fix(BSP): SPI1 完成标志收回 GD5F 私有,HAL 回调改契约转调
推荐清单第 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`(本次未被改写)。未推送。
2026-10-22 19:21:08 +08:00

12 KiB
Raw Blame History

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