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

 
 
> прерывания в C++, как оформить ISR?
Aprox
сообщение May 23 2012, 09:52
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131



В разделе по scmRTOS, в процессе диспута про OS, я встретил пример кода на C++, в котором был представлен некий класс, описывающий работу UART. И в этом классе один из методов якобы был обработчиком прерывания! Как сделать обработчик прерывания отдельной функцией- мне понятно. Но как сделать метод класса таким обработчиком- совершенно неясно в практическом плане. Я работаю с кристаллами STM32 Cortex, пишу на C++, поэтому очень интересует данный вопрос. Если кто умеет назначать метод класса обработчиком прерываний- буду крайне признателен за наводку.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Артём_
сообщение May 23 2012, 10:05
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Aprox @ May 23 2012, 12:52) *
В разделе по scmRTOS, в процессе диспута про OS, я встретил пример кода на C++, в котором был представлен некий класс, описывающий работу UART. И в этом классе один из методов якобы был обработчиком прерывания! Как сделать обработчик прерывания отдельной функцией- мне понятно. Но как сделать метод класса таким обработчиком- совершенно неясно в практическом плане. Я работаю с кристаллами STM32 Cortex, пишу на C++, поэтому очень интересует данный вопрос. Если кто умеет назначать метод класса обработчиком прерываний- буду крайне признателен за наводку.


Обсуждалось например тут:ссылка


Цитата(_Артём_ @ May 23 2012, 12:59) *
Обсуждалось например тут:ссылка


Вот ещё пример
Код
class Tuart_class {
public:
    #pragma vector=TCE0_OVF_vect
    __interrupt static void UsartHandler()
    {
        unsigned char i=USART_GetChar(&USARTC0);
    }
    
};
Go to the top of the page
 
+Quote Post
Aprox
сообщение May 23 2012, 12:30
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131



Цитата(_Артём_ @ May 23 2012, 13:05) *
Обсуждалось например тут:ссылка

Спасибо за ответ. Но ваша ссылка касается обсуждения исключительно в рамках scmRTOS, авторы которой наделали кучу заголовочных файлов с удобными им макросами. Я же работаю в стандарте C++ IAR v6.0 c библиотекой CMSIS специально для STM32. В этой библиотеке уже заготовлены все возмжные для каждого кристалла обработчики прерываний с заданными именами, начально это пустышки. Юзеру остается только наполнить эти пустые ISR своим конкретным кодом и обьявить этот обработчик дружественным в нужных классах. Других путей я не вижу.

Цитата
Вот ещё пример
Код
class Tuart_class {
public:
    #pragma vector=TCE0_OVF_vect
    __interrupt static void UsartHandler()
    {
        unsigned char i=USART_GetChar(&USARTC0);
    }
    
};


В хелпе IAR v6.0 для ARM и Cortex я не нашел управляющего слова __interrupt. А у директивы pragma не нашел параметра vector. Что я делаю не так?



Цитата(ReAl @ May 23 2012, 13:24) *
Но с inline-подстановкой обработчика работать будет не хуже, зато можно вызвать нестатический метод конкретного объекта.

По-моему inline-подстановка в данном случае используется не по назначению. Не для этого она придумана. Да и вообще, задача сделать метод класса обработчиком прерывания имеет чисто академический интерес из той же серии- использовать обьектное программирование не по назначению.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 23 2012, 13:21
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Aprox @ May 23 2012, 15:30) *
Спасибо за ответ. Но ваша ссылка касается обсуждения исключительно в рамках scmRTOS, авторы которой наделали кучу заголовочных файлов с удобными им макросами.

Не думаю что дело в заголовочных файлах scmrtos.

Цитата(Aprox @ May 23 2012, 15:30) *
В хелпе IAR v6.0 для ARM и Cortex я не нашел управляющего слова __interrupt. А у директивы pragma не нашел параметра vector. Что я делаю не так?


Да, пример был для IAR ARV. Но вряд ли в IAR ARM нет такой возможности.

Цитата(Aprox @ May 23 2012, 15:30) *
Я же работаю в стандарте C++ IAR v6.0 c библиотекой CMSIS специально для STM32. В этой библиотеке уже заготовлены все возмжные для каждого кристалла обработчики прерываний с заданными именами, начально это пустышки. Юзеру остается только наполнить эти пустые ISR своим конкретным кодом и обьявить этот обработчик дружественным в нужных классах. Других путей я не вижу.


Вот что пишут в доке по IAR ARM:

Цитата
C++ AND SPECIAL FUNCTION TYPES
C++ member functions can be declared using special function types, with the restriction
that interrupt member functions must be static. When a non-static member function is
called, it must be applied to an object. When an interrupt occurs and the interrupt
function is called, there is no object available to apply the member function to.
Special function types can be used for static member functions. For example, in the
following example, the function handler is declared as an interrupt function:
class Device
{
static __irq void handler();
};


Go to the top of the page
 
+Quote Post



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

 


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


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