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

 
 
> C++ и макросы имени Аскольда Волкова., Хочу скрестить:)
AHTOXA
сообщение Jul 29 2009, 08:41
Сообщение #1


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Тема не совсем про scmRTOS, но тут много спецов по плюсамsmile.gif

Сделал такую штуку:
Код
class BasePin
{
    public:
        virtual void On() = 0;
        virtual void Off() = 0;
        virtual void Cpl() = 0;
...
};

Это базовый абстрактный класс. Нужен, чтоб можно было передавать ссылку на любую ножку куда угодно. Например, класс TDAC(spi& spiRef, BasePin& CS), конструктору передаётся ссылка на spi и ссылка на ножку чипселекта.

Дальше начинаю городить шаблоны:
Код
template<int port, int pin, char activestate = 'H'> class Pin;

template<int pin>
class Pin<1, pin>: public BasePin
{
    public:
        virtual void On() { P1OUT |= 1<<pin; }\
...
};

template<int pin>
class Pin<1, pin, 'L'>: public BasePin
{
    public:
        virtual void On(){ P1OUT &= ~(1<<pin); }
...
};


И так 5 раз (для портов 1-5). Как-то коряво...

Пробовал так:
Код
template<int port, int pin, char activestate = 'H'>
class Pin: public BasePin
{
    public:
        virtual void On() {
            if (port == 1) P1OUT |= 1<<pin;
            if (port == 2) P2OUT |= 1<<pin;
            if (port == 3) P3OUT |= 1<<pin;
            if (port == 4) P4OUT |= 1<<pin;
            if (port == 5) P5OUT |= 1<<pin;
        }
...
};


Так вроде поменьше писанины, но тоже корявенько.

Теперь внимание, вопросsmile.gif
Есть ли какая-нибудь возможность получить вот такое:
Код
template<int port, int pin, char activestate = 'H'>
class Pin: public BasePin
{
    public:
        virtual void On() {P##portOUT |= 1<<pin; }
...
};


То есть, хочу нечто вроде макроподстановки. Вроде где-то что-то встречал подобное, но никак не вспомню, куда копать.


ЗЫ. А работает вроде хорошо. То есть,

Код
Pin<1, 2, 'L'> PIN12;
#define PIN_12 1, 2, L
Pin<2, 3> PIN23;
#define PIN_23 2, 3, H
...
    PIN12.On();
    on(PIN_12);
    PIN23.On();
    on(PIN_23);


компилится в
Код
    1808:    e2 c2 21 00     bic.b    #4,    &0x0021  ;r2 As==10
    180c:    e2 c2 21 00     bic.b    #4,    &0x0021  ;r2 As==10
    1810:    f2 d2 29 00     bis.b    #8,    &0x0029  ;r2 As==11
    1814:    f2 d2 29 00     bis.b    #8,    &0x0029  ;r2 As==11


Накладные расходы - vtable+процедуры на каждую созданную ножку. За это я получаю возможность передавать ссылку на ножку. Я давно этого хотел.

При обращении по ссылке (в TDAC) вызовы уже из vtable, но это для меня приемлемо.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AHTOXA
сообщение Jul 29 2009, 14:29
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Сергей Борщ @ Jul 29 2009, 18:35) *
Это я к тому, что тернарный оператор короче if в записи.


А, понял. Но при пяти портах уже и то и то выглядит громоздко.


Цитата(sergeeff @ Jul 29 2009, 19:16) *
А в чем навар в объявлении


Ну я урезАл пример, и перестаралсяsmile.gif Но даже в этом, минимальном примере, вариант с шаблонами будет компилироваться при наличии только одного UART, а вариант с прямым прописыванием - нет.

А если применить подход Сергея из поста номер 4, то можно обойтись всего одной реализацией на все UART-ы. Но тут опять же, при возрастании числа UART-ов изящность решения снижается.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 29 2009, 21:45
Сообщение #3


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(AHTOXA @ Jul 29 2009, 17:29) *
Ну я урезАл пример, и перестаралсяsmile.gif Но даже в этом, минимальном примере, вариант с шаблонами будет компилироваться при наличии только одного UART, а вариант с прямым прописыванием - нет.


Что-то вы любезный какими-то загадками все время говорите. Вам надо какое-то псевдоизящество, или эффективная работа с периферией?

Почему не будет компилироваться вариант с прямым прописыванием? С чего-бы это?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 30 2009, 04:57
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sergeeff @ Jul 30 2009, 03:45) *
Что-то вы любезный какими-то загадками все время говорите. Вам надо какое-то псевдоизящество, или эффективная работа с периферией?

Почему не будет компилироваться вариант с прямым прописыванием? С чего-бы это?


Если вам что-то непонятно, просто перечитайте. Снова не поймёте - переспросите. К чему этот надрыв? smile.gif

Я же написал: "вариант с шаблонами будет компилироваться при наличии только одного UART, а вариант с прямым прописыванием - нет". Вы это отцитировали. Значит, прочитали? И не поняли? Хорошо, я переформулирую: "при наличии только одного UART" = "при отсутствии второго UART". В системе. Так яснее? Нет? Хорошо, поясню на примере.

Код
class TUart1 : public TBaseUart
{
protected:
     virtual void write_tx_reg(char ch) { TXBUF0 = ch; }
...
};

class TUart2 : public TBaseUart
{
protected:
     virtual void write_tx_reg(char ch) { TXBUF1 = ch; }
};


Если у проца нет второго UART, то на последней строчке компилятор скажет, что не знает, что такое TXBUF1.

В случае с шаблонами - не скажет, пока вы не попытаетесь создать экземпляр TUart<UART2>.

Цитата(MrYuran @ Jul 30 2009, 10:48) *
5 ифов подряд - по-моему, коряво...
Причём, это ведь для каждой операции?


Да не, это всё выкидывается компилятором, ибо сравнение константы с константой. Остаётся один bis.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 30 2009, 07:02
Сообщение #5


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(AHTOXA @ Jul 30 2009, 07:57) *
Если вам что-то непонятно, просто перечитайте. Снова не поймёте - переспросите. К чему этот надрыв? smile.gif

Я же написал: "вариант с шаблонами будет компилироваться при наличии только одного UART, а вариант с прямым прописыванием - нет". Вы это отцитировали. Значит, прочитали? И не поняли? Хорошо, я переформулирую: "при наличии только одного UART" = "при отсутствии второго UART". В системе. Так яснее? Нет?


Надрыва никакого нет. Просто вы приводите в качестве примеров куски кода, в которых отсутствуют отдельные фрагменты и мы должны догадываться, что вы имели ввиду.

По поводу "при наличии только одного UART" = "при отсутствии второго UART" - это тоже пример того, что вы хотите нам сказать и что за этим вы сами подразумеваете. Четче надо свои мысли излагать.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 30 2009, 07:55
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sergeeff @ Jul 30 2009, 13:02) *
Надрыва никакого нет. Просто вы приводите в качестве примеров куски кода, в которых отсутствуют отдельные фрагменты и мы должны догадываться, что вы имели ввиду.


Ой да ладно. Тот мой пост (с кусками кода) был адресован Сергею Борщу, и я уверен, что он там всё понял. Для иллюстрации моей мысли кода там достаточно. Если вы не догадались - сочувствую.

Цитата(sergeeff @ Jul 30 2009, 13:02) *
По поводу "при наличии только одного UART" = "при отсутствии второго UART" - это тоже пример того, что вы хотите нам сказать и что за этим вы сами подразумеваете. Четче надо свои мысли излагать.


Хм. Приведён код для двух UART. Разве в этом случае фраза "наличие только одного UART" не тождественна фразе "отсутствие второго UART"? Так что верну вам упрёк - внимательнее (вдумчивее) надо читать.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- AHTOXA   C++ и макросы имени Аскольда Волкова.   Jul 29 2009, 08:41
- - sergeeff   А зачем нужен параметр шаблона activestate, если о...   Jul 29 2009, 10:17
|- - AHTOXA   Цитата(sergeeff @ Jul 29 2009, 16:17) А з...   Jul 29 2009, 10:30
- - Сергей Борщ   Цитата(AHTOXA @ Jul 29 2009, 11:41) Пробо...   Jul 29 2009, 10:50
|- - AHTOXA   Цитата(Сергей Борщ @ Jul 29 2009, 16:50) ...   Jul 29 2009, 11:32
||- - Сергей Борщ   Цитата(AHTOXA @ Jul 29 2009, 14:32) Да, э...   Jul 29 2009, 12:35
|- - AHTOXA   Подниму тему. У меня сейчас мысль не про макросы, ...   Aug 19 2009, 05:09
|- - Сергей Борщ   Цитата(AHTOXA @ Aug 19 2009, 08:09) Тогда...   Aug 19 2009, 09:07
|- - AHTOXA   Цитата(Сергей Борщ @ Aug 19 2009, 15:07) ...   Aug 28 2009, 16:54
- - sergeeff   А в чем навар в объявлении Кодtemplate<> ...   Jul 29 2009, 13:16
|- - sergeeff   Цитата(AHTOXA @ Jul 30 2009, 10:55) Так ч...   Jul 30 2009, 21:27
|- - AHTOXA   Цитата(sergeeff @ Jul 31 2009, 03:27) 1. ...   Jul 31 2009, 05:10
- - MrYuran   Кодvirtual void On() { if (port == ...   Jul 30 2009, 04:48
- - sergeeff   Вы внимательно пересмотрите свой топик. Про эту вс...   Jul 31 2009, 06:48
|- - AHTOXA   Цитата(sergeeff @ Jul 31 2009, 12:48) Вы ...   Jul 31 2009, 08:06
- - AHTOXA   Короче, вот что получилось в итоге: От общего ви...   Sep 5 2009, 21:44
- - AHTOXA   Вот для msp430:   Sep 8 2009, 04:19
- - Waso   На днях опять пришлось иметь дело с проектом, где ...   Sep 3 2010, 16:10


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

 


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


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