Я знаю, что об этом спрашивали 4 года назад, но до сих пор не ответили правильно. Я полагаю, что OP спрашивает, является ли их подход к работе с ограничением допустимого и / или наилучшего опыта компилятора HiTech PICC18 C. Как упомянуто в последующем комментарии, ограничение (довольно плохое и не очень хорошо рекламируемое Hitech) заключается в том, что «высокотехнологичный компилятор допускает только 256 байтов автоматических переменных». На самом деле ограничение хуже, чем это, поскольку оно составляет 256 байтов для локальных переменных и параметров. Предупреждение компоновщика, когда это превышено, также довольно загадочно. При условии, что функции находятся в разных ветвях дерева вызовов, компилятор может перекрывать переменные, чтобы повторно использовать пространство. Это означает, что вы можете иметь более 256 байтов. Но обратите внимание, что обработчик прерываний (или обработчики, если вы используете схему приоритетов) имеет свое собственное дерево вызовов, которое совместно использует 256-байтовый блок local / param.
Местные жители
Два решения по сокращению пространства, необходимого для местных жителей: сделать глобальные локальные или сделать их статичными. Делая их статичными, вы сохраняете область действия одинаковой, и при условии, что функция не вызывается из прерываний, это безопасно (компилятор все равно не разрешает аренду). Это, вероятно, предпочтительный вариант. Недостатком является то, что компилятор не может повторно использовать местоположения этих переменных, чтобы уменьшить общее потребление памяти. Перемещение переменных в глобальную область позволяет повторное использование, но управление повторным использованием должно управляться программистом. Вероятно, лучший баланс - сделать простые переменные статичными, но сделать глобальные большие куски памяти, такие как строковые буферы, и аккуратно их использовать.
Будьте осторожны с инициализацией.
foo()
{
int myvar = 5;
}
должно измениться на
foo()
{
static int myvar;
myvar = 5;
}
Параметры
Если вы будете передавать большие объемы данных по дереву вызовов в параметрах, вы быстро столкнетесь с тем же ограничением в 256 байт. Лучшим вариантом здесь может быть передача указателя на глобально распределенную структуру / параметры «options». В качестве альтернативы вы можете иметь переменные глобальных настроек, которые устанавливаются главным вызывающим пользователем и читаются вызываемыми пользователями по дереву. Это действительно зависит от дизайна программного обеспечения, какой подход лучше.
Я боролся с теми же проблемами, что и OP, и я думаю, что в конечном итоге лучше всего отказаться от использования компилятора Hitech. Решение об оптимизации, принятое авторами компилятора для размещения всех локальных элементов / параметров в одном блоке, действительно действительно подходит для PICS очень малого размера памяти. Для больших PICS вы исчерпаете local / param до того, как достигнете размера оперативной памяти устройства. Затем вы должны начать взламывать свой код, чтобы он соответствовал компилятору, который является извращенным.
В итоге ... Да, ваш подход действителен. Но подумайте просто о том, чтобы сделать локальные объекты статичными, если это уместно, так как в целом уменьшение области действия делает ваш код более безопасным.