Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Адреса портов в io.h и включаемых через него файлах смещены таким образом, что подходят для адресации через указатель (+)

Отправлено ReAl 05 сентября 2007 г. 15:57
В ответ на: Заработало. Здорово. Большое спасибо. Но все равно не понятно что такое (SFR_IOADDR()) и почему именно так? отправлено <font color=gray>человечек</font> 05 сентября 2007 г. 15:11

т.е. указаны те адреса, которые в документации в register summary указаны в скобках. Дальше С-компилятор при оптимизации просто вылавливает, что адреса находятся в зоне "короткой адресации" командами обращения к портам и подставляет эти команды, вычитая смещение "назад".
Макрос _SFR_IO_ADDR(), определённый в sfr_defs.h, делает то же самое - вычитает это смещение.
При программировании на ассемблере в начале .S-файла перед включением avr/io.h можно задать
#define __SFR_OFFSET 0
и использовать имена PORTB и т.п. без _SFR_IO_ADDR()

Кстати, когда это смещение туда-назад ввели (где-то при переходе от 2.xx к 3.0, насколько я помню), в avr-gcc появилась возможность писать
PORTB = 5;
PORTB |= 1;
а не макросами inb/outb/sbi/cbi пользоваться.



Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 45:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru