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

 
 
> бага в оптимизаторе ICCAVR 3.20D, Всплыла бага, стабильная повторяемость.
KRS
сообщение Jan 18 2008, 16:41
Сообщение #1


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Я использую еще версию 3.20, но самую последнию версию компилера 3.20D
Тут неожиданно всплыла бага оптимизатора.

Самый короткий способ получить
Код
#include <iom128.h>
__no_init __regvar volatile unsigned char test@14;

void test_failed(void)
{
    test = 0x0f;
    while(1) {
        PORTA = 0;
        PORTA = 0x0f;
    }
}

В листинге получаем
Код
   4          void test_failed(void)
   \                     test_failed:
      5          {
   \   00000000                              REQUIRE ?Register_R14_is_global_regvar
      6              test = 0x0f;
   \   00000000   E00F                       LDI     R16,15
   \   00000002   2EE0                       MOV     R14,R16
      7              while(1) {
      8                  PORTA = 0;
   \                     ??test_failed_0:
   \   00000004   E000                       LDI     R16,0
   \   00000006   BB0B                       OUT     0x1B,R16
      9                  PORTA = 0x0f;
   \   00000008   BAEB                       OUT     0x1B,R14
   \   0000000A   CFFC                       RJMP    ??test_failed_0
     10              }
     11          }


А т.к. test используется в прерываниях...
У меня в проекте в одном месте есть похожее присваивание, а дальше регистр только в прерываниях используется...

У себя обошел примерно так:
Код
void test_ok(void)
{
    volatile unsigned char dummy;
    dummy = 0x0f;
    test = dummy;
    while(1) {
        PORTA = 0;
        PORTA = 0x0f;
    }
}

     13          void test_ok(void)
   \                     test_ok:
     14          {
   \   00000000                              REQUIRE ?Register_R14_is_global_regvar
   \   00000000   95CA                       DEC     R28
     15              volatile unsigned char dummy;
     16              dummy = 0x0f;
   \   00000002   E00F                       LDI     R16,15
   \   00000004   8308                       ST      Y,R16
     17              test = dummy;
   \   00000006   8108                       LD      R16,Y
   \   00000008   2EE0                       MOV     R14,R16
     18              while(1) {
     19                  PORTA = 0;
   \                     ??test_ok_0:
   \   0000000A   E000                       LDI     R16,0
   \   0000000C   BB0B                       OUT     0x1B,R16
     20                  PORTA = 0x0f;
   \   0000000E   E00F                       LDI     R16,15
   \   00000010   BB0B                       OUT     0x1B,R16
   \   00000012   CFFB                       RJMP    ??test_ok_0
     21              }
     22          }

Как видно из второго листинга, с обычным volatile работает нормально сохраняет константу, потом загружает обратно, потом в регистр запихивает.

У меня тут валялся еще 4.11A тот же эффект.
Пропадает еще если вызывается хотя бы одна функция между присваиваниями.

Сообщение отредактировал KRS - Jan 18 2008, 17:03
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 10)
Сергей Борщ
сообщение Jan 19 2008, 10:09
Сообщение #2


Гуру
******

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



Цитата(VladislavS @ Jan 19 2008, 10:17) *
А если вы явно его портите в прерывании, то себя и вините.
Вы как минимум не поняли о чем шла речь. Почитайте, в каких случаях используется, и к какому поведению должен приводить квалификатор volatile.


--------------------
На любой вопрос даю любой ответ
"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
singlskv
сообщение Jan 19 2008, 10:45
Сообщение #3


дятел
*****

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



Да, реальная бага... 07.gif
Нечто похожее есть при работе с одинаковыми константами на WinAVR2006..., правда
там это не приводит к столь катастрофическим последствиям, там это проявляется просто в генрации
очень неоптимального кода.

В Вашем конкретном случае спасет замена:
test = 0x0f;
на
test = 0x0e;
test++;
Go to the top of the page
 
+Quote Post
KRS
сообщение Jan 19 2008, 13:43
Сообщение #4


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(singlskv @ Jan 19 2008, 13:45) *
В Вашем конкретном случае спасет замена:
test = 0x0f;
на
test = 0x0e;
test++;

К сожаленю это не атомарная опреация.
она транслируется в две mov r14, r16 inc r14
Атомарными получаются присваивания констант (кроме 1 она транслируется в clr inc).
Установка бита, очистка бита транслируется в ( set / clt bld ) таким образом можно передавать и считывать флаги в/из прерывания.
Go to the top of the page
 
+Quote Post
Baser
сообщение Jan 19 2008, 14:12
Сообщение #5


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(KRS @ Jan 18 2008, 18:41) *
Я использую еще версию 3.20, но самую последнию версию компилера 3.20D
Тут неожиданно всплыла бага оптимизатора.
...
У меня тут валялся еще 4.11A тот же эффект.

Проверил на 4.21А - тот же эффект. Проявляется на уровнях оптимизации Medium и High.
При уровнях None и Low все нормально, из регистра значение не берет.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 19 2008, 16:20
Сообщение #6


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



и 4.30A тоже. Блин, неприятно.

Может кто, у кого есть EWAVR купленный, поставит их в известность? Или прислушаются и так?


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 19 2008, 16:35
Сообщение #7


дятел
*****

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



Цитата(Rst7 @ Jan 19 2008, 19:20) *
и 4.30A тоже. Блин, неприятно.
Может кто, у кого есть EWAVR купленный, поставит их в известность? Или прислушаются и так?
ИМХО, прислушаются и так...
Самым правильным, наверное, автору топика стоило бы зарегестрится на IAR, скачать еволюшен
версию, откомпилить примеры и послать в IAR листинг.
Может и какой бонус от IAR отвалится... smile.gif
Тока регестриться лучше на частное лицо, на всякий случай...
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jan 20 2008, 11:09
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Да, виноват. sad.gif Это действительно бага. Правда в хэлпе сказано, что

The Global register variables are treated as a non-triggering volatile.

Если честно, "non-triggering volatile" не осознал.
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jan 28 2008, 12:28
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Цитата(SIA @ Jan 27 2008, 01:26) *
Баг. Путает константу с переменной sad.gif


Неа, забивает на волшебное слово volatile.
Go to the top of the page
 
+Quote Post
Kirill Frolov
сообщение Jan 28 2008, 14:00
Сообщение #10


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

Группа: Новичок
Сообщений: 111
Регистрация: 10-02-07
Из: St.Petersburg, Russia
Пользователь №: 25 241



Цитата(VladislavS @ Jan 28 2008, 15:28) *
Неа, забивает на волшебное слово volatile.


Это он вам как бы говорит, что воровать как бы нехорошо.

Сообщение отредактировал IgorKossak - Jan 29 2008, 06:06


--------------------
[ZX]
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jan 29 2008, 10:27
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Либо смайликов наставь, либо покажи что генерит лицензионный. А то пукнуть в воду и я могу.
Go to the top of the page
 
+Quote Post

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

 


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


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