[an error occurred while processing this directive]
Только вчера вычислил или баг в проге, или глюк в IAR C
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
|
Отправлено
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овский? И может как нибудь лучше эту ситуацию обработать? Подскажите плиз.
Составить ответ
|||
Конференция
|||
Архив
Ответы
- Ответ:Всё, что может случиться крайне редко, обязательно случиться... — Сергей Тюнькин (14.08.2002 18:25, 523 байт)
- Ответ: А если к t приписать volatile - будет тоже самое ? — trainer (14.08.2002 09:09, пустое)
- не поможет — Аскольд (14.08.2002 09:10, пустое)
- Ответ: Безусловно, но вероятность уменьшит. — trainer (14.08.2002 09:13, пустое)
- Это процесс не вероятностный: либо всегда работает, либо нет :) — Oldring (14.08.2002 09:30, пустое)
- Ответ: Вопрос в требуемом результате. Неверный результат обусловлен разрывом операции чтения - чем она короче, тем меньше вероятность разрыва. — trainer (14.08.2002 09:58, пустое)
- А кому нужна вероятность разрыва != 0? — Аскольд (14.08.2002 10:08, 269 байт)
- Ответ: Ну это уже теоретический спор. — trainer (14.08.2002 10:14, 228 байт)
- Почти согласен, — Oldring (14.08.2002 10:40, 659 байт)
- Ответ: Имеет для Вас значение, что моргающий с частотой 2 Гц светодиод кратковременно изменит частоту на скажем 1 Гц, если частота не критична? — trainer (14.08.2002 13:58, пустое)
- Ответ: Я не знаю, как IAR C для 51 работает с объектами с атрибутом volatile, логично было бы сначала загрузить, а потом оперировать, а не оперировать в процессе загрузки, что несколько короче по времени загрузки. — trainer (14.08.2002 13:41, пустое)
- в добавление - тем более это вообщем типичная проблема разделения - если так можно сказать длинных переменных(+) — net (14.08.2002 10:54, 539 байт)
- Дополнение — Oldring (14.08.2002 10:53, 110 байт)
- Про закон Мэрфи слыхал когда-нибудь? — Аскольд (14.08.2002 10:27, 63 байт)
- Проше завести байтовый флаг и реализовать в прерывании что-то вроде if(++t == 500) flag = 1; — Elektronik (14.08.2002 10:14, пустое)
- Вполне типичная ситуация — Аскольд (14.08.2002 09:09, 181 байт)
- Конечно, программный — Oldring (14.08.2002 09:05, 127 байт)
Перейти к списку ответов
|||
Конференция
|||
Архив
|||
Главная страница
|||
Содержание
|||
Без кадра
E-mail:
info@telesys.ru