Цитата(RodionGork @ Sep 22 2009, 09:41)

И тут я обнаруживаю, что с директивой компилятора -O0 компилятор даже три простые действия очень плохо умещает в отведенное время. Еще бы: например "PORTD|=(1<<6)" превращается в конструкцию из шести команд, суть которых в том чтобы взять значение из адреса памяти, соответствующего регистру и после манипуляций с ним туда же его вернуть.
А теперь подумайте логически. -O0 заставляет компилятор отключить оптимизацию напрочь. Что вы написали в команде? "Взять содержимое PORTD, сделать ИЛИ c 0x40, записать результат в PORTD". Что сделал компилятор? В точности то, что вы просили. Какие претензии? -O0 использовать не нужно никогда! Для AVR используйте только -Os.
Поищите по форуму расширенным поиском по слову "оптимизация" и имени пользователя
aesok, он частенько описывал разные ключи.
Цитата(RodionGork @ Sep 22 2009, 09:41)

Ладно, ставлю -O1 или -O2 - тогда компилятор разом вспоминает про инструкции sbi для этих случаев - ну умница! Однако при этом же он, как я наблюдаю, клонирует код и даже местами переставляет его. Из-за этого я очень плохо понимаю что вообще происходит
Он делает код для контроллера. Ну не может он генерить код, подстраиваясь под меру понимания конкретного программиста.
Цитата(RodionGork @ Sep 22 2009, 09:41)

и, что гораздо хуже, не могу точно определить где и сколько микросекунд проходит.
Прогоните код в симуляторе, или, еще лучше, дергайте ногой в ключевых точках и смотрите осциллографом.
Цитата(RodionGork @ Sep 22 2009, 09:41)

Можно ли ему как-то деликатно объяснить, чтобы избавил меня от этой "прыжковой оптимизации", но сохранил всю остальную?
Давайте на конкретных примерах, что значит "прыжковая оптимизация".