Обычно это исправляется путем ограничения числа typedef и т. Д., Которые могут занимать много места.
Вы, кажется, несколько сбиты с толку, потому что typedef не занимают места во время выполнения. Они просто псевдонимы для типов данных. Теперь у вас могут быть экземпляры больших структур (typedef'd или иным образом), но это экземпляр, который занимает пространство, а не определение типа. Интересно, что «и т. Д.» Может охватывать это утверждение.
Экземпляры макроса заменяются в исходном коде своим определением, и в коде, сгенерированном соответствующим образом, неиспользуемый макрос не приводит к сгенерированному коду.
Вещи, которые занимают место:
- Исполняемый код (функции / функции-члены)
- Создание экземпляров данных (включая экземпляры объектов C ++)
- Объем пространства, выделенного стеку (или стекам в многопоточной системе).
То, что осталось, обычно доступно для динамического выделения памяти (ОЗУ), не используется или используется для энергонезависимой памяти (Flash / EPROM).
Сокращение использования памяти - это, прежде всего, случай выбора / проектирования эффективных структур данных, использования соответствующих типов данных, а также эффективного кода и разработки алгоритмов. Лучше всего ориентироваться на область, которая принесет наибольшую пользу. Чтобы увидеть размер объектов и кода в вашем приложении, получите компоновщик для создания файла карты. Это скажет вам, какие функции являются самыми большими, а также размеры глобальных и статических объектов.
Длина текста исходного файла не является хорошим ориентиром для размера кода. Большие объемы кода C являются декларативными (обычно заголовочные файлы являются декларативными) и не генерируют код или данные, занимающие память.
Встроенная система не обязательно подразумевает небольшую память, поэтому вы должны указать. Я работал на системах с 64 МБ ОЗУ и 2 МБ Flash, и даже это скромно по сравнению со многими системами. Типичный микроконтроллер с ресурсами на кристалле, как правило, будет иметь гораздо меньше (особенно SRAM, который занимает большую площадь микросхемы). Кроме того, здесь важна архитектура Гарварда или фон Неймана, поскольку в архитектуре Гарварда данные и кодовые пространства разделены, поэтому нам нужно знать, чего вам не хватает. Если используется фон Нейман, использование кода / данных по-прежнему актуально, если код выполняется из ПЗУ или копируется из ПЗУ в ОЗУ во время выполнения (т. Е. Разные типы памяти, даже если они находятся в одном и том же адресном пространстве). .
Clifford