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

 
 
> прерывания в 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
Aprox
сообщение May 23 2012, 14:57
Сообщение #5


Местный
***

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



Цитата(_Артём_ @ May 23 2012, 16:21) *
Да, пример был для IAR ARV. Но вряд ли в IAR ARM нет такой возможности.

Увы, по причине того, что контроллер прерываний в Cortex автоматически сохраняет контекст при срабатывании прерывания, становится уже ненужным управляющее слово __irq, обычно указывающее компилятору сохранять контекст программным способом.
Вот, что пишут в той же доке IAR ARM, на которую вы же и ссылались:
Цитата
Note: ARM Cortex-M has a different interrupt mechanism than other ARM devices,
and for these devices a different set of primitives is available.....
.....
On ARM Cortex-M, an interrupt service routine enters and returns in the same way as a
normal function, which means no special keywords are required. Thus, the keywords
__irq, __fiq, and __nested are not available when you compile for ARM Cortex-M.
These exception function names are defined in cstartup_M.c and cstartup_M.s.


Иными словами, время старых, привычных решений уходит.

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

"Врачу - исцелися сам."

Go to the top of the page
 
+Quote Post



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

 


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


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