RAM 全称为 Random Access Memory,是用于临时存储数据的一种硬件装置。在嵌入式系统中,RAM 被分为两类:堆区和栈区。堆区指的是在程序运行时,动态分配的内存;栈区指的是程序运行时用来存储函数调用和返回地址的内存空间。
在 STM32 嵌入式领域中,RAM 分为两种:内部 SRAM 和外部 SRAM。其中,内部 SRAM 又分为两类,即 System Memory 和 SRAM1。System Memory 所占的内存地址范围是 0x1FFF 0000 - 0x1FFF FFFF,共有 112KB。SRAM1 所占的内存地址范围是 0x2000 0000 - 0x2001 7FFF,共有 96KB。
在 STM32 中,变量类型会对 RAM 占用有影响。对于基本变量类型(int、char、bool 等),它们在 RAM 中所占的字节数是固定的。比如说,int 类型在 STM32 中所占四个字节,char 类型在 STM32 中所占一个字节。而对于一些结构体或是数组类型,它们在 RAM 中所占字节数则取决于它们的大小。
此外,对于内存对齐的问题,不同的编译器可能存在不同的规则。在某些情况下,编译器可能会在结构体或是数组中添加一些额外的字节以保证内存对齐,进而增大了它们在 RAM 中的占用空间。
全局变量和局部变量都会占用 RAM 空间,但它们占用的方式有所不同。全局变量在程序编译阶段被分配到一个固定地址空间;而局部变量则是在函数被调用时才动态分配。当函数被调用时,局部变量需要在栈中动态分配内存空间,并在函数返回时释放内存空间。
因此,在一定范围内,采用局部变量来代替全局变量可以大幅减少程序的 RAM 占用。此外,在编写 STM32 程序时,要注意避免过多的递归调用,因为递归调用会不断在栈中分配内存空间,从而增大了程序的 RAM 占用。
程序优化是减少 RAM 占用的重要手段。在编写 STM32 程序时,可以采取以下几种优化方式: