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

 
 
> Странности при оптимизации
DenisIV
сообщение Dec 23 2008, 12:40
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 11-12-08
Из: Республика Беларусь, г.Минск
Пользователь №: 42 380



Кстати, раз уж о глюках:

У меня при включенной оптимизации компилятор думает, что раз тела у while нет, то можно и зациклить сам на себя БЕЗ проверки условия, т.е.

MojBit=1;

while(MojBit==1) { };

в асме выглядит так:

Addr: rjmp Addr

Если в тело хотя бы вставить _NOP(); т.е. while(MojBit==1) {_NOP();};

картина меняется - добавляется загрузка вита в 1 и проверка в теле while. Вопрос знатокам: Почему? Компилятор умнее пользователя?

Модератор.
Тема выделена как отдельная из другого топика.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
DenisIV
сообщение Dec 25 2008, 21:19
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 11-12-08
Из: Республика Беларусь, г.Минск
Пользователь №: 42 380



Ещё вопросик:
Например, компилятор HiTech предупреждает при:
Код
while(1)  { .... }
while(1)  { .... }

типа warning: infinity loop, а вот ИАР не предупреждает, а молча делает... smile.gif
Но это лирика...

У меня (в данном случае ИАР) ругается на переменные, когда я их обзываю volatile на то, что он не может просчитать их значение, т.к. не проинициализированы.
А инитить я их не хочу, т.к. эти переменные лежат в озу и должны быть валидны и просле ресета (я их инициализю отдельно, считая их CRC или анализируя флаг сброса по питанию)
Вот тут и грабли... (Опять повторю, прогу полностью переписать не cмогу(высшая математика), исправляю за самоучками sad.gif )
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 25 2008, 22:26
Сообщение #3


Гуру
******

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



Цитата(DenisIV @ Dec 25 2008, 23:19) *
типа warning: infinity loop, а вот ИАР не предупреждает, а молча делает... smile.gif
Но это лирика...
Это не лирика, это где-то у вас преднамеренно отключены предупреждения (Project->Options->C/C++ compiler->Diagnostics):
Код
void Test()
{
    while(1) { __no_operation();}
    while(1) { __no_operation();}
}

Warning[Pe128]: loop is not reachable from preceding code D:\****\loader.cpp 75
Цитата(DenisIV @ Dec 25 2008, 23:19) *
У меня (в данном случае ИАР) ругается на переменные, когда я их обзываю volatile на то, что он не может просчитать их значение, т.к. не проинициализированы.
Давайте так: Есть непонятка, выкладываете код, выкладываете полный текст предупреждения на языке оригинала, будем смотреть.
Код
volatile int a;
volatile int b;
volatile int c;
void Test()
{
    int Tmp = a;
    b = Tmp;
    Tmp = b;
    c = Tmp;
}

Done. 0 error(s), 0 warning(s)

   \                                 In segment DATA_Z, align 4, align-sorted
     72          volatile int a;
   \                     a:
   \   00000000                      DS8 4
     73          volatile int b;
   \                     `b`:
   \   00000004                      DS8 4
     74          volatile int c;
   \                     c:
   \   00000008                      DS8 4

   \                                 In segment CODE, align 4, keep-with-next
     75          void Test()
     76          {
     77              int Tmp = a;
   \                     ??Test:
   \   00000000   0248               LDR         R0,??Test_1      ;; a
   \   00000002   0168               LDR         R1,[R0, #+0]
     78              b = Tmp;
   \   00000004   4160               STR         R1,[R0, #+0x4]
     79              Tmp = b;
   \   00000006   4168               LDR         R1,[R0, #+0x4]
     80              c = Tmp;
   \   00000008   8160               STR         R1,[R0, #+0x8]
     81          }
   \   0000000A   7047               BX          LR            ;; return
   \                     ??Test_1:
   \   0000000C   ........           DC32        a
Как видите, никакой ругани, делает все, как просилось.
Я могу предположить, что ругань выглядит так:
Цитата
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement D:\*****\loader.cpp 77
Но она означает вовсе не "не может проинициализировать", а "не определен порядок обращения к volatile-переменным". И вызывает его примерно такой код:
Код
int a;
volatile int b;
volatile int c;
void Test()
{
    a = b + c;
}
И это предупреждение совершенно справедливо: стандарт позволяет компилятору изменять порядок вычисления подвыражений. А поскольку одно из свойств volatile-переменных состоит в том, что чтение может изменять ее значение (а таким свойством обладают многие sfr-регистры), то изменение порядка чтения двух volatile-переменных может привести к неожиданным для вас результатам. Поэтому для разрешения неоднозначности надо разделить чтения точками последовательности, т.е. ";" или оператором "запятая", введя временную переменную как я сделал в примере выше.
Но это лишь гадание.Если бы вы представили минимальный необходимый для воспроизведения ситуации код - вы бы получили более точный и быстрый ответ.

Цитата(DenisIV @ Dec 26 2008, 00:14) *
Варнинги достали (>100) sad.gif
Поэтому бороться надо с их причиной, а не следствием.


--------------------
На любой вопрос даю любой ответ
"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
zltigo
сообщение Dec 25 2008, 22:50
Сообщение #4


Гуру
******

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



Цитата(Сергей Борщ @ Dec 26 2008, 01:26) *
Это не лирика, это где-то у вас преднамеренно отключены предупреждения (Project->Options->C/C++ compiler->Diagnostics)

Угу, и у тебя тоже smile.gif не все включено, ибо еще, если мне не изменяет склероз, должено быть что-то типа Еxpression is constant.
Цитата(DenisIV @ Dec 26 2008, 00:19) *
while(1) { .... }

Вобще-то сие однозначно со всех точек зрения пишется так:
Код

for(;; )  { .... }


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- DenisIV   Странности при оптимизации   Dec 23 2008, 12:40
- - Палыч   Цитата(DenisIV @ Dec 23 2008, 15:40) Вопр...   Dec 23 2008, 12:52
|- - DenisIV   Цитата(Палыч @ Dec 23 2008, 15:52) Почему...   Dec 23 2008, 18:37
|- - Nemo2000   Цитата(DenisIV @ Dec 23 2008, 21:37) Вы з...   Dec 23 2008, 19:16
- - scifi   Цитата(DenisIV @ Dec 23 2008, 15:40) Вопр...   Dec 23 2008, 14:35
- - sergeeff   Просто не устаю поражаться. На нашем форуме про vo...   Dec 23 2008, 22:38
|- - DenisIV   Цитата(sergeeff @ Dec 24 2008, 01:38) Про...   Dec 23 2008, 23:21
|- - rezident   Цитата(DenisIV @ Dec 24 2008, 04:21) И ес...   Dec 23 2008, 23:43
|- - sergeeff   Цитата(DenisIV @ Dec 24 2008, 03:21) Прош...   Dec 24 2008, 01:12
- - DenisIV   2rezident: со static (и не тоько) разобрался, спас...   Dec 24 2008, 02:56
- - sergeeff   Я все не пойму, что за проблемы "с этой оптим...   Dec 24 2008, 12:41
|- - DenisIV   Цитата(sergeeff @ Dec 24 2008, 15:41) Я в...   Dec 24 2008, 12:55
|- - XVR   Цитата(DenisIV @ Dec 24 2008, 15:55) Кажд...   Dec 24 2008, 14:13
|- - DenisIV   Цитата(XVR @ Dec 24 2008, 17:13) Нет. Ком...   Dec 24 2008, 15:47
|- - defunct   Цитата(DenisIV @ Dec 24 2008, 17:47) А ес...   Dec 24 2008, 17:09
|- - DenisIV   Цитата(defunct @ Dec 24 2008, 20:09) #pra...   Dec 25 2008, 13:17
|- - Сергей Борщ   Цитата(DenisIV @ Dec 25 2008, 15:17) Спас...   Dec 25 2008, 13:24
|- - DenisIV   Цитата(Сергей Борщ @ Dec 25 2008, 16:24) ...   Dec 25 2008, 13:36
- - sergeeff   Уважаемый DenisIV! Если вы хотите быть ...   Dec 24 2008, 16:26
|- - zltigo   Цитата(sergeeff @ Dec 24 2008, 19:26) Я у...   Dec 24 2008, 17:35
|- - sergeeff   Цитата(zltigo @ Dec 24 2008, 21:35) Про ...   Dec 24 2008, 22:09
|- - zltigo   Цитата(sergeeff @ Dec 25 2008, 01:09) К п...   Dec 24 2008, 23:00
- - sergeeff   Я не являюсь разрабочиком компиляторов и линкеров....   Dec 25 2008, 01:16
|- - XVR   Цитата(sergeeff @ Dec 25 2008, 04:16) Я н...   Dec 25 2008, 07:17
|- - Сергей Борщ   Цитата(XVR @ Dec 25 2008, 09:17) Вне зави...   Dec 25 2008, 10:24
|- - XVR   Цитата(Сергей Борщ @ Dec 25 2008, 13:24) ...   Dec 26 2008, 08:53
|- - HARMHARM   Цитата(XVR @ Dec 26 2008, 10:53) ... Опти...   Dec 26 2008, 23:34
|- - XVR   Цитата(HARMHARM @ Dec 27 2008, 02:34) Это...   Dec 27 2008, 08:33
|- - Сергей Борщ   Цитата(zltigo @ Dec 26 2008, 00:50) Угу, ...   Dec 25 2008, 23:15
||- - zltigo   Цитата(Сергей Борщ @ Dec 26 2008, 02:15) ...   Dec 26 2008, 08:07
|- - DenisIV   Цитата(zltigo @ Dec 26 2008, 01:50) Вобще...   Dec 26 2008, 12:42
|- - zltigo   Цитата(DenisIV @ Dec 26 2008, 15:42) А ес...   Dec 26 2008, 13:39
|- - DenisIV   Цитата(zltigo @ Dec 26 2008, 16:39) Разум...   Dec 26 2008, 16:26
|- - zltigo   Цитата(DenisIV @ Dec 26 2008, 19:26) Что ...   Dec 26 2008, 16:41
- - rezident   DenisIV, а такой вариант объявления Код__no_init ...   Dec 25 2008, 21:38
|- - DenisIV   Цитата(rezident @ Dec 26 2008, 00:38) Den...   Dec 25 2008, 22:14
- - sergeeff   Бьярн Страустрап, 1995 г. Введение в язык С++. Гл...   Dec 26 2008, 14:29
- - sergeeff   Уважаемый гуру! 1 - она и в Африке 1. А что та...   Dec 26 2008, 20:02
|- - zltigo   Цитата(sergeeff @ Dec 26 2008, 23:02) Как...   Dec 26 2008, 23:10
- - rezident   А не пора ли уже прекратить "религиозные...   Dec 26 2008, 23:34
|- - zltigo   Цитата(rezident @ Dec 27 2008, 02:34) А н...   Dec 26 2008, 23:51
|- - rezident   Цитата(zltigo @ Dec 27 2008, 04:51) в слу...   Dec 27 2008, 22:18
|- - zltigo   Цитата(rezident @ Dec 28 2008, 01:18) В п...   Dec 27 2008, 22:38
|- - rezident   Цитата(zltigo @ Dec 28 2008, 03:38) После...   Dec 27 2008, 23:16
|- - zltigo   Цитата(rezident @ Dec 28 2008, 02:16) Про...   Dec 28 2008, 00:09
|- - rezident   Цитата(zltigo @ Dec 28 2008, 05:09) Значи...   Dec 28 2008, 01:23
|- - dch   Цитата(rezident @ Dec 28 2008, 04:23) ни ...   Dec 28 2008, 01:42
|- - zltigo   Цитата(rezident @ Dec 28 2008, 04:23) Спе...   Dec 28 2008, 08:37
|- - AHTOXA   Цитата(zltigo @ Dec 28 2008, 13:37) Если ...   Dec 28 2008, 08:55
- - sergeeff   Да надо плюнуть на все эти глупости, написать: Ко...   Dec 28 2008, 01:49
- - _Pasha   Думаю, что пишу в тему. История такая (WinAVR): Вс...   Dec 28 2008, 08:44
|- - zltigo   Цитата(_Pasha @ Dec 28 2008, 11:44) Т.е. ...   Dec 28 2008, 09:00
|- - Сергей Борщ   Цитата(_Pasha @ Dec 28 2008, 10:44) после...   Dec 28 2008, 11:56
|- - _Pasha   Цитата(Сергей Борщ @ Dec 28 2008, 15:56) ...   Dec 29 2008, 12:33
- - SysRq   Если main() вызывается единожды и до разрешения пр...   Dec 29 2008, 11:12
- - DenisIV   Подскажите ещё плиз: У меня на асме для оптимизаци...   Dec 30 2008, 20:19
- - DenisIV   Народ, это действительно засада или лыжи не едут.....   Jan 18 2009, 10:28
- - ARV   по идее в стандартной библиотеке Си предусмотрен м...   Jan 18 2009, 16:54


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

 


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


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