参考this:
通过C代码计算FLASH利用率
我决定检查实际组装说明的计算。
所以我的脚本计算汇编指令,位于功能启用代码的汇编列表文件中。
例如
if(TRUE == feature1_enable)
{
// instruction counting starts here
doSomething;
.
.
.
// instruction counting stops here
}
这给了我一些计数 x,我可以从中计算出代码的大小。
为了交叉检查结果,我决定检查nm
功能代码的目标文件,但 nm 给出了整个函数的大小,而不是单个语句的大小。
所以我在单独的文件中复制了该功能的代码部分,制作了它的功能,包括必要的头文件和声明的变量来编译这个文件(通过照顾本地人将保持本地人,全局人将保持全局)。所以新文件看起来像这样:
#include "header1.h"
#include "header2.h"
global_variables;
void checkSize( void )
{
local_variables;
// feature1_enable code
doSomething;
.
.
.
}
现在该函数checkSize
仅包含功能启用代码,因此在编译后,如果我nm
是 obj 文件,我应该能够获得与程序集计数几乎相同的结果(除了函数设置使用的一些额外大小)。但事实并非如此,我收到了巨大的差异。(汇编指令为 1335 字节,nm
obj 文件为 1458 字节)。
为了进一步澄清,我创建了带有函数的文件的程序集,checkSize
并与原始程序集文件进行了比较。我知道由于添加了checkSize
功能,所以会有一些额外的东西,但是功能启用代码的指令预期是相同的(具有相同的编译器优化和其他选项)。
但他们不一样。
现在的问题是,为什么大函数内的特征代码的汇编指令存在如此差异,以及当我将其移动到仅包含特征代码的另一个文件时。
在这两种情况下,有什么可以预测额外尺寸的吗?