1. 单片机存储资源介绍
单片机的存储资源主要分为程序存储器和数据存储器两大类,分别用于存放程序代码和数据。
程序存储器
用于存放程序代码,分为只读存储器(ROM)和可擦写存储器(如 Flash)。ROM 中的代码不可修改,适合存放固化的程序;Flash 支持多次擦写,用于存储可更新的程序代码。例如 STM32F103C8T6 的 ROM 容量为 64KB,地址范围从 0x8000000 开始。
数据存储器
由随机存取存储器(RAM)组成,分为内部和外部存储区域。内部 RAM(如 8051 单片机的 0x256 字节)通常包含工作寄存器和专用寄存器,外部 RAM(如 SRAM 或 DRAM)用于扩展存储容量。RAM 断电后数据丢失,但访问速度快,适合存储运行时的变量和临时数据。
存储空间分配
以 STM32 为例,其程序存储器(ROM+Flash)与数据存储器(RAM)分开管理:
- ROM/Flash:64KB(只读),存放代码和常量数据;
- RAM:20KB(可读写),用于局部变量、堆栈等动态数据;
2. C语言内存分区介绍
主要分为五个区域:
- 代码区(Code/Text):存放程序的机器代码指令,CPU 通过程序计数器逐条执行;
- 数据区(Data/BSS):包括全局变量、静态变量及常量,初始化数据长期驻留。已初始化全局/静态区(.data),未初始化全局/静态区(.bss)。
- 栈区(Stack):用于局部变量和函数参数的临时存储,遵循 FIFO 原则自动管理生命周期,由编译器自动分配释放;
- 堆区(Heap):由程序员通过 malloc 和 free 分配的动态内存,需手动释放,否则可能造成内存泄漏;
- 常量区:存放不可修改的常量数据(如字符串字面量);