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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Непонятный результат компиляция на IARe, Подскажите, в чем я не прав
Dog Pawlowa
сообщение Apr 25 2007, 12:37
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Смешно, что вчера все работало.

Подрабатывает обработка одновременного нажатия двух клавиш

Код
    if ((pressed_keys == kUp | kDn) && // now these two keys
      ~(kbd_status3 & (kUp | kDn))) //and before it wasn't so
    {
      found_events |= kUpDn; // set new bit
      found_events &= ~(kUp | kDn); //reset usual bits
    }


Откомпилировалось в это

Прикрепленное изображение


Я удручен, этот код работает годами на разных платформах. Что не так?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
wodya
сообщение Apr 25 2007, 12:59
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 27-03-07
Пользователь №: 26 549



Код
    if ((pressed_keys == kUp | kDn) && // now these two keys
      ~(kbd_status3 & (kUp | kDn))) //and before it wasn't so
    {
      found_events |= kUpDn; // set new bit
      found_events &= ~(kUp | kDn); //reset usual bits
    }


Первое kUp | kDn тоже хорошо бы в скобки. Насколько я помню, сначала производится == а затем битовые операции
Go to the top of the page
 
+Quote Post
Guest_=AVR=_*
сообщение Apr 25 2007, 13:08
Сообщение #3





Guests






Похоже, что не обработался двухстрочный код (кстати, не вижу знака конкатенации). Попробуй так же, но в одной строке:

Код
    if ((pressed_keys == kUp | kDn) &&  ~(kbd_status3 & (kUp | kDn)))    {
      found_events |= kUpDn; // set new bit
      found_events &= ~(kUp | kDn); //reset usual bits
    }
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Apr 25 2007, 13:41
Сообщение #4


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Двухстрочные коды, даже с комментариями, в ИАРе обрабатываются нормально.
Знак продолжения строки нужен только в макросах.
Похоже таки проблема с приоритетом операций. ИАР в этом плане довольно жёстко следует стандарту. Странно, что раньше и на других платформах работало.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 25 2007, 13:45
Сообщение #5


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Dog Pawlowa @ Apr 25 2007, 08:37) *
Подрабатывает обработка одновременного нажатия двух клавиш

Код
    if ((pressed_keys == kUp | kDn) && // now these two keys
      ~(kbd_status3 & (kUp | kDn))) //and before it wasn't so
    {
      found_events |= kUpDn; // set new bit
      found_events &= ~(kUp | kDn); //reset usual bits
    }

Я удручен, этот код работает годами на разных платформах. Что не так?


Мне кажется, у вас неправильное использование оператора if(условие). Условие должно быть логическим выражением. В первой строке у вас всё правильно, оператор == даёт логическое выражение (ЛВ), хотя как уже сказали, оператор == имеет приоритет перед оператором ИЛИ. Во второй строке, в скобках, у вас идёт побитовое сравнение, что не ЕСТЬ логическое выражение, а просто некое двоичное число. Затем с помощью оператора && (логическое И) вы пытаетесь обработать первое ЛВ и побитовую инверсию числа, как следствие, результат может быть непредсказуем.

Вторую строчку вам надо представить в виде логического выражения.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Apr 25 2007, 13:48
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Борюсь пока.
Последовательность действительно неправильна, двухстрочный код не влияет.
Влияет сложная формула, от нее компилятор клинит - так что ищу путь попроще, разбивая формулу на части (помогая компилятору в стиле Князева).
Обычно я стараюсь реже смотреть ассемблерный код, но вот это удивило:

Код
     76              found_events |= kUpDn;                            // set new bit
   \   000000E0   ....               LDI     R30, LOW(found_events)
   \   000000E2   ....               LDI     R31, (found_events) >> 8
   \   000000E4   8100               LD      R16, Z
   \   000000E6   6100               ORI     R16, 0x10
   \   000000E8   8300               ST      Z, R16
     77              found_events &= ~(kUp | kDn);                     //reset usual bits
   \   000000EA   ....               LDI     R30, LOW(found_events)                     !!!!!!!!!!!!!!!!!!!!!!!!!
   \   000000EC   ....               LDI     R31, (found_events) >> 8                   !!!!!!!!!!!!!!!!!!!!!!!!
   \   000000EE   8100               LD      R16, Z                                             !!!!!!!!!!!!!!!!!!!!!!!
   \   000000F0   7F09               ANDI    R16, 0xF9
   \   000000F2   8300               ST      Z, R16
   \   000000F4   9508               RET


Из шести команд три тупо дублируются. Оптимизация включена LOW. Хороший маркетинговый ход - эти уровни оптимизации.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Igor26
сообщение Apr 25 2007, 13:51
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Цитата
Знак продолжения строки

А как он указывается(записывается)? Правда не знаю. Подскажите пожалуйста.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 25 2007, 13:51
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dog Pawlowa @ Apr 25 2007, 12:37) *
Я удручен, этот код работает годами на разных платформах. Что не так?

Я удручен не меньше вашего, за Вас и за все "платформы" на которых НЕ СОБЛЮДАЕТСЯ приоритет операции равно (==) перед поразрядным логическим или (|).
Код
    if ((pressed_keys == (kUp | kDn)) && // now these two keys
      ~(kbd_status3 & (kUp | kDn))) //and before it wasn't so


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 25 2007, 13:54
Сообщение #9


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



[DELETED]
Совсем не по теме.

Сообщение отредактировал IgorKossak - Apr 25 2007, 14:00


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Apr 25 2007, 13:56
Сообщение #10


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Dog Pawlowa @ Apr 25 2007, 13:48) *
Из шести команд три тупо дублируются. Оптимизация включена LOW. Хороший маркетинговый ход - эти уровни оптимизации.

А что Вы хотели? При оптимизации LOW никакие обращения к переменным не оптимизируются.
Откуда производителям ПО знать, может Вам так надо. Поставьте хотябы MEDIUM и посмотрите.
Я, например, всегда ставлю максимум.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Apr 25 2007, 13:58
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(=GM= @ Apr 25 2007, 13:45) *
Мне кажется, у вас неправильное использование оператора if(условие). Условие должно быть логическим выражением...

Да, уже вижу, что что-то не так. Разделил проверку условий, вернут прибор и проверю.
Всем спасибо, с вашими подсказками добью. smile.gif
Но странно. Вчера по одновременному нажатию этих клавиш запускал тест, а сегодня событие генерируется постоянно cranky.gif
Пятна на Солнце.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Apr 25 2007, 14:02
Сообщение #12


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Igor26 @ Apr 25 2007, 13:51) *
А как он указывается(записывается)? Правда не знаю. Подскажите пожалуйста.

Например так:
Код
#define SOMETHING (THIS |        \
                               OR_THIS)
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Apr 25 2007, 14:04
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(zltigo @ Apr 25 2007, 13:51) *
Я удручен не меньше вашего, за Вас и за все "платформы" на которых НЕ СОБЛЮДАЕТСЯ приоритет операции равно (==) перед поразрядным логическим или (|)...

Принимаю соболезнования. sad.gif
Ошибка в приоритетах влияла, видимо, на незначительные свойства - неподавленный дребезг комбинации клавиш, который не влиял на пользовательские свойства.

Перепроверил.
Это тот же код для MSP430. Тоже IAR.
kDn=2, kUp=8.
А теперь расскажите мне про последовательность операций... smile.gif

Код
    72                      if ((pressed_keys==kUp+kDn)&&  // now this two keys
     73                          ((~kbd_status3)&(kUp+kDn)))//and before it wasn't so
   \   00008E   F2900A00....         CMP.B   #0xa, &pressed_keys
   \   000094   0D20                 JNE     ??KbdService_6
   \   000096   5E42....             MOV.B   &kbd_status3, R14
   \   00009A   7EE3                 XOR.B   #0xff, R14
   \   00009C   7EB00A00             BIT.B   #0xa, R14
   \   0000A0   0724                 JEQ     ??KbdService_6
     74                          {found_events|=kUpDn;    // set new bit
   \   0000A2   F2D01000....         BIS.B   #0x10, &found_events
     75                          found_events&=~(kUp+kDn);    break; } //reset usual bits
   \   0000A8   F2F0F500....         AND.B   #0xf5, &found_events
   \   0000AE   3041                 RET


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 25 2007, 14:59
Сообщение #14


Гуру
******

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



Цитата(Dog Pawlowa @ Apr 25 2007, 13:04) *
А теперь расскажите мне про последовательность операций... smile.gif
Ищите 10 отличий: kUp+kDn и kUp | kDn


--------------------
На любой вопрос даю любой ответ
"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
Dog Pawlowa
сообщение Apr 25 2007, 15:02
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Сергей Борщ @ Apr 25 2007, 14:59) *
Ищите 10 отличий: kUp+kDn и kUp | kDn

Спасибо. Интересно, коллективный разум знает, зачем я поменял ? sad.gif

И все это не объясняет почему работало вчера на AVR в уже неправильном виде.
Впрочем, нужно идти вперед.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 17:47
Рейтинг@Mail.ru


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