C 内存分区

分区

编译:编译器编译链接烧录到芯片的代码期间

运行:芯片上电执行期间

分布

flash/rom ram
编译 code(.text),常量(.rodata),rw-data(.data)
运行 code(.text),常量(.rodata),rw-data(.data) rw-data(.data),zi-data(.bss),堆,栈

编译

code:也叫.text,只读,编译链接完成后的代码指令,cpu通过i-code总线读取;

常量:也叫.rodata,只读,运行时,cpu通过d-code总线读取;

rw-data:也叫.data,读写,编译阶段初始值非0 的全局/static变量(全局和局部),cpu通过d-code总线读取。
运行

rw-data(.data):芯片上电通过启动文件,将rw-data从flash复制到ram中,运行时cpu通过系统总线读写;

zi-data(.bss):也叫bss,读写,上电初始化时初始化为0/未初始化 的全局/static变量(全局和局部),cpu通过系统总线读写;

堆:手动分配和释放;

栈:编译器自动分配和释放。

总结

1、占用flash/rom大小:code+常量+rw-data

2、占用ram大小:rw-data+zi-data+堆+栈

3、cpu上电将rw-data复制到ram中(分析启动文件),通过i-code读取代码指令,d-code读取常量,系统总线读写ram中的rw-data、zi-data、堆、栈内容来使程序正常工作。

附:CM3总线框图

相关推荐
SoftLipaRZC9 小时前
C语言内存函数完全指南:memcpy/memmove/memset/memcmp
c语言·开发语言
金刚狼8810 小时前
用atomic解决全局变量跨线程修改的问题
c语言
SuperByteMaster10 小时前
callee和caller的区别
c语言
kkeeper~19 小时前
0基础C语言积跬步之数据在内存中的存储
c语言·数据结构·算法
qq38624619621 小时前
更新补发第6天:7天学会C语言,每天5分钟,不需要基础
c语言·for循环·循环语句·while循环·do-while循环
张暮笛1 天前
深入浅出:C语言中的“虚表分派”
c语言
社交怪人1 天前
【等差数列】信息学奥赛一本通C语言解法(题号1035)
c语言
不会C语言的男孩1 天前
VS Code 中搭建 C/C++ 开发环境(MSYS2 编译器)
c语言·c++
学困昇1 天前
Linux 信号机制详解:从 Ctrl+C 到 SIGCHLD,一文理解进程信号
linux·c语言·开发语言·人工智能·面试
AI科技星1 天前
维度原本——基于超复数谱系的全域维度统一理论
c语言·前端·javascript·网络·electron