|
Порт как параметр функции С/С++ IAR |
|
|
|
Sep 6 2012, 10:17
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 14-04-09
Пользователь №: 47 659

|
Собственно вопрос по теме сабжа: как передать имя порта (или любой другой регистр) как параметр в функцию/класс С++ ? Пишу программный драйвер интерфейса, создал под это дело класс обертку и хочу конфигурировать интерфейс (назначать ноги МК), чтобы можно было поднять несколько интерфейсов параллельно на разных ногах, создав несколько объектов. Пробовал вот так: Код void foo (unsigned char PORTx) { *(unsigned char*)PORTx=0xFF; }
void main(void) { foo(PORTA); } такой вариант не работает.... и компилятор ругается на строку вызова функции: Код Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement
|
|
|
|
|
 |
Ответов
|
Sep 6 2012, 12:33
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 14-04-09
Пользователь №: 47 659

|
Цитата(Непомнящий Евгений @ Sep 6 2012, 15:25)  Странно, у меня работает. IAR 5.12c. Atmega 128, 1280, 2560 5.50.0 - не работает, причем он одинаково относится к любым спецификаторам места хранения (__io, __flash, __eeprom) Попытка обмана, через ассемблер не прошла  void foo (unsigned char adr) { asm("CLR r17"); asm("OUT r16, r17"); // первый параметр функции типа char хранится в r16 } исходя из того, что я знаю про ассемблер, подменить этот параметр никак не получится.... Прийдется смирится с накладными рассходами. Всетаки интересно на счет спецификатора __io, мне так и не удалось его применить. Даже для глобальной переменной ругается вот так: Error[Ta007]: An __io declared variable must be located.
Сообщение отредактировал Errorkpi - Sep 6 2012, 12:34
|
|
|
|
|
Sep 6 2012, 13:04
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 14-04-09
Пользователь №: 47 659

|
Цитата(_Артём_ @ Sep 6 2012, 15:59)  Новую команду ввели? У АВР нет такой команды. Да все я понимаю, думал может оптимизатор или линкер додумается подменить параметр PORTB на $18 в асм операторе. Не вышло, но надежда умирает последней. Все-таки странно, почему нет такой возможности на уровне спецификаторов, или директив препроцессора, все-таки часто используемая вещь (передача регистра I/O в функцию), судя по комментариям.
Сообщение отредактировал Errorkpi - Sep 6 2012, 13:07
|
|
|
|
|
Sep 6 2012, 13:24
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Errorkpi @ Sep 6 2012, 16:04)  Да все я понимаю, думал может оптимизатор или линкер додумается подменить параметр PORTB на $18 в асм операторе. Не вышло, но надежда умирает последней. Ах вот оно что! Вам нужна встраиваемая функция... QUOTE (Errorkpi @ Sep 6 2012, 16:04)  или директив препроцессора Если на препроцессоре - ищите здесь на форуме "макросы имени Аскольда Волкова".
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 6 2012, 14:06
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 14-04-09
Пользователь №: 47 659

|
Цитата(Сергей Борщ @ Sep 6 2012, 16:24)  Ах вот оно что! Вам нужна встраиваемая функция...
Если на препроцессоре - ищите здесь на форуме "макросы имени Аскольда Волкова". inline как-бы не помогает...
|
|
|
|
Сообщений в этой теме
Errorkpi Порт как параметр функции С/С++ IAR Sep 6 2012, 10:17 Непомнящий Евгений 1. Например в iar - char * __io или char *__ext_io... Sep 6 2012, 10:26 neiver Как обычный указатель.
Кодvoid foo (volatile u... Sep 6 2012, 10:30 Непомнящий Евгений neiver, а разве там все регистры мапятся в общее а... Sep 6 2012, 10:34 _Артём_ Цитата(Непомнящий Евгений @ Sep 6 2012, 13... Sep 6 2012, 10:39 neiver Цитата(Непомнящий Евгений @ Sep 6 2012, 14... Sep 6 2012, 10:47 Errorkpi char * __io или char *__ext_io
В чем разница? Sep 6 2012, 10:37 Непомнящий Евгений разные инструкции доступа, помнится. __ext_io - эт... Sep 6 2012, 10:39 Errorkpi я так понимаю что вы предлагает сделать вот так:
... Sep 6 2012, 10:45 Непомнящий Евгений Цитата(Errorkpi @ Sep 6 2012, 14:45) я та... Sep 6 2012, 12:12  Errorkpi Цитата(Непомнящий Евгений @ Sep 6 2012, 15... Sep 6 2012, 12:22 Errorkpi Кодvoid classname::init(volatile unsig... Sep 6 2012, 10:58 Сергей Борщ QUOTE (Errorkpi @ Sep 6 2012, 13:58) не с... Sep 6 2012, 11:11 neiver Если хочется чтоб через in,out,sbi,cbi работало - ... Sep 6 2012, 11:05 Errorkpi ЦитатаА как вы себе представляете это хотя бы на а... Sep 6 2012, 12:07    demiurg_spb http://www.nongnu.org/avr-libc/user-manual...l#faq... Sep 6 2012, 13:10      Сергей Борщ QUOTE (Errorkpi @ Sep 6 2012, 17:06) inli... Sep 6 2012, 21:27 Errorkpi Цитата(demiurg_spb @ Sep 6 2012, 16:10) h... Sep 6 2012, 13:16 ReAl _Pragma("inline=always") (и, соответстве... Sep 7 2012, 14:10
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|