[an error occurred while processing this directive]
Только вчера вычислил или баг в проге, или глюк в IAR C
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено titanic 14 августа 2002 г. 08:55

Для 51 контроллера:
Исходный текст на С:
unsigned int t;
void interrupt timer2(){
...
++t;
...
}

main(){
while (sensor) {
reswd=1;
IF (t>500) avariya() /*/
}
}
Частота прерываний от таймера- 26гц. Т.о. * выполняется примерно через 20с после входа в WHILE.Но на практике примерно 1раз из 10 она вылетала через 10с.
Полная непонятка, пока не посмотрел сгенерированный ассемблерный код строки *.
Вот он:
SETB C
MOV R0,#t+1
MOV A,@R0
SUBB A,#244
DEC R0
MOV A,@R0 **
SUBB A,#1
JC ?0090
?0089:
LCALL $REFFN avariya
?0090:
Выходит, что если значение t=255 и прерывание произойдет перед **, то будет неправильное решение?
Я просто перед этой строчкой запретил прерывания и все пошло нормально.
Так это програмный глюк или IARовский? И может как нибудь лучше эту ситуацию обработать? Подскажите плиз.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru