Почитайте в IAR Compiler Reference на счет #pragma optimize=.... Для IAR for MSC-51 доки не читал, но для MSP430 точно есть эта pragma, которая позволяет регулировать или отключать оптимизацию для части кода. Эта прагма имеет эффект только для функции, следующей сразу после неё. Например, #pragma optimize=s 9 - Оптимизация по скорости, High #pragma optimize=z 6 - Оптимизация по размеру кода, Medium #pragma optimize=s 2 - Оптимизация по скорости отключена и т.д.
Я понял почему не работает. Я просто пытался применить прагму к участку кода а не к функции целиком. Мне просто необходимо было точно выдержать задержку, а компиллер неправильно это оптимизировал. Буду бороться дальше. А вот вынос в отдельную функцию мне не подходит - теряется вся выгода - при вызове функции скидывается в стек большое количесство параметров и это происходит дольше чем требуется. Спасибо за помощь.
Если выделенную функцию обьявить static, то она будет инлайниться в то место откуда она вызвана (если это место одно и в одном файле с самой функцией). При этом уровни оптимизации можно будет для выделенной функции задавать любые отличные от основной.