嵌入式软件中的变量存储比较灵活,可以将变量存储在内核中,此时变量的访问最快;也可以将变量存储在ram中,此时变量的访问速度次之;最后可以将变量存储于flash中,此时变量的访问速度最快。(不考虑单片机内核带cache的情况)
在实际的应用中,可以根据变量的使用情况,将变量分配在不同的存储空间,搭配合适的数据结构,提高程序的运行速度。
1、存储于内核中
1.1 内核寄存器
在函数调用时,mcu会根据参数的数量将全部或部分形参和局部变量存储在r0,r1,r2,r3等通用寄存器上,方便快速调用。如果形参或局部变量数据过多时会在栈上分配一部分空间用于数据存储。
1.2 特殊寄存器
如果函数的形参中含有浮点型数据,如果将编译器配置为硬件浮点计算,则此时浮点型数据会被存放于浮点计算专用的寄存器中,用于提高运算速度。
2、存储于ram中
2.1 堆中
在使用malloc进行动态内存分配时,此时的数据将会被存放在堆上,动态内存分配具有一定的灵活性。
2.2 栈中
函数在调用时,会将函数的返回地址,局部变量等数据压入栈中,在退出函数时进行数据弹出,完成函数调用。栈是c语言函数调用的基础。
2.3 ram固定地址
全局变量及声明为static的局部变量会被存储在ram的固定地址中,数据地址固定,比动态内存分配要可靠一些。在安全类产品的应用中会禁用动态内存分配机制。
3、存储于flash中
声明为const类型的变量,会被存储于flash中,变量值不可改变,可以用于存储不可变的数据,节省ram空间。