vpv (21.03.2008 10:40, просмотров: 8671)
Оптимизация "чтение-модификация-запись" В IAR AVR Добрый день!
Имеется компилятор ИАР АВР 5.10А. Сишная (не плюсовая) программка, в которой
есть прерывание от SPI. Прерывание простое, но вызывается очень-очень часто,
поэтому хотелось бы избавиться от лишних тактов. Допустим, есть некая
волятильная байтовая переменная, в которой нужно взвести третий бит.
Волятильная переменная cPio в данной П.П. измениться не может, т.к.
вложенные прерываня запрещены.
Пишем:
cPio |= (1<<2);
Получаем:
LDI R30,LOW(cPio)
LDI R31,(cPio) >> 8
LD R16,Z
ORI R16,0x04
ST Z,R16
Итого 7 тактов. Теперь введем промежуточную переменную (которую ИАР, разумеется,
заоптимизирует) и чтение-модификацию-запись заменим на присвоение.
Итак:
{
unsigned char ctemp = cPio;
cPio = (ctemp |= (1<<2));
}
в результате дает:
LDS R16,cPio
ORI R16,0x04
STS cPio,R16
Итого 5 тактов, мало того - при влете в прерывание не сохраняется регистр Z
(так как он не нужен), соответственно, и при вылете не восстанавливается.
Теперь вопрос - как правильно задать оптимизацию компилятору, чтобы самому,
вручную, эти пляски с бубнами не выделывать? Я что-то все перепробовал,
квадратно-гнездовым способом, получалось только еще хуже.
Мне важна скорость, но ИАР постоянно тянет инициализировать Z и работать с ним,
вместо того, чтобы напрямую работать с LDS-STS.