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

фанат дивана
     
Группа: Свой
Сообщений: 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; } , обработчики прерываний не линкуются. Может есть какой-то более цивильный способ? Ну и вообще, хотелось бы не статическую функцию, а просто функцию класса  ЗЫ. msp-gcc.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
 |
Ответов
|
Aug 3 2009, 15:27
|

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

|
Цитата(ReAl @ Aug 3 2009, 20:47)  А что толку? Всё равно ничего не получится. Там разговор шёл про патч - атрибуту signal дать как аргумент номер прерывания и позволить произвольные имена, но, насколько я понял, до "официальных" версий это так и не дошло. Да уж. Который раз убеждаюсь, что avr-gcc выделяется на фоне остальных gcc некоей особой "особостью"  Цитата(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(); }
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 3 2009, 18:06
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 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(); } Но мне такой вариант не очень понравился. Вопрос вкусовой.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|