Обманывает, конечно. Вот кусок call frame, каждый повторный вызов RenderStringDisplay смещает стек на 4, пока дело не дойдет до "приличных" функций, которые стек не отгрызают.
CODE
FUNCALL main, RenderStringDisplay
LOCFRAME CSTACK, 12, STACK
FUNCALL main, RenderStringDisplay
LOCFRAME CSTACK, 16, STACK
FUNCALL main, RenderStringDisplay
LOCFRAME CSTACK, 20, STACK
.............................................
FUNCALL main, RenderStringDisplay
LOCFRAME CSTACK, 32, STACK
FUNCALL main, RenderCursor
LOCFRAME CSTACK, 32, STACK
FUNCALL main, WaitNonBusy
LOCFRAME CSTACK, 32, STACK
Удивительно, но через какое-то время стек "вдруг" отдается.
CODE
FUNCALL main, EnableRXInterrupts
LOCFRAME CSTACK, 32, STACK
FUNCALL main, RenderCursor
LOCFRAME CSTACK, 8, STACK
Т.е. как бы все само излечивается. Однако факт переполнения стека отладчиком отмечается, что не есть хорошо. Вот такая странность. Ну и если reduce stack usage, что, вроде, ухудшает код, то этих фокусов не наблюдается.
CODE
FUNCALL main, ClearDisplayImageBuffer
LOCFRAME CSTACK, 8, STACK
FUNCALL main, RenderStringDisplay
LOCFRAME CSTACK, 12, STACK
FUNCALL main, RenderStringDisplay
LOCFRAME CSTACK, 12, STACK
....................................................
FUNCALL main, RenderStringDisplay
LOCFRAME CSTACK, 12, STACK
FUNCALL main, RenderCursor
LOCFRAME CSTACK, 8, STACK