реклама на сайте
подробности

 
 
> "Глюки" в WinAVR 20070122 и борьба с ними
manul78
сообщение May 14 2007, 19:00
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 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 ами и прочими способами, но мне интересно В ЧЕМ ФОКУС ?


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 8)
SysRq
сообщение May 14 2007, 19:25
Сообщение #2


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Фокус в volatile.

Например,

static volatile unsigned char UART_RxHead;
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 15 2007, 01:22
Сообщение #3


Гуру
******

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



Цитата(SysRq @ May 14 2007, 22:25) *
Фокус в volatile.
Но виноват, как и положено, компилятор biggrin.gif А по манере раскрашивать сообщения и выделять жирным manul78 напоминает одного местного не совсем адекватного персонажа, у которого виноват PCAD и все участники форума.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
manul78
сообщение May 15 2007, 15:00
Сообщение #4


Местный
***

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



Нет господа хорошие, все гораздо сложнее...

Всю ночь я проковырялся, пробовал и IF конструкции, и SWITCH, и FOR и прочие прочие.

И volatile пробовал, результат нулевой, я даже немного разозлился...

Результат один и тот же, (я даже на ASMе вставки делал) -- компилятор оптимизирет код так,
что упорно НЕ ХОЧЕТ повторно читать переменную из памяти, и крутит одно и то-же по кругу.

Переменная меняется в результате ПРЕРЫВАНИЯ, компилятор этого понять либо не может,
либо не хочет , либо просто НЕ УМЕЕТ. Вот в чем соль.

По поводу выделения жирным шрифтом и. тд.

Козьма Прутков писал "Не все нам понятное, понятно так как не входит в круг наших понятий"
Я в форумах второй раз в жизни, хотя программирую и работаю с промышленной электроникой
более 12 лет. Будьте ко мне снисходительны...


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
ReAl
сообщение May 15 2007, 16:31
Сообщение #5


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(manul78 @ May 15 2007, 21:00) *
Всю ночь я проковырялся
...
И volatile пробовал, результат нулевой, я даже немного разозлился...

Возможно, куда-то не туда volatile ставился или перекомпилироваться забылось (в процессе "всю ночь" - оно бывает).
Не припомню я, чтобы avr-gcc за последние лет пять хотя бы раз у меня отказался перезачитывать переменную, квалифицированную как volatile.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 15 2007, 16:48
Сообщение #6


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(manul78 @ May 15 2007, 23:00) *
Нет господа хорошие, все гораздо сложнее...

Всю ночь я проковырялся, пробовал и IF конструкции, и SWITCH, и FOR и прочие прочие.

И volatile пробовал, результат нулевой, я даже немного разозлился...

Результат один и тот же, (я даже на ASMе вставки делал) -- компилятор оптимизирет код так,
что упорно НЕ ХОЧЕТ повторно читать переменную из памяти, и крутит одно и то-же по кругу.

Переменная меняется в результате ПРЕРЫВАНИЯ, компилятор этого понять либо не может,
либо не хочет , либо просто НЕ УМЕЕТ. Вот в чем соль.

Ну дык покажите нам код с использованием volatile который не работает
и асемблерный листинг к нему
Go to the top of the page
 
+Quote Post
defunct
сообщение May 15 2007, 16:52
Сообщение #7


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(manul78 @ May 15 2007, 21:00) *
И volatile пробовал, результат нулевой, я даже немного разозлился...

не может быть.
Проверьте еще раз.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение May 15 2007, 16:58
Сообщение #8


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Может проблема в оптимизации? Не рекомендуется в avr-gcc ставить оптимизацию O3 (см. документацию к компилятору).
Сам использую О2, а с volatile проблем никогда не было.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
manul78
сообщение May 15 2007, 19:18
Сообщение #9


Местный
***

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



Цитата(mdmitry @ May 16 2007, 00:58) *
Может проблема в оптимизации? Не рекомендуется в avr-gcc ставить оптимизацию O3 (см. документацию к компилятору).
Сам использую О2, а с volatile проблем никогда не было.


Спасибо ВСЕМ ! ! !

Проблема ушла сама собой, не знаю уж что такое, может глаз замылился .

Перегрузил, прописал все подозрительные переменные в STATIC VOLATILE и все пошло.

Проверил код, везде все нормально.

Прошу прощения у разработчиков за "человеческий фактор" . Тему считаю закрытой.

Всех откликнувшихся прошу помощи, в другой проблеме. AVR и AT клавиатура, но это уже другая
история. соответственно и форум другой открою.


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 20:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01518 секунд с 7
ELECTRONIX ©2004-2016