[an error occurred while processing this directive]
|
код достаточно оптимально. В крайнем случае ассемблерный выход компилятора Вы можете подредактировать вручную, тем более, что в V2.27B, которой Вы пользуетесь, это сделать весьма просто.
Теперь о volatile. Это модификатор класса памяти, который говорит компилятору о том, что данная переменная может быть изменена неизвестным компилятору способом, в частности в процедурах обработки прерываний.
В этих случаях при обработке выражений с этой переменной компилятор не оптимизирует код. Маленький пример из моей практики:
while (!(IntFlags & TIMER0_BIT)); // Т.е ожидание установки флажка прерывания от таймера
Компилятор сгененировал примерно такой код
ldi r30, IntFlags
ld r16, z
?1: sbis r16, 1
rjmp ?1
.....
Плучился бесконечный цикл, поскольку компилятор не знал, что переменная будет изменяться по прерываниям. После объявления
volatile char IntFlags
все всало на свои места - код стал таким
ldi r30, IntFlags
?1: ld r16, z
sbis r16, 1
rjmp ?1
.....
Почитать об этом можно в документации IAR "Compiler Reference Guide".
Если будут вопросы - задавайте, чем смогу - помогу.
E-mail: info@telesys.ru