Со ссылкой на это:
расчет использования FLASH кодом C
Я решил проверить расчеты фактических инструкций по сборке.
поэтому мой скрипт подсчитывает инструкции по сборке, лежащие в файле со списком сборок кода включения функции.
например.
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 байт в случае инструкций по сборке и 1458 байт в случае nm
obj-файла).
Чтобы получить дальнейшее разъяснение, я создал сборку файла с функцией checkSize
и сравнил с исходным файлом сборки. Я понимаю, что есть некоторые дополнительные вещи из-за добавления функции checkSize
, но инструкции кода включения функции должны быть такими же (с той же оптимизацией компилятора и другими параметрами).
Но они не были одинаковыми.
Теперь возникает вопрос, почему существует такая разница в инструкциях по сборке для кода функции внутри большой функции и когда я перемещаю его в другой файл только с кодом функции.
Есть ли что-нибудь, чтобы предсказать дополнительный размер в любом случае?