Итак, имеем. Не сильно сложная по логике, но довольно пухлая программа на ассемблере для PIC18F45K20. В ней довольно много подпрограмм, которые друг друга могут вызывать. Никакой рекурсии не предполагается, но используются оба уровня прерываний, и в их обработчиках вложенные вызовы подпрограмм тоже имеют место быть. А стек возвратов в процессоре - не резиновый. Есть желание как-то посчитать максимальный уровень вложенности вызовов, для данного конкретного варианта сборки программы. Ручками это сделать, конечно, можно, но уж очень трудоёмко. Встроенных средств в MPLAB я что-то не нашёл. Попытка сгородить макросы типа CALL# / RETURN#, которые бы сами подсчитывали глубину вложенности вызовов, наталкивается на ряд неприятных сложностей. А переполнение стека во время исполнения чревато фейерверком в лабораторной установке. Как быть?
testerplus
May 11 2011, 09:59
Так об этом при проектировании программы надо было думать (особенно, учитывая, что и из прерываний есть вызовы).
Если точно нет рекурсии и функций, вызываемых и из программы, и из прерывания (или из разных уровней прерывания), то можно в обработчике приоритетного прерывания контролировать максимальное значение STKPTR. А оттуда вручную просчитать глубину вызываемых из него функций.
Или в периодически выполняемом фрагменте кода вставить проверку содержимого стека (но придется на время проверки блокировать прерывания, т.к. нужно оперировать значением STKPTR)
Но тоже не факт, что при выполнении программы отработают все варианты ветвления.
ar__systems
May 11 2011, 14:13
Компилятор должен уметь строить дерево вызовов, по которому уже определить глубину стека элементарно.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.