Цитата(&-rey @ Mar 3 2006, 13:30)

Идея впринципе одна, ASM.
Идеи не понял - при чем тут ASM?

Цитата
Причина такого кода заключена в том что сам порт обьявлен как __io а это означает что порт обьявляется как volatile
Осмелюсь напомнить, что и PORTD объявлен точно также.
Цитата
А поскольку он может измениться неведомо компилятору то он его перед изменением и вычитывает.
Рассуждения понятны, но это не из той оперы. Самое оптимальное для изменения порта - как раз использовать sbi, выполняющую все аппаратно. Я же не использую больше прочитанное значение.
Цитата
А для того чтобы было SBI CBI используй
PORTD_Bit0 = 1; // SBI
PORTD_Bit0 = 0; // CBI
и вкл Enable Bit Difinitions в Genera/ System
За подсказку спасибо, но я про эти особенности IAR знаю. Однако выше я писал, что "для себя-то я могу выйти из положения." и т.п. Вопрос в том, есть ли более-менее портабельный вариант. Предложенная конструкция с PORT_Bit, к сожалению, к таковым не относится.
Тем более, что для заданного вопроса эта конструкция неприменима в принципе. Я ведь спрашивал не про замену
(PORTD |= 0x10) - это как раз транслируется оптимально в sbi без всяких PORTD_Bit4 = 1 (IAR достаточно разумен для такой оптимизации). А про замену для
(*(&PORTD-1) |= 0x10) как эквивалента
(DDRD |= 0x10). Это к вопросу об исходной постановке задачи

.
(Расшифровка: PORTD для IAR - это переменная с модификатором __io, находящаяся по фиксированному адресу (порта), являющемуся тем самым адресом этой переменной. Операция получения адреса &PORTD дает нам этот самый адрес. Вычитая из него единицу, получаем адрес DDRD. А далее используем *(адрес DDRD) для работы, собственно, с самим значением. Все формально правильно, но IAR не воспринимает полученное значение как константное выражение адреса __io порта. Добавление всяких модификаторов типа const или __io с разными приведениями типа мне не помогло. Возможно, я не всё попробовал. В этом и состоял исходный вопрос, а не в том, как избавиться от чтения-модификации-записи - где IAR считает нужным, он это делает и сам. А вот как ему помочь в данном случае?).
PS. Почему-то, когда задаются банальные вопросы типа "как объявить переменную по фиксированному адресу", сразу же следует море правильных и не очень ответов. Стоит спросить что-то менее тривиальное - и полная тишина. Почти полная, в данном случае, так как одна попытка ответить все же была (хоть и не на тот вопрос)

.
PPS. Не считая мелких нюансов, связанных с оптимизацией C-кода под gcc-avr, и не столь эффективную компиляцию под IAR, официальный порт avr-usb для IAR, можно сказать, уже готов. Еще пара мелких штришков по документации, и он может появиться на официальной странице проекта.
Сообщение отредактировал osnwt - Mar 3 2006, 12:07