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

 
 
> Работа с ногами AVR на С++, Проблема переноса с IAR на WinAVR
Waso
сообщение Nov 4 2009, 17:42
Сообщение #1


Местный
***

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



Всем доброго времени суток!

Понадобилось перенести проект с IAR (EWAVR 530) на WinAVR (20090313) для юридической чистоты...
Вылезла такая бяка: Иар успешно работает с такой конструкцией:
Код
template <unsigned char volatile * port, const char bit>
class mypin
{
public:
        inline mypin() {*(port-1)|=(1<<bit);} // смещение -1 - регистр DDR - настраиваем на выход.
        static inline void set()    {*port|=(1<<bit);}
};
int main()
{
    mypin<&PORTA,4> mypinname; // тут мы обьявляем место подключения и инициализируем одновременно
//...
     mypinname.set();
//...
}

А WinAVR глючит на конструкции &PORTA в объявлении класса и заявляет что не хватает параметров:
Код
    - wrong number of template arguments (1, should be 2) provided for 'template<volatile uint8_t* port, char bit> class mypin'

хотя в другом месте адрес порта успешно изымается:
Код
volatile uint8_t* portC = &PORTC;
*portC &= ~(1<<7);
Это глюк компилятора? Как это можно обойти? Подскажите пожалуйста!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Waso
сообщение Nov 6 2009, 18:07
Сообщение #2


Местный
***

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



AHTOXA, посмотрел я на ваши труды и попробовал написать подобное для АВР. Сначала было так:
Код
template<GPIO_mode_t mode, char port, int bit, char activestate>
class Pin{
    inline volatile uint8_t & PORTx()
            {
        #if defined (PORTA)
                                 if (port == 'A') return PORTA;
         #endif
        #if defined (PORTB)
                                 if (port == 'B') return PORTB;
        #endif
      //..................такая конструкция для буков С..F и все вместе для DDRх и PINх}
    inline void On()
    {
        if ( mode==BIDIR || mode==OUTPUT ) {activestate == 'L' ? PORTx()&=~mask : PORTx()|=mask;}
        if ( mode==OUTPUT_OK ) {activestate == 'L' ? DDRx()|=mask : DDRx()&=~mask;}
    }
// и тп
}
Потом пытался уменьшить количество писанины в части ссылок на регистры:
Код
template<char port> class Base_Pin;

template<>  // такой шаблон для всех буков - можно сделать макрос
    class Base_Pin<'A'>
    {
    public:
        inline volatile uint8_t & PORTx(){return PORTA;}
                        inline volatile uint8_t & DDRx(){return DDRA;}
                        inline volatile uint8_t & PINx(){return PINA;}
    };

template<GPIO_mode_t mode, char port, int bit, char activestate>
class Pin2 : public Base_Pin<port>
{    inline void On(){Base_Pin<port>::PORTx()|=(1<<bit);} };
И если дальше "упрощать" создав макрос для объявления базовых классов всех портов, то приходим к необходимости отказаться от символьных констант и воспользоваться enum-ом. В итоге получаем код Alex312. Но я оставил себе первый вариант. Он хоть и громоздкий, но зато легко читаемый\понимаемый.

И да кстати. Я так и не понял в чем вкусность переопределения операторов в примере Антона.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 6 2009, 20:02
Сообщение #3


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

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



Цитата(Waso @ Nov 6 2009, 23:07) *
Сначала было так:
Код
template<GPIO_mode_t mode, char port, int bit, char activestate>
...


Ну и нормальноsmile.gif Только
#if defined (PORTA) - лишнее, ибо не будет вызываться, пока вы не определите Pin<'A'...>. В этом прелесть шаблоновsmile.gif

Цитата
Потом пытался уменьшить количество писанины в части ссылок на регистры:
Код
template<char port> class Base_Pin;
     ...
template<GPIO_mode_t mode, char port, int bit, char activestate>
   class Pin2 : public Base_Pin<port>
   ...

От наследования тут мало толку, всё равно приходится указывать имя базового класса.
Здесь удобнее определить включаемый класс, типа
Код
// объявление шаблона регистров порта:
template<char port>struct port_regs_t;

// специализация для каждого порта:
template <> struct port_regs_t<'A'>
{
     inline volatile uint8_t & PORTx(){return PORTA;}
     ...
};
...
// и наконец, собственно шаблон ноги:
template<GPIO_mode_t mode, char port, int bit, char activestate>
class Pin2
{
private:
     typedef port_regs_t<port> regs_t;
public:
     typename regs_t::PORTx PORTx;
     typename pins_t::DDRx DDRx;
     typename pins_t::PINx PINx;
...
};

В варианте для MSP430 (а именно на него я давал ссылкуsmile.gif ) у меня примерно так и сделано. А вы, похоже, смотрели вариант для stm32?
Цитата
И да кстати. Я так и не понял в чем вкусность переопределения операторов в примере Антона.

Дык, просто что-то не сложилось со ссылками (или просто не догадался). Потому пришлось определять все операции. Если работает со ссылками, то так конечно лучше. Надо будет попробовать...

И, кстати, одно замечание по параметрам. Имхо, включать режим работы ножки (GPIO_mode_t) в перечень параметров шаблона - идеологически неверно. Потому что иногда случается, что режим работы ноги надо переключать на ходу.


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

Сообщений в этой теме
- Waso   Работа с ногами AVR на С++   Nov 4 2009, 17:42
- - Genadi Zawidowski   Попробуйте в шаблоне не делать предположения о том...   Nov 4 2009, 19:23
- - Waso   Кодtemplate <uint8_t volatile & port, cons...   Nov 4 2009, 20:19
- - Genadi Zawidowski   А не надо делать предположения об адресе регистра ...   Nov 4 2009, 21:01
|- - ReAl   Цитата(Genadi Zawidowski @ Nov 4 2009, 23...   Nov 4 2009, 21:20
- - Genadi Zawidowski   Что не так в версии: Кодtemplate <uint8_t vola...   Nov 4 2009, 21:26
|- - ReAl   Цитата(Genadi Zawidowski @ Nov 4 2009, 23...   Nov 4 2009, 22:37
- - Genadi Zawidowski   Посмотрел на результат препроцессирования (-E)... ...   Nov 5 2009, 01:32
- - Waso   Genadi, даже если уйти от смещений и явно указыват...   Nov 5 2009, 05:45
|- - AHTOXA   Цитата(Waso @ Nov 5 2009, 10:45) .. Глян...   Nov 5 2009, 07:23
- - XVR   А не получится описать порты как переменные и зада...   Nov 5 2009, 07:48
|- - ReAl   Цитата(AHTOXA @ Nov 6 2009, 22:02) Потому...   Nov 6 2009, 20:43
|- - AHTOXA   Цитата(ReAl @ Nov 7 2009, 01:43) Зато, по...   Nov 6 2009, 20:47
|- - ReAl   Цитата(AHTOXA @ Nov 6 2009, 22:47) А что ...   Nov 7 2009, 09:37
- - Waso   ЦитатаНу и нормально Только #if defined (PORTA) - ...   Nov 7 2009, 19:19
|- - AHTOXA   Цитата(Waso @ Nov 8 2009, 00:19) У меня W...   Nov 7 2009, 22:17
- - Waso   Продолжу задавать вопросы по плюсам в этой теме. П...   Nov 24 2009, 18:19
- - XVR   Как только функции стали виртуальными у класса Mtx...   Nov 24 2009, 18:44
- - Waso   ЦитатаМожно спросить - нафига наследовать MtxButto...   Nov 25 2009, 06:16
- - Waso   Ладно, чтобы не смотрели на меня косо, открою карт...   Nov 26 2009, 07:19
- - XVR   Цитата(Waso @ Nov 26 2009, 10:19) Одна ви...   Nov 26 2009, 08:09


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

 


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


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