ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
4 июля
116386
vpv (21.03.2008 10:40, просмотров: 8529)
Оптимизация "чтение-модификация-запись" В 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.