EDIT
Семейство PIC не является дружественной для компилятора архитектурой набора команд. Первый трюк для работы с небольшим стеком и вообще ограниченными ресурсами на PIC - это программирование на ассемблере. Вы можете выполнить больше задач в одном и том же программном пространстве и за одно и то же время выполнения или за одну и ту же задачу за меньшее время, чем программирование на языке C.
Второй - просто не использовать стек. Сделайте ваши переменные глобальными или локальными глобальными (локальные переменные со словом static впереди), как бы вы это ни называли или как бы вы ни объявили, вывод компилятора будет таким же, переменная имеет одну статическую ячейку памяти и не использует стек.
Для процессоров, отличных от семейства PIC, вы можете использовать оптимизатор или зарегистрировать объявление переменных, чтобы предотвратить использование стека. PIC имеет только два регистра, и для того, чтобы сделать что-нибудь полезное, вы должны постоянно высылать содержимое в оперативную память, так что это будет иметь минимальное влияние на PIC. Для процессоров без PIC, в дополнение к тому, чтобы компилятор как можно больше сохранял данные в регистрах, вы можете помочь в этом, ограничивая число переменных, передаваемых в функцию, а также количество дополнительных локальных переменных, используемых функция. В случаях, когда неясно, сколько регистров используется, разберите и изучите выходные данные компилятора, реорганизация выполнения вашего кода может изменить распределение и удаление регистров. Если это не сработает, рассмотрите возможность разделения функции на две части и вызова одной, а затем по очереди другой, чтобы каждая функция могла выполняться в доступных регистрах без использования стека.
Если этот проект предназначен для увлекательного образовательного процесса, то программирование для PIC само по себе является образовательным, а программирование PIC на C также является образовательным опытом. Стоит учиться, стоит попасть в ловушки и пробиться обратно.
Если вы делаете это для работы (карьера и / или средства к существованию зависают на волоске) и не хотите программировать на ассемблере, я рекомендую попробовать переключить проект на другую платформу. msp430, avr или один из них на базе ARM (возможно, stellaris). Знание ARM очень полезно для вашей карьеры в области встраиваемых систем, но детали ARM будут несколько громоздкими с точки зрения мощности и стоимости по сравнению с PIC. AVR и MSP430 части больше по номиналу. Все три из этих альтернативных архитектур гораздо больше подходят для программирования на C, и одна и та же программа будет потреблять меньше памяти / стека, чем эквивалент на PIC. Это означает, что вы можете заменить 8K PIC на 8K чем-то другим, вам не обязательно будет больше памяти на альтернативной архитектуре, чтобы сделать больше. Вы по-прежнему должны беспокоиться о своем стеке и должны избегать (неглобальных) локальных переменных, чтобы предотвратить рост стека. Эти архитектуры также отличаются от PIC отсутствием отдельного стека и оперативной памяти общего назначения. Вы можете балансировать глобально распределенные переменные и переменные, основанные на стеке, и не зависеть от архитектуры. Если в рабочей среде используются переменные на основе стека, просмотрите код, чтобы определить наихудший путь вложенных функций, и подсчитайте, сколько неглобальных переменных находится в этом пути, и вызывает ли это стек, сталкивающийся с глобально распределенными переменными.
Разборка - ваш лучший друг во встраиваемых системах, вам не обязательно программировать на ассемблере, но вы все равно сможете ее прочитать. Изучение сборки - лучший прием для уменьшения всех форм встроенных проблем: проблем со стеком, использования памяти, производительности, проблем с загрузкой и т. Д.