|
Непонятный результат компиляция на IARe, Подскажите, в чем я не прав |
|
|
|
Apr 25 2007, 12:37
|
Гуру
     
Группа: Свой
Сообщений: 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 } Откомпилировалось в это
Я удручен, этот код работает годами на разных платформах. Что не так?
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Apr 25 2007, 12:59
|
Частый гость
 
Группа: Свой
Сообщений: 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 тоже хорошо бы в скобки. Насколько я помню, сначала производится == а затем битовые операции
|
|
|
|
Guest_=AVR=_*
|
Apr 25 2007, 13:08
|
Guests

|
Похоже, что не обработался двухстрочный код (кстати, не вижу знака конкатенации). Попробуй так же, но в одной строке: Код if ((pressed_keys == kUp | kDn) && ~(kbd_status3 & (kUp | kDn))) { found_events |= kUpDn; // set new bit found_events &= ~(kUp | kDn); //reset usual bits }
|
|
|
|
|
Apr 25 2007, 13:45
|

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(условие). Условие должно быть логическим выражением. В первой строке у вас всё правильно, оператор == даёт логическое выражение (ЛВ), хотя как уже сказали, оператор == имеет приоритет перед оператором ИЛИ. Во второй строке, в скобках, у вас идёт побитовое сравнение, что не ЕСТЬ логическое выражение, а просто некое двоичное число. Затем с помощью оператора && (логическое И) вы пытаетесь обработать первое ЛВ и побитовую инверсию числа, как следствие, результат может быть непредсказуем. Вторую строчку вам надо представить в виде логического выражения.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Apr 25 2007, 13:48
|
Гуру
     
Группа: Свой
Сообщений: 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. Хороший маркетинговый ход - эти уровни оптимизации.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Apr 25 2007, 13:51
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Apr 25 2007, 13:58
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(=GM= @ Apr 25 2007, 13:45)  Мне кажется, у вас неправильное использование оператора if(условие). Условие должно быть логическим выражением... Да, уже вижу, что что-то не так. Разделил проверку условий, вернут прибор и проверю. Всем спасибо, с вашими подсказками добью. Но странно. Вчера по одновременному нажатию этих клавиш запускал тест, а сегодня событие генерируется постоянно Пятна на Солнце.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Apr 25 2007, 14:04
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(zltigo @ Apr 25 2007, 13:51)  Я удручен не меньше вашего, за Вас и за все "платформы" на которых НЕ СОБЛЮДАЕТСЯ приоритет операции равно (==) перед поразрядным логическим или (|)... Принимаю соболезнования. Ошибка в приоритетах влияла, видимо, на незначительные свойства - неподавленный дребезг комбинации клавиш, который не влиял на пользовательские свойства. Перепроверил. Это тот же код для MSP430. Тоже IAR. kDn=2, kUp=8. А теперь расскажите мне про последовательность операций... Код 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
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Apr 25 2007, 15:02
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Сергей Борщ @ Apr 25 2007, 14:59)  Ищите 10 отличий: kUp+kDn и kUp | kDn Спасибо. Интересно, коллективный разум знает, зачем я поменял ?  И все это не объясняет почему работало вчера на AVR в уже неправильном виде. Впрочем, нужно идти вперед.
--------------------
Уходя, оставьте свет...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|