|
|
  |
Странности при оптимизации |
|
|
|
Dec 27 2008, 22:38
|

Гуру
     
Группа: Свой
Сообщений: 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 присутствует с незапамятных времен и с "успехом" ругается практически на все  , что написано. И соответственно доводит до полного абсурда систему варнингов.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 28 2008, 01:49
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Да надо плюнуть на все эти глупости, написать: Код label1: ... ... goto label1; и будет вам счастье! Никаких warning'ов, корректно и, скорее всего, максимально быстрый цикл. Правда, не структурненько, но и хрен бы с ними, этими условностями. После можно расслабиться и спокойно готовиться к празднованию Нового года. Чего всем и желаю.
|
|
|
|
|
Dec 28 2008, 08:44
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

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

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

|
Цитата(zltigo @ Dec 28 2008, 13:37)  Если планомерно убирают, то тем хуже  . Причины, по которым считаю отсутствие предупреждений неправильным, изложил ранее. Косвенной причиной промолчать может служить и реальная необходимость в такой конструкции do{...}while(FALSE) Хотя и в этом случае лично я предпочел-бы "официальный трюк" для такого действа вместо молчаливой оптмизации. Возможно, это и есть "официальный трюк"? В смысле, может быть, ремарки не выдаются только на несколько фиксированных конструкций? Rezident, не могли бы Вы проверить что-нибудь позаковыристей? Типа Код unsigned a; while (a >= 0){ ... } , или что-то наподобие?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Dec 28 2008, 09:00
|

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

|
Цитата(_Pasha @ Dec 28 2008, 11:44)  Т.е. компилер не понимат, что с main() не надо так обращаться, как со всеми прочими функциями...  Ничего не мешает, если сие необходимо сделать из main() return и вернувшись в startup заняться другими делами, например, выполнением supermain().... Посему в качестве "навязчивого сервиса" делать main() особой совершенно не верно. Ручками - ручками пожалуйста.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 28 2008, 11: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)
|
|
|
|
|
Dec 30 2008, 20:19
|

Участник

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

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