реклама на сайте
подробности

 
 
> Как портабельно получить DDRx через PORTx?, Или игры с SFR-ами на IAR
osnwt
сообщение Mar 2 2006, 10:12
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 175
Регистрация: 26-01-06
Из: Sevastopol
Пользователь №: 13 664



При портировании AVR-USB драйвера с GCC на IAR вылезла небольшая проблема с точки зрения эффективности кода. Автор оригинала использует следующие конструкции, которые нормально проходят в GCC:

Код
#define USB_CFG_IOPORT          PORTD
...
#define USBIN       (*(&USB_CFG_IOPORT - 2))    /* input port for USB bits */
#define USBDDR      (*(&USB_CFG_IOPORT - 1))    /* data direction for USB bits */


Под IAR это все транслируется, но превращается вот в такой вот кошмар:

Код
// USBDDR |= 0x10;
// USB_CFG_IOPORT |= 0x10;
        IN R16, 0x11
        ORI R16, 0x10
        OUT 0x11, R16

        SBI 0x12, 0x04


То есть, непосредственное обращение к регистру использует SBI, а обращение к указанной конструкции - последовательность команд, не считая определение константным выражением.

Перепробовал несколько идей - не помогло. Изменить определение самого порта с PORTx на просто x с последующей конкатенацией префиксов с именем порта не подходит, так как автор ориентируется в первую очередь на GCC и едва ли согласится радикально менять код, конфигурируемый пользователем.

Для себя-то я могу выйти из положения. Но работая совместно с Кристианом над официальным портом для IAR, хотелось предложить что-то более-менее портабельное без ухода от выбранного им способа определения портов.

Нет у кого идей? Подходит вариант с условной компиляцией (то есть, для именно IAR можно использовать тут __io и тому подобные специфические конструкции). Важно лишь, чтобы раскрывались они в конечном итоге в SBI, а не чтение-модификацию-запись покомандно.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Sam_
сообщение Oct 24 2006, 08:29
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031



Мне тоже пришлось столкнутся с похожей проблемой и вот что я выяснил.

IAR не поддерживает указатели в __io области и по идее должен ругаться на такие финты... Однако этого не происходит.

В документации также сказано что
Цитата
An assignment to a bitfield always generates a write access, in
some cases also a read access. If only one bit is updated—set
or cleared—the sci/cbi instructions are executed.

Но это относится только к
Цитата
__io declared variables located in 0x–0x1F

указатели не являются located variable с точки зрения компилятора поэтому до уровня sci/cbi они и не оптимизируются!

Т.к. для операции разыменования указателя спецификаторы памяти в том числе и __io неприменимы, то данная задача в случае с IAR решения не имеет.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 19:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.0138 секунд с 7
ELECTRONIX ©2004-2016