Оценка объема памяти программного обеспечения - PullRequest
2 голосов
/ 25 октября 2011

Я работаю над разработкой Boot, который будет встроен в чип PROM для проекта.Мне было поручено оценить окончательный объем памяти, который, вероятно, займет программное обеспечение, но я никогда не делал этого раньше.

Я немного обыскал и думаю о следующем:

  • Считая все переменные, этот размер переходит непосредственно к общему размеру
  • Оценка количества строк кода, которые будет принимать каждая функция (код еще не был написан)
  • Определение приблизительного количества инструкций asm для каждой инструкции c
  • Общий размер = общая строка кодов nb * Средняя инструкция asm для каждой инструкции c * 32 бита

Мое решение может быть оченьну, будь фальшивым, я надеюсь, что кто-то сможет помочь.

Ответы [ 2 ]

4 голосов
/ 25 октября 2011

Принципиально - Вы на правильном пути:

Вам необходимо различать несколько типов памяти:

  • Stack
  • Динамическая память (malloc, new и т. Д.)
  • Инициализированные переменные
  • Неинициализированные переменные
  • Код

На стек в основном влияют рекурсия, локальные переменные и параметры функции.

Динамическая память (куча) очевидна и, вероятно, не имеет отношения к вам - поэтому я пока проигнорирую ее.

Инициализированные переменные интересны, так как вам нужно посчитать их дважды - один раз для занимаемой программы на PROM (аналогично коду и константам) и один раз для занимаемой памяти.

Неинициализированные переменные, очевидно, идут в ОЗУ, и подсчет размера почти достаточно хорош (вам также необходимо учитывать выравнивание и заполнение.

Труднее всего оценить код или то, что входит в PROM, вам нужно подсчитать константы и локальные переменные, а также код, сам код более или менее соответствует тому, что вы подозреваете (после добавления заполнения, выравнивания, служебных вызовов вызова функции, инициализация вектора прерывания и т. д.), но многие вещи могут сделать его больше ожидаемого, например, встроенные функции, библиотечные функции (многие, казалось бы, тривиальные операции включают такие функции), приведение и т. д.

2 голосов
/ 26 октября 2011

По способу ответа на этот вопрос можно получить опыт или оценку существующего кода с аналогичной функциональностью. Однако на размер кода влияет ряд факторов:

  • Целевая архитектура и набор инструкций.
  • Использованы параметры компилятора и компилятора.
  • Использование кода библиотеки.
  • Возможность развития персонала.
  • Требуемая функциональность.

« разработка Boot » ничего не говорит нам о требованиях или функциональности вашего процесса загрузки. Это будет иметь наибольшее влияние на размер кода. В качестве примера того, как цель может иметь значение, 8-битные цели обычно имеют большую плотность кода, но генерируют больше кода для арифметики для больших типов данных, в то время как, например, цель ARM, где вы можете выбирать между наборами команд Thumb и ARM, плотность кода значительно изменится.

Если у вас нет предыдущего опыта или репрезентативной кодовой базы для работы, то я предлагаю вам выполнить несколько экспериментов, чтобы получить некоторые метрики, с которыми вы можете работать:

  • Создайте пустое приложение - просто пустую функцию main (), если C или C ++; это даст вам основные фиксированные накладные расходы при запуске.

  • Если вы используете библиотечный код, это, вероятно, займет много места; добавьте фиктивные вызовы ко всем интерфейсам библиотеки, которые вы будете использовать в конечном приложении, и они сообщат вам, сколько кода будет занято кодом библиотеки (при условии, что код библиотеки не встроен).

  • В дальнейшем это будет зависеть от функциональности; Вы можете реализовать подмножество необходимых функций, а затем оценить, какая доля окончательной сборки может составить.

Что касается ваших предложений, помните, что переменные не занимают места в ПЗУ, хотя любые постоянные инициализаторы будут делать это. Как правило, загрузчик может использовать всю доступную оперативную память, поскольку при запуске приложения будет заново создана новая среда выполнения для себя, отбрасывая среду и переменные загрузчика.

Если вы предоставите подробную информацию о функциях и целях, вы сможете использовать опыт сообщества в оценке необходимых ресурсов. Например, я мог бы вам сказать ( из опыта ), что загрузчик с поддержкой программирования Flash, который загружается через UART с использованием протокола XMODEM на ARM7 с использованием набора инструкций ARM, поместится в 4 Кбайт, или что добавление поддержки загрузки через SD-карту может добавить еще 6 КБ, а USB Virtual Comm Port - еще 4 КБ. Однако ваши требования, возможно, уникальны, и вам придется как-то самостоятельно определять загрузку ресурса.

...