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

 
 
5 страниц V  « < 2 3 4 5 >  
Reply to this topicStart new topic
> Странности при оптимизации
zltigo
сообщение Dec 27 2008, 22:38
Сообщение #46


Гуру
******

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



Цитата(rezident @ Dec 28 2008, 01:18) *
В последних версиях IAR не выдает ни warning, ни remark ни на while(1), ни на for(;1;) .

Последние это какие? Ремарки включите.
Код
    573          
    574              for(; 1; )
                            ^
Remark[Pe236]: controlling expression is constant
    575              {
    576                  led_process( led_cnt++ );

Цитата
По-вашему фирма IAR "прогнулась" под привычки программистов? Как-то не соотносится это (желание "прогнуться") с введением той же MISRA C в их компиляторы, не находите?

Не нахожу. MISRA присутствует с незапамятных времен и с "успехом" ругается практически на все smile.gif, что написано. И соответственно доводит до полного абсурда систему варнингов.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 27 2008, 23:16
Сообщение #47


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(zltigo @ Dec 28 2008, 03:38) *
Последние это какие? Ремарки включите
Ремарки включены. Проверил выражения while(1) и for (;1;) на 4-х версиях IAR: EW430 3.30A, EW430 4.10A, EW430 4.11B, EW430 4.20.1. Выдается такая же ремарка, как у вас в примере, но только на версии 3.30A 2005-го года выпуска. На остальных проглатывает без "всхлипов".
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 28 2008, 00:09
Сообщение #48


Гуру
******

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



Цитата(rezident @ Dec 28 2008, 02:16) *
Проверил...

Значит потеряли в 430 ветке. В ARM есть. Причем дело не в "проблеме" банального while( 1 ) а во всех выражениях, где по уже по ошибке получается вечное условие, которе молча тупо и молча sad.gif sad.gif sad.gifвыполняется. Это безусловно не подарок sad.gif И паронаидальная MISRA такого не поймает.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 28 2008, 01:23
Сообщение #49


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(zltigo @ Dec 28 2008, 05:09) *
Значит потеряли в 430 ветке. В ARM есть.
Возникло сомнение. Может я что-то не так делаю? cranky.gif Специально скачал IAR EWARM 5.20.2. Создал новый проект. Включил ремарки везде, где только их встретил в опциях проекта. Но в результате ни на while(1), ни на for (;1;) осуждающих сообщений от компилятора я не получаю. laughing.gif Что я не так делаю?
Go to the top of the page
 
+Quote Post
dch
сообщение Dec 28 2008, 01:42
Сообщение #50


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

Группа: Участник
Сообщений: 1 179
Регистрация: 15-09-04
Из: 141070 г. Королев МО, улица Горького 39-121
Пользователь №: 661



Цитата(rezident @ Dec 28 2008, 04:23) *
ни на while(1), ни на for (;1;) осуждающих сообщений от компилятора я не получаю.

обыная практика, использовать только ограниченное количество подобных конструкций и при переходе на новый кроскомпилятор их проверить. Все эти девелоперы сейчас не дофинансированы - и поэтому работают некоторые вещи часто не здорово.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 28 2008, 01:49
Сообщение #51


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Да надо плюнуть на все эти глупости, написать:

Код
label1:
...
...
goto label1;


и будет вам счастье! Никаких warning'ов, корректно и, скорее всего, максимально быстрый цикл. Правда, не структурненько, но и хрен бы с ними, этими условностями.

После можно расслабиться и спокойно готовиться к празднованию Нового года. Чего всем и желаю.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 28 2008, 08:37
Сообщение #52


Гуру
******

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



Цитата(rezident @ Dec 28 2008, 04:23) *
Специально скачал IAR EWARM 5.20.2.

На V5 не проверял под рукой был последний из V4. Если планомерно убирают, то тем хуже sad.gif. Причины, по которым считаю отсутствие предупреждений неправильным, изложил ранее. Косвенной причиной промолчать может служить и реальная необходимость в такой конструкции do{...}while(FALSE) Хотя и в этом случае лично я предпочел-бы "официальный трюк" для такого действа вместо молчаливой оптмизации. Если говорить о дурных программиских привычках, то часто встречаются комментирование куска исходника ввиде if(0){.....}


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 28 2008, 08:44
Сообщение #53


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Думаю, что пишу в тему. История такая (WinAVR):
Все знают, что манипуляции с main() - дело неприличное. В общем, заметил я глупости, которые делает последний WinAVR - лишние сохранения/восстановления регистров, после чего стал везде писать
Код
int main (void) __attribute__((naked));
int main(void)
{
//итд итп
}

Худеет где-то на 24 и более байта.
Т.е. компилер не понимат, что с main() не надо так обращаться, как со всеми прочими функциями...sad.gif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 28 2008, 08:55
Сообщение #54


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(zltigo @ Dec 28 2008, 13:37) *
Если планомерно убирают, то тем хуже sad.gif. Причины, по которым считаю отсутствие предупреждений неправильным, изложил ранее. Косвенной причиной промолчать может служить и реальная необходимость в такой конструкции do{...}while(FALSE) Хотя и в этом случае лично я предпочел-бы "официальный трюк" для такого действа вместо молчаливой оптмизации.


Возможно, это и есть "официальный трюк"? В смысле, может быть, ремарки не выдаются только на несколько фиксированных конструкций?
Rezident, не могли бы Вы проверить что-нибудь позаковыристей?
Типа
Код
unsigned a;
while (a >= 0){
   ...
}

, или что-то наподобие?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 28 2008, 09:00
Сообщение #55


Гуру
******

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



Цитата(_Pasha @ Dec 28 2008, 11:44) *
Т.е. компилер не понимат, что с main() не надо так обращаться, как со всеми прочими функциями...sad.gif

Ничего не мешает, если сие необходимо сделать из main() return и вернувшись в startup заняться другими делами, например, выполнением supermain().... Посему в качестве "навязчивого сервиса" делать main() особой совершенно не верно. Ручками - ручками пожалуйста.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 28 2008, 11:56
Сообщение #56


Гуру
******

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



Цитата(_Pasha @ Dec 28 2008, 10:44) *
после чего стал везде писать
Код
int main (void) __attribute__((naked));
А это не вам aesok тут на форуме объяснял, что naked, кроме сохранения ненужных регистров, еще и выделение стека под локальные переменные отбрасывает? Т.е. делать так нельзя, для main() и подобных функций есть атрибут OS_task.


--------------------
На любой вопрос даю любой ответ
"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
SysRq
сообщение Dec 29 2008, 11:12
Сообщение #57


Чайник, 1 литр
****

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



Если main() вызывается единожды и до разрешения прерываний, то логичнее использовать атрибут OS_main (насколько я запомнил, отличается от OS_task тем что не сохраняет I).
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 29 2008, 12:33
Сообщение #58


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Сергей Борщ @ Dec 28 2008, 15:56) *
А это не вам aesok тут на форуме объяснял

Каюсь. smile.gif
Однако, не имею привычки использовать локальные переменные, описанные непосредственно main() {здесь}. Я имею ввиду для AVR - праздная трата памяти.
Go to the top of the page
 
+Quote Post
DenisIV
сообщение Dec 30 2008, 20:19
Сообщение #59


Участник
*

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



Подскажите ещё плиз: У меня на асме для оптимизации была такая конструкция подпрограммы с несколькими точками входа. Например: здоровенная подпрограмма, которой передаётся байт для обработки (~100 вызовов) и вызов этой же подпрограммы с вполне конкретным значением (3-4 варианта по ~40 вызовов) Как можно это применить в С? Как программист C я понимаю, что вызов функции, которая будет содержать константу для этой функции подойдёт, но для PIC (8 уровней стека sad.gif ) не прокатит... Есть какая-нибудь альтернатива? Дополнительный параметр в функции передавать не хочу- в экономии смысла не будет, скорее наоборот. Глобальная переменная-как вариант, но не выход...
Есть возможность вызвать функцию с какой-либо метки внутри, или это совсем глупо? Или есть варианты?
Или это должен делать и считать оптимизатор?

Сообщение отредактировал DenisIV - Dec 30 2008, 20:38
Go to the top of the page
 
+Quote Post
DenisIV
сообщение Jan 18 2009, 10:28
Сообщение #60


Участник
*

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



Народ, это действительно засада или лыжи не едут... ?
Go to the top of the page
 
+Quote Post

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

 


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


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