|
"Глюки" в WinAVR 20070122 и борьба с ними |
|
|
|
May 14 2007, 19:00
|

Местный
  
Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719

|
Обясните пожалуйста как такое можно реализовать ?
Это функция:
void Control_ACK(void) { while (x ==0) ; if (Kbuff==0xFA) {WriteData(0x18);Beep(5000);Kbuff=0;x=0; } else {WriteData(0x1E);Beep(5000);Kbuff=0;x=0; } }
Это результат :
void Control_ACK(void) { while (x ==0) ; 12a: 80 91 62 00 lds r24, 0x0062 12e: 88 23 and r24, r24 130: f1 f3 breq .-4 ; 0x12e <Control_ACK+0x4>
if (Kbuff==0xFA) {WriteData(0x18);Beep(5000);Kbuff=0;x=0; } 132: 80 91 63 00 lds r24, 0x0063 136: 8a 3f cpi r24, 0xFA ; 250 138: 11 f4 brne .+4 ; 0x13e <Control_ACK+0x14> 13a: 88 e1 ldi r24, 0x18 ; 24 13c: 01 c0 rjmp .+2 ; 0x140 <Control_ACK+0x16> else
Как видите команда WHILE один раз считывает регистр для сравнения и начинает кружиться сама в себе .
[b] ВОПРОС ? Переменная X меняется в процессе обработки прерывания
, т.к. из памяти она читается один раз, то программа у меня висит.
Я мог бы решить это IF ами и прочими способами, но мне интересно В ЧЕМ ФОКУС ?
--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
|
|
|
|
|
 |
Ответов
(1 - 8)
|
May 15 2007, 01:22
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(SysRq @ May 14 2007, 22:25)  Фокус в volatile. Но виноват, как и положено, компилятор  А по манере раскрашивать сообщения и выделять жирным manul78 напоминает одного местного не совсем адекватного персонажа, у которого виноват PCAD и все участники форума.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 15 2007, 15:00
|

Местный
  
Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719

|
Нет господа хорошие, все гораздо сложнее...
Всю ночь я проковырялся, пробовал и IF конструкции, и SWITCH, и FOR и прочие прочие.
И volatile пробовал, результат нулевой, я даже немного разозлился...
Результат один и тот же, (я даже на ASMе вставки делал) -- компилятор оптимизирет код так, что упорно НЕ ХОЧЕТ повторно читать переменную из памяти, и крутит одно и то-же по кругу.
Переменная меняется в результате ПРЕРЫВАНИЯ, компилятор этого понять либо не может, либо не хочет , либо просто НЕ УМЕЕТ. Вот в чем соль.
По поводу выделения жирным шрифтом и. тд. Козьма Прутков писал "Не все нам понятное, понятно так как не входит в круг наших понятий" Я в форумах второй раз в жизни, хотя программирую и работаю с промышленной электроникой более 12 лет. Будьте ко мне снисходительны...
--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
|
|
|
|
|
May 15 2007, 16:48
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(manul78 @ May 15 2007, 23:00)  Нет господа хорошие, все гораздо сложнее...
Всю ночь я проковырялся, пробовал и IF конструкции, и SWITCH, и FOR и прочие прочие.
И volatile пробовал, результат нулевой, я даже немного разозлился...
Результат один и тот же, (я даже на ASMе вставки делал) -- компилятор оптимизирет код так, что упорно НЕ ХОЧЕТ повторно читать переменную из памяти, и крутит одно и то-же по кругу.
Переменная меняется в результате ПРЕРЫВАНИЯ, компилятор этого понять либо не может, либо не хочет , либо просто НЕ УМЕЕТ. Вот в чем соль. Ну дык покажите нам код с использованием volatile который не работает и асемблерный листинг к нему
|
|
|
|
|
May 15 2007, 19:18
|

Местный
  
Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719

|
Цитата(mdmitry @ May 16 2007, 00:58)  Может проблема в оптимизации? Не рекомендуется в avr-gcc ставить оптимизацию O3 (см. документацию к компилятору). Сам использую О2, а с volatile проблем никогда не было. Спасибо ВСЕМ ! ! ! Проблема ушла сама собой, не знаю уж что такое, может глаз замылился . Перегрузил, прописал все подозрительные переменные в STATIC VOLATILE и все пошло. Проверил код, везде все нормально. Прошу прощения у разработчиков за "человеческий фактор" . Тему считаю закрытой. Всех откликнувшихся прошу помощи, в другой проблеме. AVR и AT клавиатура, но это уже другая история. соответственно и форум другой открою.
--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|