Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

Коллекция глюков Здесь публикуются все известные глюки, баги микроконтроллеров, памяти, АЦП и т.д.

 
Опции темы

Глюки WinAVR

Непрочитано 18.11.2010, 11:11  
KBH-I
Почётный гражданин KAZUS.RUN
 
Аватар для KBH-I
 
Регистрация: 01.05.2009
Адрес: Коптево
Сообщений: 2,753
Сказал спасибо: 268
Сказали Спасибо 398 раз(а) в 247 сообщении(ях)
KBH-I на пути к лучшему
По умолчанию Глюки WinAVR

Уважаемые постмодераторы! Я дико извиняюсь, как говорят в Одессе, но не нашёл на Вашем форуме темы про глюки WinAVR. И только поэтому завёл свою.

Итак, в 2 словах, глюк такой: компилятор WinAVR глотает строки исходника.

Смотрите сами, вот это исходник:
Код:
void KeyHandler(void) {
 if (((Key & 0b0001) == 0) && ((PreviousKey & 0b0001) == 1)) {		// key green
   if (CntPause › 0) {
     SpitefulBuyersGreen++;
     IntervalsHandler(SptPollGreen);
    }
    else {
      GreenIndicator++;
	  IntervalsHandler(PollGreen);
    }
    fUpdInd=1;
  }
  if (((Key & 0b0010) == 0) && ((PreviousKey & 0b0010) == 1)) {		// key red
	if (CntPause › 0) {
	  SpitefulBuyersRed++;
	  IntervalsHandler(SptPollRed);
	}
	else {
	  RedIndicator++;
	  IntervalsHandler(PollRed);
	}
	fUpdInd=1;
  }
  if (((Key & 0b0100) == 0) && ((PreviousKey & 0b0100) == 1)) BadLid();	// key micro
  PreviousKey = Key;
  fKeyHand = 0;					// Сбрасываем флаг
}
А вот что он накомпилил:
Код:
@000007E8: KeyHandler
370:      void KeyHandler(void) {
+000007E8:   93DF        PUSH      R29            Push register on stack
+000007E9:   93CF        PUSH      R28            Push register on stack
+000007EA:   B7CD        IN        R28,0x3D       In from I/O location
+000007EB:   B7DE        IN        R29,0x3E       In from I/O location
371:        if (((Key & 0b0001) == 0) && ((PreviousKey & 0b0001) == 1)) {		// key green
+000007EC:   91800060    LDS       R24,0x0060     Load direct from data space
+000007EE:   2F88        MOV       R24,R24        Copy register
+000007EF:   E090        LDI       R25,0x00       Load immediate
+000007F0:   7081        ANDI      R24,0x01       Logical AND with immediate
+000007F1:   7090        ANDI      R25,0x00       Logical AND with immediate
+000007F2:   9700        SBIW      R24,0x00       Subtract immediate from word
+000007F3:   F541        BRNE      PC+0x29        Branch if not equal
+000007F4:   91800061    LDS       R24,0x0061     Load direct from data space
+000007F6:   2F88        MOV       R24,R24        Copy register
+000007F7:   E090        LDI       R25,0x00       Load immediate
+000007F8:   7081        ANDI      R24,0x01       Logical AND with immediate
+000007F9:   7090        ANDI      R25,0x00       Logical AND with immediate
+000007FA:   2388        TST       R24            Test for Zero or Minus
+000007FB:   F101        BREQ      PC+0x21        Branch if equal
372:          if (CntPause › 0) {
+000007FC:   918000B0    LDS       R24,0x00B0     Load direct from data space
+000007FE:   919000B1    LDS       R25,0x00B1     Load direct from data space
+00000800:   9700        SBIW      R24,0x00       Subtract immediate from word
+00000801:   F061        BREQ      PC+0x0D        Branch if equal
373:            SpitefulBuyersGreen++;
+00000802:   9180006B    LDS       R24,0x006B     Load direct from data space
+00000804:   9190006C    LDS       R25,0x006C     Load direct from data space
+00000806:   9601        ADIW      R24,0x01       Add immediate to word
+00000807:   9390006C    STS       0x006C,R25     Store direct to data space
+00000809:   9380006B    STS       0x006B,R24     Store direct to data space
374:      	  IntervalsHandler(SptPollGreen);
+0000080B:   E084        LDI       R24,0x04       Load immediate
+0000080C:   DEFC        RCALL     PC-0x0103      Relative call subroutine
+0000080D:   C00B        RJMP      PC+0x000C      Relative jump
377:            GreenIndicator++;
+0000080E:   91800067    LDS       R24,0x0067     Load direct from data space
+00000810:   91900068    LDS       R25,0x0068     Load direct from data space
+00000812:   9601        ADIW      R24,0x01       Add immediate to word
+00000813:   93900068    STS       0x0068,R25     Store direct to data space
+00000815:   93800067    STS       0x0067,R24     Store direct to data space
378:      	  IntervalsHandler(PollGreen);
+00000817:   E082        LDI       R24,0x02       Load immediate
+00000818:   DEF0        RCALL     PC-0x010F      Relative call subroutine
380:          fUpdInd=1;
+00000819:   E081        LDI       R24,0x01       Load immediate
+0000081A:   938000A6    STS       0x00A6,R24     Store direct to data space
394:        PreviousKey = Key;
+0000081C:   91800060    LDS       R24,0x0060     Load direct from data space
+0000081E:   93800061    STS       0x0061,R24     Store direct to data space
395:        fKeyHand = 0;					// Сбрасываем флаг
+00000820:   921000A7    STS       0x00A7,R1      Store direct to data space
396:      }
+00000822:   91CF        POP       R28            Pop register from stack
+00000823:   91DF        POP       R29            Pop register from stack
+00000824:   9508        RET                      Subroutine return
Имхо, не надо иметь 7 пядей во лбу, чтобы понять, что WinAVR скомпилил почему-то только одну ветку "if", а остальные - нет.
Если это не глюк компилятора, нажму "Спасибо" тому, кто найдёт ошибку в исходнике.
Честно говоря, ничего умнее "volatile" перед каждым "if" в голову не приходит, но:
1. это моветон,
2. теперь что, перед каждым оператором (на всякий случай) писать "volatile", что ли?

Да, чуть совсем не забыл:
AVRstudio - v4.18 SP3,
WinAVR - 20100110,
WinXP Home Edition SP2 на одном компе
и WinXP Professional SP3 на другом - реакция одинаковая. )

P.S. Действительно, куда пропали пробелы? Причём "." или "_" в начале строк не помогают.
Как приводить тексты программ? Тогда читайте сами, как сможете...
P.P.S. Тэги помогли?
Реклама:

Последний раз редактировалось KBH-I; 18.11.2010 в 12:13. Причина: Куда делись пробелы и табы в начале строк?
KBH-I вне форума  
Непрочитано 18.11.2010, 11:32  
nml
Супер-модератор
 
Аватар для nml
 
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,394
Сказал спасибо: 2,016
Сказали Спасибо 1,357 раз(а) в 591 сообщении(ях)
nml на пути к лучшему
По умолчанию Re: Глюки WinAVR

volatile относится только к переменным
И неплохо бы увидеть как объявлены переменные
Но, по моему, ошибка тут
Цитата:
((PreviousKey & 0b0010) == 1)
так как компилер видит, что такое никогда не истина, то и выкидывает нафиг.
надо бы написать
Цитата:
((PreviousKey & 0b0010) != 0)
А чтоб пробелы не пропадали, заключайте в тэги "code"
Код:
         вот и пробелы
__________________
[ жизнь приятна и красива, если выпить литр пива ]

Последний раз редактировалось nml; 18.11.2010 в 11:46.
nml вне форума  
Непрочитано 18.11.2010, 11:45  
andries5
Почётный гражданин KAZUS.RUN
 
Регистрация: 19.02.2008
Сообщений: 1,840
Сказал спасибо: 128
Сказали Спасибо 613 раз(а) в 430 сообщении(ях)
andries5 на пути к лучшему
По умолчанию Re: Глюки WinAVR

Видимо он решил, что в других if события не могут произойти.
andries5 вне форума  
Непрочитано 18.11.2010, 11:50  
_guardianangel
Почётный гражданин KAZUS.RUN
 
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,138
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
_guardianangel на пути к лучшему
По умолчанию Re: Глюки WinAVR

Мда похоже nml прав. Если PreviousKey = 0b0010 то PreviousKey & 0b0010, т.е. 0b0010 & 0b0010 = 0b0010, а уж никак не 1, 0b0001 в двоичном.
_guardianangel вне форума  
Непрочитано 18.11.2010, 11:58  
KBH-I
Почётный гражданин KAZUS.RUN
 
Аватар для KBH-I
 
Регистрация: 01.05.2009
Адрес: Коптево
Сообщений: 2,753
Сказал спасибо: 268
Сказали Спасибо 398 раз(а) в 247 сообщении(ях)
KBH-I на пути к лучшему
По умолчанию Re: Глюки WinAVR

Сообщение от nml Посмотреть сообщение
Но, по моему, ошибка тут
Цитата:
((PreviousKey & 0b0010) == 1)
1. Если ошибка тут, то как он берёт строку
" if (((Key & 0b0001) == 0) && ((PreviousKey & 0b0001) == 1)) { // key green"?
2. Объявление переменных (имхо, ничего особенного; кроме того, эти же переменные используются как в скомпилированной ветке, так и в выброшенных =› дело не в них):
Код:
unsigned char
  fUpdInd = 0,
  fKeyHand = 0,
  Key = 0b0111,
  PreviousKey = 0b0111;
unsigned int
  CntPause = 0, 
  GreenIndicator = 0,
  RedIndicator = 0,
  SpitefulBuyersGreen = 0,
  SpitefulBuyersRed = 0;
#define	PollGreen     2
#define	PollRed       3
#define	SptPollGreen  4
#define	SptPollRed    5
P.S. Не совсем уловил про тэги...

Последний раз редактировалось nml; 18.11.2010 в 12:06. Причина: <code>
KBH-I вне форума  
Непрочитано 18.11.2010, 12:03  
nml
Супер-модератор
 
Аватар для nml
 
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,394
Сказал спасибо: 2,016
Сказали Спасибо 1,357 раз(а) в 591 сообщении(ях)
nml на пути к лучшему
По умолчанию Re: Глюки WinAVR

Сообщение от KBH-I Посмотреть сообщение
1. Если ошибка тут, то как он берёт строку
" if (((Key & 0b0001) == 0) && ((PreviousKey & 0b0001) == 1)) { //
Потому что число по "И" с 0x01 может быть равно 1.
Да вы поправьте исходник и скомпилируйте.
И запомните - у компиляторов глюки таки есть.
Но встречаются на два порядка реже, чем наша невнимательность

Тэги поправил (надо [ ] скобки ставить )
__________________
[ жизнь приятна и красива, если выпить литр пива ]

Последний раз редактировалось nml; 18.11.2010 в 12:07.
nml вне форума  
Сказали "Спасибо" nml
KBH-I (18.11.2010)
Непрочитано 18.11.2010, 12:03  
_guardianangel
Почётный гражданин KAZUS.RUN
 
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,138
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
_guardianangel на пути к лучшему
По умолчанию Re: Глюки WinAVR

Сообщение от KBH-I Посмотреть сообщение
1. Если ошибка тут, то как он берёт строку
" if (((Key & 0b0001) == 0) && ((PreviousKey & 0b0001) == 1)) { // key green"?
Если PreviousKey = 0b0001 то PreviousKey & 0b0001 = 1 и условие выполняется, при PreviousKey = 0b0010, PreviousKey & 0b0010 никогда не будет равно 1. И, как следствие, оптимизатор выбрасывает эту строку.
_guardianangel вне форума  
Непрочитано 18.11.2010, 12:04  
KBH-I
Почётный гражданин KAZUS.RUN
 
Аватар для KBH-I
 
Регистрация: 01.05.2009
Адрес: Коптево
Сообщений: 2,753
Сказал спасибо: 268
Сказали Спасибо 398 раз(а) в 247 сообщении(ях)
KBH-I на пути к лучшему
По умолчанию Re: Глюки WinAVR

Сообщение от nml Посмотреть сообщение
Потому что число по "И" с 0x01 может быть равно 1.
Действительно!

P.S. Заодно не подскажете, нужно ли поверх AVRstudio 4.18 с установленным SP3 ставить ещё и SP2 и SP1?
P.P.S. Исправил "== 1" на "› 0" - заработало.

Последний раз редактировалось KBH-I; 18.11.2010 в 12:28. Причина: P.S.
KBH-I вне форума  
Непрочитано 18.11.2010, 12:59  
_guardianangel
Почётный гражданин KAZUS.RUN
 
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,138
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
_guardianangel на пути к лучшему
По умолчанию Re: Глюки WinAVR

Сообщение от KBH-I Посмотреть сообщение
P.S. Заодно не подскажете, нужно ли поверх AVRstudio 4.18 с установленным SP3 ставить ещё и SP2 и SP1?
Нет. Не надо.
_guardianangel вне форума  
Непрочитано 26.12.2010, 16:47  
AGAT0365
Прописка
 
Регистрация: 17.02.2009
Сообщений: 154
Сказал спасибо: 14
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
AGAT0365 на пути к лучшему
По умолчанию Re: Глюки WinAVR

Доброе время суток. На WinAvr пытаюсь создать програмку к меге8.Проблемы с переменными после оператора замкнутого цикла while(1),переменные при проверке на протеусе выдаёт черточки и пишет всегда 0. Пробовал менять оптимезацию,результата нет.Пробовал внаглую записывать число в любом виде всё равно 0.
Вложения:
Тип файла: rar запрос.rar (17.4 Кб, 46 просмотров)
AGAT0365 вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подниму тему WinAVR vs IAR oleg110592 Микроконтроллеры, АЦП, память и т.д 5 24.10.2015 14:06
На WinAVR + AVR Studio c CVAVR Vetal-soft Embedd С 87 03.03.2013 20:31
AVRStudio + WinAVR не работают... alberio Микроконтроллеры, АЦП, память и т.д 15 18.10.2010 20:16
WinAVR не нравится символ '\' vovan_zh Микроконтроллеры, АЦП, память и т.д 10 10.09.2010 20:48
помогите начинающему по WinAVR umkamaks Микроконтроллеры, АЦП, память и т.д 4 05.05.2010 21:01


Часовой пояс GMT +4, время: 20:53.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.