Vovik-78 писал(а):Вот я и подумал, если *.h все равно инклюдятся в main.c то почему бы не сделать отдельный *.h с переменными, отдельные *.h на раздельные модули и функции и заинклюдить их в main.c
h-файлы инклюдятся там, где это нужно. фишка разделения проекта на отдельные c-файлы заключается в том, что каждый такой файл компилируется отдельно от других, и только в том случае, если компилятор (точнее, система сборки, но не суть важно) определит, что исходник изменялся с предыдущей компиляции. это повышает скорость сборки проекта при многочисленных правках кода.
что касается оптимизации, то тут важно понимать, о каком именно объеме "экономии" идет речь. если о паре байтов, то практически всегда есть возможность найти способ их сэкономить. если речь о десятке-другом байтов - то вероятность достаточно велика их найти. начиная примерно с сотни байт лучше задумываться о переводе проекта на новый МК с большим "простором".
из неочевидного, и чаще всего неизвестного новичкам, могу дать такие советы:
- попробуйте собрать проект с ключиком
-flto для компилятора и линкера, на свежих версиях компилятора в моих проектах только это давало выигрыш до 100 байт и более;
- попробуйте
-mrelax в опциях компилятора и
-Wl,-relax для линкера - частенько даёт заметный выигрыш "из ниткуда";
- проверьте, что ваш проект собирается с опциями
-ffunction-sections и
-fdata-sections для компилятора и
-Wl,-gc-sections для линкера - в определенных случаях это позволяет в разы сократить размер выхлопа!
Добавлено after 6 minutes 46 seconds:да, еще одно: сделайте все функции, не вызываемые "перекрестно" из разных c-файлов, static - это тоже помогает в борьбе за байты flash
и последнее: если у вас есть глобальная переменная, которая инициализируется в момент объявления, т.е. типа такого
static int var = 1;, подумайте 10 раз: оно действительно вам надо, чтобы эта переменная была НЕ НОЛЬ изначально? дело в том, что все ненулевые значения, присваиваемые глобальным (и/или static) переменным, увеличивают расход flash ровно на константу соответствующего типа, т.е. в приведенном мной примере это будет 2 байта.
и самое-самое последнее: помните, что все строковые константы ДВАЖДЫ занимают память: один раз в ОЗУ, второй раз во flash. это к экономии flash относится слабо, но вот к экономии ОЗУ - сильно.