|
C++ и макросы имени Аскольда Волкова., Хочу скрестить:) |
|
|
|
Jul 29 2009, 08:41
|

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

|
Тема не совсем про scmRTOS, но тут много спецов по плюсам  Сделал такую штуку: Код 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; } ... }; Так вроде поменьше писанины, но тоже корявенько. Теперь внимание, вопрос Есть ли какая-нибудь возможность получить вот такое: Код 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, но это для меня приемлемо.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
 |
Ответов
|
Jul 29 2009, 14:29
|

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

|
Цитата(Сергей Борщ @ Jul 29 2009, 18:35)  Это я к тому, что тернарный оператор короче if в записи. А, понял. Но при пяти портах уже и то и то выглядит громоздко. Цитата(sergeeff @ Jul 29 2009, 19:16)  А в чем навар в объявлении Ну я урезАл пример, и перестарался  Но даже в этом, минимальном примере, вариант с шаблонами будет компилироваться при наличии только одного UART, а вариант с прямым прописыванием - нет. А если применить подход Сергея из поста номер 4, то можно обойтись всего одной реализацией на все UART-ы. Но тут опять же, при возрастании числа UART-ов изящность решения снижается.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 30 2009, 04:57
|

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

|
Цитата(sergeeff @ Jul 30 2009, 03:45)  Что-то вы любезный какими-то загадками все время говорите. Вам надо какое-то псевдоизящество, или эффективная работа с периферией?
Почему не будет компилироваться вариант с прямым прописыванием? С чего-бы это? Если вам что-то непонятно, просто перечитайте. Снова не поймёте - переспросите. К чему этот надрыв?  Я же написал: " вариант с шаблонами будет компилироваться при наличии только одного 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.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 30 2009, 07:02
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(AHTOXA @ Jul 30 2009, 07:57)  Если вам что-то непонятно, просто перечитайте. Снова не поймёте - переспросите. К чему этот надрыв?  Я же написал: " вариант с шаблонами будет компилироваться при наличии только одного UART, а вариант с прямым прописыванием - нет". Вы это отцитировали. Значит, прочитали? И не поняли? Хорошо, я переформулирую: "при наличии только одного UART" = "при отсутствии второго UART". В системе. Так яснее? Нет? Надрыва никакого нет. Просто вы приводите в качестве примеров куски кода, в которых отсутствуют отдельные фрагменты и мы должны догадываться, что вы имели ввиду. По поводу "при наличии только одного UART" = "при отсутствии второго UART" - это тоже пример того, что вы хотите нам сказать и что за этим вы сами подразумеваете. Четче надо свои мысли излагать.
|
|
|
|
|
Jul 30 2009, 07:55
|

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

|
Цитата(sergeeff @ Jul 30 2009, 13:02)  Надрыва никакого нет. Просто вы приводите в качестве примеров куски кода, в которых отсутствуют отдельные фрагменты и мы должны догадываться, что вы имели ввиду. Ой да ладно. Тот мой пост (с кусками кода) был адресован Сергею Борщу, и я уверен, что он там всё понял. Для иллюстрации моей мысли кода там достаточно. Если вы не догадались - сочувствую. Цитата(sergeeff @ Jul 30 2009, 13:02)  По поводу "при наличии только одного UART" = "при отсутствии второго UART" - это тоже пример того, что вы хотите нам сказать и что за этим вы сами подразумеваете. Четче надо свои мысли излагать. Хм. Приведён код для двух UART. Разве в этом случае фраза "наличие только одного UART" не тождественна фразе "отсутствие второго UART"? Так что верну вам упрёк - внимательнее (вдумчивее) надо читать.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|