Просветите, пожалуйста.
Есть такая функция, которая чинно-благородно вызывает другую функцию, а та еще одну, а та еще одну - и рисует буковку.
CODE
void RenderStringDisplay(const char *pString, const CharInfo *pFont,
uint16 row, uint16 column, uint16 spacing,
uint16 address)
{
uint16 x, y, initColumn;
const CharInfo *pCharInfo;
initColumn = column;
// Loop through characters until NULL (0) found.
while (*pString)
{
if (*pString == '\n') // Newline character?
{
column = initColumn;
row += spacing;
}
else // Not new line.
{
// Compute pointer to font information for current character.
pCharInfo = &pFont[(unsigned char)*pString];
// Compute origin of character bounding box.
x = column + pCharInfo->offsetX;
y = row - pCharInfo->offsetY - pCharInfo->height + 1;
// Display the character
DrawDisplayCharacter(pCharInfo, y, x, address);
// Advance along line by appropriate horizontal spacing.
column += pCharInfo->dwidth;
}
// Advance to next character.
pString++;
}
}
uint16 row, uint16 column, uint16 spacing,
uint16 address)
{
uint16 x, y, initColumn;
const CharInfo *pCharInfo;
initColumn = column;
// Loop through characters until NULL (0) found.
while (*pString)
{
if (*pString == '\n') // Newline character?
{
column = initColumn;
row += spacing;
}
else // Not new line.
{
// Compute pointer to font information for current character.
pCharInfo = &pFont[(unsigned char)*pString];
// Compute origin of character bounding box.
x = column + pCharInfo->offsetX;
y = row - pCharInfo->offsetY - pCharInfo->height + 1;
// Display the character
DrawDisplayCharacter(pCharInfo, y, x, address);
// Advance along line by appropriate horizontal spacing.
column += pCharInfo->dwidth;
}
// Advance to next character.
pString++;
}
}
Все это прекрасно работает в отладчике, однако при возврате указатель стека уменьшается на 4. После нескольких вызовов уже начинает ругаться отладчик на переполнение стека. Впрочем, программа никуда не улетает и продолжает работать. Все прерывания запрещены.
Если выбрать опцию reduce stack usage, то это дело прекращается, SP при возврате возвращается точно назад. Что бы это значило?
При этом более простенькии функции с меньшей иерархией вложений стек отдают.