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

 
 
> Работа с ногами 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

Сообщений в этой теме
- 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
|- - AHTOXA   Цитата(Waso @ Nov 6 2009, 23:07) Сначала ...   Nov 6 2009, 20:02
|- - 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 Текстовая версия Сейчас: 23rd July 2025 - 18:54
Рейтинг@Mail.ru


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