Ошибка в IAR C for AVR
В компиляторе C для AVR существует ошибка при работе с указателем на стек данных в модели памяти Tiny.
При сохранении локальных переменных в стеке в некоторых функциях изменяется только регистр R28, а не регистровая пара R29:R28. Это важно, когда стек данных простирается до адреса 0xff.
Например:
char k(char i)
{
return i;
}
void g(char *buf)
{
char i;
for (i = 0; i != 10; i++)
buf[i] = k(i);
}
void f(void)
{
char buf[10];
g(buf);
}
void main(void)
{
f();
}
Установим размер стека данных 0xA0, процессор 8515.
При входе в main() R29 = 1, R28 = 0. Первая команда в функции f() - SUBI R28, 10.
Т.е. R29 = 1, R28 = 0xF6. При вызове функции g() первая команда
RCALL ?PROLOGUE2_L09, в которой исполняется команда ST -Y, R25. Таким образом содержимое R25 будет сохранено в ячейке с адресом 0x1F5, а не в 0x0F5.
И так далее.
Чтобы избежать этого:
1. Уменьшить размер стека на 1 байт.
2. Поменять в .xcl файле порядок выделения памяти для сегментов (не будет работать в данном конкретном примере).
3. Не использовать модель памяти Tiny.
P.S.
Данное сообщение я отправлял в форум на "Телесистемах", но реакции посетителей никакой не было. Может никто не использует модель Tiny?
|