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

 
 
> Порт как параметр функции С/С++ IAR
Errorkpi
сообщение Sep 6 2012, 10:17
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Непомнящий Евген...
сообщение Sep 6 2012, 12:25
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Странно, у меня работает. IAR 5.12c. Atmega 128, 1280, 2560
Go to the top of the page
 
+Quote Post
Errorkpi
сообщение Sep 6 2012, 12:33
Сообщение #3


Участник
*

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



Цитата(Непомнящий Евгений @ Sep 6 2012, 15:25) *
Странно, у меня работает. IAR 5.12c. Atmega 128, 1280, 2560


5.50.0 - не работает, причем он одинаково относится к любым спецификаторам места хранения (__io, __flash, __eeprom)

Попытка обмана, через ассемблер не прошла sm.gif

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
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 6 2012, 12:59
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Errorkpi @ Sep 6 2012, 15:33) *
asm("OUT r16, r17"); // первый параметр функции типа char [url="http://electronix.ru/redirect.php?http://netstorage.iar.com/SuppDB/Public/

Новую команду ввели?
У АВР нет такой команды.
Go to the top of the page
 
+Quote Post
Errorkpi
сообщение Sep 6 2012, 13:04
Сообщение #5


Участник
*

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



Цитата(_Артём_ @ Sep 6 2012, 15:59) *
Новую команду ввели?
У АВР нет такой команды.


Да все я понимаю, думал может оптимизатор или линкер додумается подменить параметр PORTB на $18 в асм операторе. Не вышло, но надежда умирает последней.

Все-таки странно, почему нет такой возможности на уровне спецификаторов, или директив препроцессора, все-таки часто используемая вещь (передача регистра I/O в функцию), судя по комментариям.

Сообщение отредактировал Errorkpi - Sep 6 2012, 13:07
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 6 2012, 13:24
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Errorkpi
сообщение Sep 6 2012, 14:06
Сообщение #7


Участник
*

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



Цитата(Сергей Борщ @ Sep 6 2012, 16:24) *
Ах вот оно что! Вам нужна встраиваемая функция...

Если на препроцессоре - ищите здесь на форуме "макросы имени Аскольда Волкова".

inline как-бы не помогает...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


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

 


RSS Текстовая версия Сейчас: 26th June 2025 - 06:20
Рейтинг@Mail.ru


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