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

 
 
> С++, обработчик прерывания как статическая ф-я класса.
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
Damon
сообщение May 27 2010, 07:26
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 59
Регистрация: 12-12-05
Пользователь №: 12 125



Доброго времени суток! Позвольте вклиниться в разговор...

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

Так что
приходится так, как уже писалось - с "друзьями" (OS_INTERRUPT из avr-gcc порта scmRTOS) ...


Вчера назрел подобный вопрос, пришлось заняться "разборками". Как выяснилось, вопрос вполне решабельный, и после оперативно-разыскных мероприятий по всему инету есть что сказать. Начну по порядку.

1. C++ Interrupts
Цитата
Using the gcc "asm" keyword simplifies defining interrupt methods in C++
classes. The asm keyword as it applies to function names is described in
5.37 of the gcc manual and is mentioned in the asm cookbook section of the
avr-libc user manual. It specifies the equivalent assembler name for the
target function name and its use allows the user to define his or her own
names for class interrupt methods.


2. Controlling Names Used in Assembler Code
Цитата
You cannot use asm in this way in a function definition; but you can get the same effect by writing a declaration for the function before its definition and putting asm there, like this:

Код
extern func () asm ("FUNC");

func (x, y)
     int x, y;
...


Изначальный макрос у меня "с пол пинка" не завелся, но после некоторого экспериментирования, пришел к такому коду:
Код
// Timer.h
#include <avr/interrupt.h>
#define    OS_INTERRUPT    extern "C" __attribute__((__signal__,__INTR_ATTRS))

class Timer
{
public:
    Timer( ) { }
    ~Timer( ) { }

    void Dispatch( ) { }
    static void IRQHandler( ) asm( "__vector_10" ); // Или, не 10 ( взято "с потолка" ), в любом случае, меняя нумер можно
                                                                                 //  подставить куда угодно
};


Код
// Timer.cpp
#include "Timer.h"

Timer timer;

//---------------------------------------------------------------
OS_INTERRUPT void Timer::IRQHandler(void)
{
    timer.Dispatch( );
}


Проверяем, что получилось...
Код
$ nm Timer.o
00000150 t _GLOBAL__D_timer
00000138 t _GLOBAL__I_timer
000000d4 t _Z41__static_initialization_and_destruction_0ii
00000054 W _ZN5Timer8DispatchEv
00000000 W _ZN5TimerC1Ev
0000002a W _ZN5TimerD1Ev
0000003e a __SP_H__
0000003d a __SP_L__
0000003f a __SREG__
         U __do_clear_bss
         U __do_copy_data
         U __do_global_ctors
         U __do_global_dtors
00000000 a __tmp_reg__
0000007e T __vector_10       <===== Оно!
00000001 a __zero_reg__
00000000 B timer

Аха-а-а! Наш вектор экспортируется под "правильным" именем!

Теперь глянем на дизассемблированный листинг:
Код
Disassembly of section .text:

00000000 <__vectors>:
   0:   1b c0           rjmp    .+54           ; 0x38 <__dtors_end>
   2:   3f c0           rjmp    .+126          ; 0x82 <__bad_interrupt>
   4:   3e c0           rjmp    .+124          ; 0x82 <__bad_interrupt>
   6:   3d c0           rjmp    .+122          ; 0x82 <__bad_interrupt>
   8:   3c c0           rjmp    .+120          ; 0x82 <__bad_interrupt>
   a:   3b c0           rjmp    .+118          ; 0x82 <__bad_interrupt>
   c:   3a c0           rjmp    .+116          ; 0x82 <__bad_interrupt>
   e:   39 c0           rjmp    .+114          ; 0x82 <__bad_interrupt>
  10:   38 c0           rjmp    .+112          ; 0x82 <__bad_interrupt>
  12:   37 c0           rjmp    .+110          ; 0x82 <__bad_interrupt>
  14:   76 c0           rjmp    .+236          ; 0x102 <__vector_10>         <=== Оно!
  16:   35 c0           rjmp    .+106          ; 0x82 <__bad_interrupt>
  18:   34 c0           rjmp    .+104          ; 0x82 <__bad_interrupt>
  1a:   33 c0           rjmp    .+102          ; 0x82 <__bad_interrupt>
  1c:   32 c0           rjmp    .+100          ; 0x82 <__bad_interrupt>
  1e:   31 c0           rjmp    .+98           ; 0x82 <__bad_interrupt>
  20:   30 c0           rjmp    .+96           ; 0x82 <__bad_interrupt>
  22:   2f c0           rjmp    .+94           ; 0x82 <__bad_interrupt>
  24:   2e c0           rjmp    .+92           ; 0x82 <__bad_interrupt>
  26:   2d c0           rjmp    .+90           ; 0x82 <__bad_interrupt>
  28:   2c c0           rjmp    .+88           ; 0x82 <__bad_interrupt>
  2a:   2b c0           rjmp    .+86           ; 0x82 <__bad_interrupt>
  2c:   2a c0           rjmp    .+84           ; 0x82 <__bad_interrupt>
  2e:   29 c0           rjmp    .+82           ; 0x82 <__bad_interrupt>
  30:   28 c0           rjmp    .+80           ; 0x82 <__bad_interrupt>
  32:   27 c0           rjmp    .+78           ; 0x82 <__bad_interrupt>


PS: Чтоб избежать лишних вопросов о версии gcc, отвечу сразу -- самосборная под линухом, версия 4.2.2. В контроллер не заливал, ограничился (пока) статическим анализом, т.ч. если не будет работать, отпишите, не сочтите за труд.

PPS: Попытавшись реализовать вариацию на тему стратегий от Александреску, обломался. Не так-то легко провернуть подобное в случае шаблонного класса. Если у кого-то есть идеи, как реализовать подобное в шаблонном классе, буду очень признателен за подобное. Вопрос интересует только в контексте полного отсутствия виртуальных методов! С виртуальными методами это тривиально...
Go to the top of the page
 
+Quote Post
klen
сообщение May 27 2010, 08:27
Сообщение #5


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



мдя... С++ пошел в микроконтроллеры. кчему бы это wink.gif
тенденция однако..... вывод; много лишнего озу и флеша wink.gif

если не использовать "гадости" типа виртуальных функций, RTTI , эксепшены и прочих архитектрных излишестьв то получается удобно и почти бесплатно.
пробывал сделать обертку для FreeRTOS, все задачи наследуются от базового класа в котором все есть - отается переопределить функцию задачи. в резултате кода приложения стало процентов на 90 smile.gif меньше, стало проще читать код. скорость не страдает, размер чуток - небольшие с++ накладные расходы. такчто я думаю что при умном применении с++ польза есть.
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
|- - 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 Текстовая версия Сейчас: 22nd July 2025 - 00:28
Рейтинг@Mail.ru


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