本文介绍MCU在生成Image时,Flash与RAM存储内容及占用空间计算。
1.段
我们知道在操作系统平台,如Linux上可执行二进制程序(在linux下为一个进程单元)通常包含如下几个段:
1)数据段(BSS段,DATA段)
BSS段为未初始化的数据,此部分并不占用代码段空间,DATA段为初始化的数据,此部分是需要占用代码段空间的(需要提供具体的初始化值)。
2)代码段(CODE,.RODATA)
代码段为实际可执行的代码指令,当然,代码段同样包括一些只读数据(.RODATA),如一些定义为const的变量,代码段也包含如上所提的数据段需要初始化的数据。
3)堆
堆为动态内存分配区域,需要用户在编译前制定,对于大部分情况下,MCU的堆大小被置为0。
4)栈
栈为程序执行过程中,局部变量,中断现场保护所需要的存储区域,一般情况下,函数内部定义的自动变量越多,函数嵌套层次越高,所需的栈空间也越大。需要说明的是,编译器一般只会评估静态的栈空间的大小,无法评估实际程序在运行过程中栈空间的大小,因此,这部分的设置需尤为注意。

2.Flash空间大小
殊途同归,MCU在生成Image的过程中也需要考虑这些段,如我们使用Keil uVision生成Image(bin,hex)时,查看Map文件:

图中,我们可以看到Total ROM Size是包含Code,RO Data,RW Data的。<

文章详细介绍了MCU在生成Image时Flash和RAM的存储内容及占用空间的计算,包括数据段(BSS,DATA),代码段(CODE,.RODATA),堆和栈的分配。在初始化过程中,涉及BSS段的清零,数据段的复制以及堆栈的设置。文章通过KeiluVision和gcc交叉编译器的例子展示了如何查看和理解这些信息。
5614

被折叠的 条评论
为什么被折叠?



