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

 
 
> С++, обработчик прерывания как статическая ф-я класса.
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
Ответов
AHTOXA
сообщение Aug 3 2009, 15:27
Сообщение #2


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

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



Цитата(ReAl @ Aug 3 2009, 20:47) *
А что толку? Всё равно ничего не получится. Там разговор шёл про патч - атрибуту signal дать как аргумент номер прерывания и позволить произвольные имена, но, насколько я понял, до "официальных" версий это так и не дошло.

Да уж. Который раз убеждаюсь, что avr-gcc выделяется на фоне остальных gcc некоей особой "особостью" smile.gif

Цитата(ReAl @ Aug 3 2009, 20:47) *
Так что
приходится так, как уже писалось - с "друзьями" (OS_INTERRUPT из avr-gcc порта scmRTOS)


То есть, OS_INTERRUPT из avr-gcc позволяет если не дать обработчику прерывания своё имя, то хотя бы получить хоть какое-то его имя, чтобы можно его было объявить его friend?
Потому что я не вижу других отличий от
Код
SIGNAL(SIG_UART_RECV)
{
     OS::TISRW_SS ISRW;
     Usart1.RXHandler();
}


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


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(AHTOXA @ Aug 3 2009, 18:27) *
То есть, OS_INTERRUPT из avr-gcc
Из avr-gcc - шного порта scmRTOS. Но это не существенно.
Цитата(AHTOXA @ Aug 3 2009, 18:27) *
позволяет если не дать обработчику прерывания своё имя, то хотя бы получить хоть какое-то его имя, чтобы можно его было объявить его friend?
Потому что я не вижу других отличий от
Код
SIGNAL(SIG_UART_RECV)
{
     OS::TISRW_SS ISRW;
     Usart1.RXHandler();
}
тот #define OS_INTERRUPT просто повторяет все те аттрибуты, которые даёт макрос SIGNAL() (и макрос ISR() по умолчанию), только в форме, которую можно дать префиксом к имени. Имя-то всё равно фиксировано и после подстановки этого SIG_UART_RECV будет превращено в какое-то __vector_XX
Отличия действительно чисто косметические, так как можно вообще так:
Код
// foo.h
#include <avr/io.h>
#include <avr/interrupt.h>

SIGNAL(INT0_vect);
// примитивная наколка - после разворачивания SIGNAL это будет эквивалентно
//   extern "C" void INT0_vect(void) __attribute__ ((signal, __INTR_ATTRS));   void INT0_vect(void);
// второе объявление функции просто ничего не меняет

class foo_t
{
    friend void INT0_vect();
public:
    uint8_t get() { return tick; }
private:
    uint8_t tick;
    inline void isr_handler() { ++tick; }
};

Код
// foo.cpp
#include "foo.h"
foo_t foo;

// а тут наконец-то определяем
SIGNAL(INT0_vect)
{
    foo.isr_handler();
}


Но мне такой вариант не очень понравился. Вопрос вкусовой.


--------------------
Ну, я пошёл… Если что – звоните…
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
- - n_bogoyavlensky   Пытаюсь сделать следующим образом, но выдаются соо...   Jul 31 2009, 13:00
|- - AHTOXA   Скорее всего нет слова #include <scmRTOS.h> ...   Jul 31 2009, 16:59
|- - n_bogoyavlensky   Цитата(AHTOXA @ Jul 31 2009, 20:59) Скоре...   Aug 3 2009, 05:41
|- - AHTOXA   Цитата(n_bogoyavlensky @ Aug 3 2009, 11:4...   Aug 3 2009, 06:36
|- - n_bogoyavlensky   Цитата(AHTOXA @ Aug 3 2009, 10:36) А .h в...   Aug 3 2009, 06:57
|- - AHTOXA   Цитата(n_bogoyavlensky @ Aug 3 2009, 12:5...   Aug 3 2009, 07:16
|- - n_bogoyavlensky   Цитата(AHTOXA @ Aug 3 2009, 11:16) Он про...   Aug 3 2009, 07:19
|- - 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
|- - Сергей Борщ   Цитата(n_bogoyavlensky @ Aug 3 2009, 10:1...   Aug 3 2009, 08:41
|- - AHTOXA   Цитата(Сергей Борщ @ Aug 3 2009, 14:41) i...   Aug 3 2009, 09:08
|- - Сергей Борщ   Цитата(AHTOXA @ Aug 3 2009, 12:08) А я чт...   Aug 3 2009, 09:15
- - 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 - 21:15
Рейтинг@Mail.ru


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