Иерархический обзор использования статической памяти

0

Я разрабатываю программное обеспечение для микроконтроллеров, и я хотел бы иметь возможность легко видеть, какие части программного обеспечения используют сколько памяти. Программное обеспечение не использует динамическое распределение памяти, меня интересуют только статические распределения памяти (разделы bss и data).

Вся эта статическая память на самом деле является частью одной структуры, содержащей (большую часть) памяти, с которой работает программа. Это иерархия структур, соответствующая компонентам программы. Например:

struct WholeProgram { int x; struct ComponentA a; struct ComponentB b; }; struct ComponentA { int y; struct ComponentC c; struct ComponentD d; };... struct WholeProgram whole_program;

В идеале я хотел бы видеть использование памяти, представленную многоуровневой круговой диаграммой.

Я не мог найти ничего, что могло бы спуститься в такие структуры, только программы, которые печатают размер глобальных переменных (нм). Это не слишком полезно для меня, потому что это скажет мне только размер структуры WholeProgram без каких-либо подробностей о ее частях.

Обратите внимание, что решение не должно быть в форме программы, которая анализирует код. Это было бы неприемлемо для меня, потому что я использую много метапрограммирования шаблона C++, и программа, несомненно, не сможет справиться с этим.

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

  • 0
    Структуры вашего примера не используют никакой памяти, если они не были явно созданы, и тогда это зависит от того, сколько экземпляров вы создаете.
  • 0
    @Clifford У меня есть один экземпляр корневой структуры WholeProgram.
Показать ещё 2 комментария
Теги:
gcc
memory
embedded

2 ответа

1

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

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

Ответы на парсер/описание отчетов GDB могут помочь.

0

Если вы объявляете экземпляры структур компонента в глобальной области, а не внутри структуры whole_program, ваш файл карты должен whole_program размеры каждой структуры компонента. Упаковка всех компонентов в одну структуру, естественно, приводит к whole_program что в файле карты отображается только whole_program.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню