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

 
 
> шаблон и регистр IO AVR
megajohn
сообщение Jun 22 2012, 08:13
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Как правильно в шаблоне определить и использовать регистр (к примеру UDR0 ) ?
кроме как передавать типы и значения в шаблоны не приходилось и как только не химичил c __io (аля volatile) ничего путного не выходило


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
neiver
сообщение Jun 22 2012, 10:16
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Я обычно использую такую класс-обёртку:
Код
#define IO_REG_WRAPPER(REG_NAME, CLASS_NAME, DATA_TYPE) \
    struct CLASS_NAME\
    {\
        typedef DATA_TYPE DataT;\
        static DataT Get(){return REG_NAME;}\
        static void Set(DataT value){REG_NAME = value;}\
        static void Or(DataT value){REG_NAME |= value;}\
        static void And(DataT value){REG_NAME &= value;}\
        static void Xor(DataT value){REG_NAME ^= value;}\
        static void AndOr(DataT andMask, DataT orMask){REG_NAME = (REG_NAME & andMask) | orMask;}\
        template<int Bit>\
        static bool BitIsSet(){return REG_NAME & (1 << Bit);}\
        template<int Bit>\
        static bool BitIsClear(){return !(REG_NAME & (1 << Bit));}\
    }

Использовать его так:
Код
IO_REG_WRAPPER(UDR0, Udr0, uint8_t);

template<class Udr>
class Usart
{
....
};
...
Usart<Udr0> usart;

Работает со всеми компиляторами независимо от того, как именно объявлен регистр (как дефайт, или еще что).
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 4th August 2025 - 03:25
Рейтинг@Mail.ru


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