Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Странности при оптимизации
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Страницы: 1, 2
sergeeff
Да надо плюнуть на все эти глупости, написать:

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


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

После можно расслабиться и спокойно готовиться к празднованию Нового года. Чего всем и желаю.
zltigo
Цитата(rezident @ Dec 28 2008, 04:23) *
Специально скачал IAR EWARM 5.20.2.

На V5 не проверял под рукой был последний из V4. Если планомерно убирают, то тем хуже sad.gif. Причины, по которым считаю отсутствие предупреждений неправильным, изложил ранее. Косвенной причиной промолчать может служить и реальная необходимость в такой конструкции do{...}while(FALSE) Хотя и в этом случае лично я предпочел-бы "официальный трюк" для такого действа вместо молчаливой оптмизации. Если говорить о дурных программиских привычках, то часто встречаются комментирование куска исходника ввиде if(0){.....}
_Pasha
Думаю, что пишу в тему. История такая (WinAVR):
Все знают, что манипуляции с main() - дело неприличное. В общем, заметил я глупости, которые делает последний WinAVR - лишние сохранения/восстановления регистров, после чего стал везде писать
Код
int main (void) __attribute__((naked));
int main(void)
{
//итд итп
}

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


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

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

Ничего не мешает, если сие необходимо сделать из main() return и вернувшись в startup заняться другими делами, например, выполнением supermain().... Посему в качестве "навязчивого сервиса" делать main() особой совершенно не верно. Ручками - ручками пожалуйста.
Сергей Борщ
Цитата(_Pasha @ Dec 28 2008, 10:44) *
после чего стал везде писать
Код
int main (void) __attribute__((naked));
А это не вам aesok тут на форуме объяснял, что naked, кроме сохранения ненужных регистров, еще и выделение стека под локальные переменные отбрасывает? Т.е. делать так нельзя, для main() и подобных функций есть атрибут OS_task.
SysRq
Если main() вызывается единожды и до разрешения прерываний, то логичнее использовать атрибут OS_main (насколько я запомнил, отличается от OS_task тем что не сохраняет I).
_Pasha
Цитата(Сергей Борщ @ Dec 28 2008, 15:56) *
А это не вам aesok тут на форуме объяснял

Каюсь. smile.gif
Однако, не имею привычки использовать локальные переменные, описанные непосредственно main() {здесь}. Я имею ввиду для AVR - праздная трата памяти.
DenisIV
Подскажите ещё плиз: У меня на асме для оптимизации была такая конструкция подпрограммы с несколькими точками входа. Например: здоровенная подпрограмма, которой передаётся байт для обработки (~100 вызовов) и вызов этой же подпрограммы с вполне конкретным значением (3-4 варианта по ~40 вызовов) Как можно это применить в С? Как программист C я понимаю, что вызов функции, которая будет содержать константу для этой функции подойдёт, но для PIC (8 уровней стека sad.gif ) не прокатит... Есть какая-нибудь альтернатива? Дополнительный параметр в функции передавать не хочу- в экономии смысла не будет, скорее наоборот. Глобальная переменная-как вариант, но не выход...
Есть возможность вызвать функцию с какой-либо метки внутри, или это совсем глупо? Или есть варианты?
Или это должен делать и считать оптимизатор?
DenisIV
Народ, это действительно засада или лыжи не едут... ?
ARV
по идее в стандартной библиотеке Си предусмотрен модуль для организации переходов куда попало... в том числе внутрь любого места люой функции...
setjmp.h или longjmp.h - типа этого (наверное, в конкретных реализациях может быть другой модуль)... но боюсь, что этот подход только усугубит проблему...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.