查看C程序Flash 和RAM 资源占用说明文档
📎 原始文档:https://www.kdocs.cn/l/cgvr85VCNiN6 查看C程序Flash 和RAM 资源占用说明文档
4.1.7.2. 查看使用细节,即每个函数、变量的大小 — JL Project Documentation (zh-jieli.com)
一、C程序的内存分布情况
在C程序中,可执行文件的内存布局通常分为以下几个段,各段存储的内容及其对应的变量类型如下:
1. text 段(代码段)
- 存储内容:程序的可执行代码(机器指令),例如函数体(包括main函数和其他函数)、控制逻辑等。
- 特点:只读(防止程序运行时被意外修改)。
- 对应关系:所有函数的代码均存放在此段。
2. data 段(数据段)
- 存储内容:已初始化的全局变量、静态变量(包括全局静态变量和局部静态变量)。
- 特点:在程序启动时分配空间,初始值直接存储在可执行文件中。
- 对应变量示例: int global_init = 42; // 全局变量(已初始化)→ data段
static int static_init = 10; // 全局静态变量(已初始化)→ data段
void func() {
static int local_static = 5; // 局部静态变量(已初始化)→ data段
}
3. bss 段(未初始化数据段)
- 存储内容:未初始化或显式初始化为0的全局变量、静态变量。
- 特点:在程序加载时由系统自动初始化为零值(或空指针),不占用可执行文件的实际存储空间(仅记录所需空间大小)。
- 对应变量示例: int global_uninit; // 全局变量(未初始化)→ bss段
static int static_uninit; // 全局静态变量(未初始化)→ bss段
void func() {
static int local_static_uninit; // 局部静态变量(未初始化)→ bss段
}
其他内存区域
- 栈(Stack):存放局部非静态变量、函数参数等,生命周期与函数调用相关。 void func() {
int local_var = 20; // 局部变量 → 栈
} - 堆(Heap):动态分配的内存(如malloc/free),由程序员手动管理。 int*ptr =malloc(sizeof(int));// 动态内存 → 堆
- 只读数据段(.rodata):存放常量(如字符串常量、const修饰的全局变量)。 constint global_const =100;// 可能存放在.rodata段char*str ="hello";// 字符串"hello" → .rodata段

二、哪些会消耗RAM和占用flash 空间
1. 消耗Flash的段
Flash(程序存储器)用于存储程序的静态内容,包括:
- text段(代码段):存放可执行代码(函数体的机器指令)。
- data段(已初始化数据):存放全局变量、静态变量的初始值。这些初始值会被编译到可执行文件中,因此占用Flash空间。
- .rodata段(只读数据):存放字符串常量、const修饰的全局变量等,例如 const int x = 10; 或 char *str = "hello";。
2. 消耗RAM的段
RAM(运行时内存)用于存储程序运行时的动态数据,包括:
- data段:程序启动时,已初始化的全局/静态变量的初始值会从Flash复制到RAM中,因此data段占用双重空间(Flash存初始值,RAM存运行时数据)。
- bss段:未初始化或初始化为0的全局/静态变量,仅在RAM中分配空间(系统自动初始化为0,不占用Flash)。
- 堆(Heap):动态分配的内存(如malloc/free),运行时从RAM中分配。
- 栈(Stack):局部变量、函数参数等,运行时从RAM中分配。

实际开发中的优化
- 减少Flash占用:避免全局变量初始化非零值、精简代码。一般减少text +data端的占用
- 减少RAM占用:减少全局/静态变量、控制堆栈大小、使用const修饰常量。一般减少data+bss的占用。
三 、杰理芯片查看程序使用空间
查看使用细节,即每个函数、变量的大小
通过下面链接获取脚本,cmd 运行 指令
python .\report_elf_sizes.py --elf sdk.elf --output symbol_tbl.html
或者直接查看symbol_tbl.txt 查看对应文件 函数和变量大小
4.1.7.2. 查看使用细节,即每个函数、变量的大小 — JL Project Documentation (zh-jieli.com)
如:ui_show_page_list 变量占用大小 :
同时使用脚本生成的html 文件,方便逐个文件查看
四、707 压缩升级
目前这种升级方式仅支持升级文件放到本地触发升级的形式,也就是搬运升级。
把完整的update.ufw 写入到对应地址,如果该升级包能实现压缩就比较有效去省下升级包占用空间。
单备份压缩升级补丁v1.1.rar
项目参考案例:
原本 388K 缩减(压缩后升级包)jl_com.ufw 279K 。升级文件相对原本update.ufw 缩减108K 能够正常升级 。
另:压缩升级如果之前固件不支持压缩升级,需要OTA 一版中间过渡版本或者直接线刷。原因是原本固件不带解压缩搬运升级,需要先升级一版本带有解压缩搬运的固件,后续固件都可以用压缩升级。
中间版本如果update.ufw过大需要修改如下,注释掉框内:(如果flash 空间足够可以不修改)
用生成的update.ufw 去升级固件后就带有解压缩功能。后续可以用jl_com.ufw实现正常压缩升级。