Как я могу использовать больший размер стека на Microchip C18?

Хорошо, я уже давно пытаюсь решить эту проблему самостоятельно, и я просто сдаюсь. Я искал всю сеть, пока не мог больше терпеть, и мне нужна помощь!

Я полностью прочитал "Руководство пользователя по компилятору C18", где написано, что C18 поддерживает использование стека размером более 256 байт. Но я сделал все, что они просили, изменил скрипт компоновщика и использовал опцию компилятора модели стека нескольких банков (-ls), и у меня все еще есть проблемы с доступом к переменным после заполнения первого банка стека.

Я отладил простой код, который просто вызывает функцию рекурсивно. Эта функция имеет 5 параметров с плавающей точкой и 5 локальных переменных с плавающей точкой, используя около 42 байтов в стеке при каждом вызове (5*4 для параметров + 5*4 для локальных переменных + 2 байта для сохранения старого значения SFR2). После 6-го вызова значения стека перезаписываются.

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

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

Ниже приведен тестовый код, который я использовал, пытаясь понять эту проблему. Во время отладки я заметил, что регистр FSR1 правильно обновлен, чтобы указывать на следующий адрес в следующем банке, куда должны быть помещены следующие параметры функции и переменные. Но когда записываются локальные переменные, они попадают на вершину стека (считается, что только младший байт адреса перемещает данные в стек, даже когда адрес, указанный для переменной в IDL MPLABX, в режиме отладки, верно). Поэтому я уверен, что проблема в том, что сгенерированный код компилятора не использует 16-битный адрес для использования стека. Тем не менее, я не знаю, как это решить.

Любая дискуссия на эту тему будет принята с благодарностью:) Спасибо!

float testFunction1(float p1, float p2, float p3, float p4, float p5)
{
float v1, v2, v3, v4, v5;

v1 = p1 + p2;
v2 = p2 + p3;
v3 = p3 + p4;
v4 = p4 + p5;
v5 = p5 + p1;

v1 = testFunction1(v1, v2, v3, v4, v5);
}

void main()
{
float v1, v2, v3, v4, v5;

v1 = 0x11ABCDEF;
v2 = 0xAABBCCDD;
v3 = 0xABCABCAB;
v4 = 0xFFEEDDCC;
v5 = 0x11223344;

v1 = testFunction1(v1, v2, v3, v4, v5);
}

1 ответ

Чтобы включить модель кода мультибанковского стека, используйте -Lmodel Переключатель в командной строке компилятора C18.

Другие вопросы по тегам