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

 
 
> С++, обработчик прерывания как статическая ф-я класса.
AHTOXA
сообщение Dec 4 2008, 09:35
Сообщение #1


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

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



Пытаюсь запихать. Запихал:
Код
class    TUart1 : public TCustomUart
{
    public:
        TUart1(uint32_t baudrate) {hw_init(baudrate);}
    protected:
        ...
        virtual void hw_init(uint32_t baudrate);
        virtual void write_tx_reg(char ch) { TXBUF0 = ch; }
        static interrupt(UART0RX_VECTOR) usart0_rx(void);
        static interrupt(UART0TX_VECTOR) usart0_tx(void);
};

...

interrupt(UART0TX_VECTOR) TUart1::usart0_tx(void)
{
    OS::TISRW ISR;
    char ch;
    if (Uart1.TxChannel.get_count())
    {
        Uart1.TxChannel.pop(ch);
        TXBUF0 = ch;
    }
    else
    {
        Uart1.tx_active = false;
    }
}


Делаю это для того, чтобы в прерывании обращаться к private-членам класса. Вроде всё получается. Единственное неудобство состоит в том, что пока я не напишу где-нибудь
Код
void TUart1::hw_init(uint32_t baudrate)
{
    typedef void (* Handler)(void);
    volatile Handler ptr;
    ...
    ptr = &usart0_rx;
    ptr = &usart0_tx;
}

, обработчики прерываний не линкуются. Может есть какой-то более цивильный способ?

Ну и вообще, хотелось бы не статическую функцию, а просто функцию классаsmile.gif

ЗЫ. msp-gcc.


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


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

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Пытаюсь сделать следующим образом, но выдаются сообщения об ошибках.

h-файл:
Код
class TUSART_Coding : public TUSART
{
    private:
        static OS_INTERRUPT void TXHandler(void); // 39 строка
        static OS_INTERRUPT void RXHandler(void); // 40 строка
...
};


cpp-файл:
Код
OS_INTERRUPT interrupt(USART_RX_vect) TUSART_Coding::RXHandler(void)
{
    OS::TISRW_SS ISRW;
    Read_Next_Byte();
};

OS_INTERRUPT interrupt(USART_TX_vect) TUSART_Coding::TXHandler(void)
{
    OS::TISRW_SS ISRW;
    Write_Next_Byte();
};



39 error: expected unqualified-id before string constant
40 error: expected unqualified-id before string constant


В чём может быть дело?

Сообщение отредактировал n_bogoyavlensky - Jul 31 2009, 13:10


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 31 2009, 16:59
Сообщение #3


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

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



Скорее всего нет слова #include <scmRTOS.h> до объявления.
Да и не нужен этот атрибут (OS_INTERRUPT) в объявлении функции (в h-файле). Вот в определении (в cpp) - да, нужен.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
koluna
сообщение Aug 3 2009, 05:41
Сообщение #4


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

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Цитата(AHTOXA @ Jul 31 2009, 20:59) *
Скорее всего нет слова #include <scmRTOS.h> до объявления.


В .h было.
В .cpp не было.

Цитата
Да и не нужен этот атрибут (OS_INTERRUPT) в объявлении функции (в h-файле).


Убрал. Эти ошибки исчезли, но появились новые...
А что это за атрибут? Нашёл в исходниках, но пока не понял для чего он sad.gif

Новые ошибки на код:

Код
OS_INTERRUPT interrupt(USART_RX_vect) TUSART_Coding::RXHandler(void) // Строка №284
{
    OS::TISRW_SS ISRW;
    Read_Next_Byte();
};

OS_INTERRUPT interrupt(USART_TX_vect) TUSART_Coding::TXHandler(void) // Строка №297
{
    OS::TISRW_SS ISRW;
    Write_Next_Byte();
};



TUSART_Coding.cpp|284|error: expected constructor, destructor, or type conversion before '(' token
TUSART_Coding.cpp|297|error: expected constructor, destructor, or type conversion before '(' token


Что это?

Кстати, вот здесь вот OS_INTERRUPT есть в описании:
http://electronix.ru/forum/index.php?showt...st&p=511104

Сообщение отредактировал n_bogoyavlensky - Aug 3 2009, 05:35


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 3 2009, 06:36
Сообщение #5


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

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



Цитата(n_bogoyavlensky @ Aug 3 2009, 11:41) *
В .h было.
В .cpp не было.


А .h включен в .cpp? smile.gif

Цитата
Убрал. Эти ошибки исчезли, но появились новые...
А что это за атрибут? Нашёл в исходниках, но пока не понял для чего он sad.gif


Он содержит дополнительные атрибуты для функции-обработчика прерывания. Например, __arm для АРМов. У вас какой проц? Какой компилятор? И как выглядит объявление OS_INTERRUPT?

Цитата
Что это?

такое чувство, что не хватает слова void:
OS_INTERRUPT interrupt(USART_TX_vect) void TUSART_Coding::TXHandler(void) // Строка №297


Цитата
Кстати, вот здесь вот OS_INTERRUPT есть в описании:
http://electronix.ru/forum/index.php?showt...st&p=511104


Оно не мешает, просто там в нём нет нужды (имхо).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
koluna
сообщение Aug 3 2009, 06:57
Сообщение #6


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

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Цитата(AHTOXA @ Aug 3 2009, 10:36) *
А .h включен в .cpp? smile.gif


Конечно включен smile.gif

Цитата
Он содержит дополнительные атрибуты для функции-обработчика прерывания. Например, __arm для АРМов. У вас какой проц? Какой компилятор? И как выглядит объявление OS_INTERRUPT?


По поводу дополнительных атрибутов понятно уже. Хотелось бы узнать что за атрибуты и для чего конкретно smile.gif
Процессор ATmega168.
Компилятор WinAVR20071221.

OS_Target.h:
Код
# define    OS_INTERRUPT    extern "C" __attribute__((__signal__,__INTR_ATTRS))


\avr\interrupt.h:
Код
#  define __INTR_ATTRS used, externally_visible


Цитата
такое чувство, что не хватает слова void:
OS_INTERRUPT interrupt(USART_TX_vect) void TUSART_Coding::TXHandler(void) // Строка №297


С ним тоже самое smile.gif

Цитата
Оно не мешает, просто там в нём нет нужды (имхо).


Получается, что мешает, так как с ним присутствуют ошибки первого типа...


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 3 2009, 07:16
Сообщение #7


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

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



Цитата(n_bogoyavlensky @ Aug 3 2009, 12:57) *
Процессор ATmega168.
Компилятор WinAVR20071221.


Он просто не знает слова interrupt smile.gif)))


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
koluna
сообщение Aug 3 2009, 07:19
Сообщение #8


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

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Цитата(AHTOXA @ Aug 3 2009, 11:16) *
Он просто не знает слова interrupt smile.gif)))


Тааак... и как нам быть? smile.gif


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 3 2009, 08:41
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(n_bogoyavlensky @ Aug 3 2009, 10:19) *
Тааак... и как нам быть? smile.gif
Он знает слово interrupt. Точнее interrupt - это макрос, и содержимое его вы можете легко найти внутри avr/interrupt.h. И то, во что этот макрос разворачивается, делает его несовместимыым с понятием "статическая функция класса". Короче:
Код
.h:
ISR(USART_RXC_vect);
ISR(USART_UDRE_vect);

class uart_t
{
public:
    uart_t() {};
    ...
private:
    friend void USART_RXC_vect();
    friend void USART_UDRE_vect();
    void RXC_Handler();
    void UDRE_Handler();
    ...
}
.cpp:
inline void uart_t::RXC_Handler()
{
    ...
}

OS_INTERRUPT void USART_RXC_vect()
{
    OS::TISRW isr;
    UART.RXC_Handler();
}


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 3 2009, 09:08
Сообщение #10


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

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



Цитата(Сергей Борщ @ Aug 3 2009, 14:41) *
interrupt - это макрос, и содержимое его вы можете легко найти внутри avr/interrupt.h.


А я что-то не нашёл... Есть только
Код
define ISR_NOBLOCK    __attribute__((interrupt))


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

Сообщений в этой теме
- AHTOXA   С++, обработчик прерывания как статическая ф-я класса.   Dec 4 2008, 09:35
- - Legotron   Цитата(AHTOXA @ Dec 4 2008, 12:35) ptr = ...   Dec 4 2008, 09:45
- - xelax   Цитата(AHTOXA @ Dec 4 2008, 12:35) Ну и в...   Dec 4 2008, 09:56
- - AHTOXA   Цитата(Legotron @ Dec 4 2008, 14:45) А ра...   Dec 4 2008, 10:09
- - Сергей Борщ   Цитата(AHTOXA @ Dec 4 2008, 11:35) Единст...   Dec 4 2008, 10:11
|- - AHTOXA   Цитата(Сергей Борщ @ Dec 4 2008, 15:11) Ф...   Dec 4 2008, 10:29
|- - Сергей Борщ   Цитата(AHTOXA @ Dec 4 2008, 12:29) Не то ...   Dec 4 2008, 12:09
|- - AHTOXA   Цитата(Сергей Борщ @ Dec 4 2008, 17:09) В...   Dec 4 2008, 12:19
- - dxp   Цитата(AHTOXA @ Dec 4 2008, 15:35) Ну и в...   Dec 4 2008, 12:49
|- - AHTOXA   Цитата(dxp @ Dec 4 2008, 17:49) Этого нел...   Dec 4 2008, 14:22
- - AHTOXA   Короче, разобрался я, в чём причина. Всё дело в ша...   Dec 4 2008, 15:35
|- - vik0   Цитата(AHTOXA @ Dec 4 2008, 17:35) Видимо...   Dec 4 2008, 19:25
|- - AHTOXA   Цитата(vik0 @ Dec 5 2008, 00:25) Можете п...   Dec 4 2008, 21:20
|- - Vitaliy_ARM   Цитата(AHTOXA @ Dec 5 2008, 00:20) То, чт...   Dec 6 2008, 12:00
|- - Сергей Борщ   Цитата(Vitaliy_ARM @ Dec 6 2008, 14:00) А...   Dec 6 2008, 12:44
|- - AHTOXA   Цитата(n_bogoyavlensky @ Aug 3 2009, 13:1...   Aug 3 2009, 07:27
||- - ReAl   Цитата(AHTOXA @ Aug 3 2009, 10:27) Я не з...   Aug 3 2009, 14:47
|- - Сергей Борщ   Цитата(AHTOXA @ Aug 3 2009, 12:08) А я чт...   Aug 3 2009, 09:15
- - AHTOXA   Цитата(ReAl @ Aug 3 2009, 20:47) А что то...   Aug 3 2009, 15:27
- - ReAl   Цитата(AHTOXA @ Aug 3 2009, 18:27) То ест...   Aug 3 2009, 18:06
- - Damon   Доброго времени суток! Позвольте вклиниться в ...   May 27 2010, 07:26
- - klen   мдя... С++ пошел в микроконтроллеры. кчему бы это ...   May 27 2010, 08:27
|- - MrYuran   Цитата(klen @ May 27 2010, 12:27) мдя... ...   May 27 2010, 08:34
||- - klen   Цитата(MrYuran @ May 27 2010, 12:34) Да у...   May 27 2010, 08:38
|- - Damon   Цитата(klen @ May 27 2010, 12:27) если не...   May 27 2010, 09:01
- - Сергей Борщ   Цитата(Damon @ May 27 2010, 10:26) Код st...   May 27 2010, 10:26
- - Damon   Цитата(Сергей Борщ @ May 27 2010, 14:26) ...   May 27 2010, 11:21


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 18:47
Рейтинг@Mail.ru


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