Локальные переменные и вызов процедур из прерывания в CrossStudio 1.1.4(lpc2106) Имеем программку написанную на C++, в которой имеется обработчик прерывания(таймерного). Вот так:
void test() //sub-function
{
int a;
a = 15;
}
void timer0ISR(void) __attribute__ ((interrupt ("IRQ")));
void timer0ISR(void)
{
int n = 7;
for (int i = 0; i<10; ++i)
{
test();
}
/* Clear the timer 0 interrupt */
T0IR = 0xFF;
/* Update VIC priorities */
VICVectAddr = 0;
}
При отладке видно что после вызова test значение n и i становятся "левыми". Более подробный разбор полетов - включенный режим отладки Interleaved и просмот в memory адресов где лежат локальные переменные показывает следующее:
При входе в timer0ISR значение SP уменьшается на размер необходимый для сохранения регистров плюс 8 байт для хранения переменных n и i и становится (в моем случае) 0x400024f8.
Но если в wath`е набрать &i и &n то видно что их адреса 0x400024f0 и 0x400024f4. Во время вызова test опять происходит сохранение в стеке регистров (при этом стек уменьшается) в адреса 0x400024f8 - 0x400024e0 при этом
затираются значения локальных переменных n и i.
что делать?
-
- .... в ADS и IAR такой вызов работает нормально проблемма только в CW.. - Alex+B(26.05.2004 10:26)