Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывания на С++ и классы для ARM LPC
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
yuriyc
Уважаемые коллеги! Перерыл интернет в поисках ответа. Информации нашел крайне мало.
Если кто уже решал подобную проблему поделитесь опытом.
Ранее писал на С для LPC2148. Теперь интересует переход с С++.
Как правильно объявить класс и прерывание. И как потом взаимодействовать с ними.
Или если уже есть подобная тема, адресуйте меня туда .

PS среда разработки keil.
bus16
Оформляешь функцию прерывания как закрытый метод некоего класса - и всех делов ;-)
sergeeff
Цитата(bus16 @ May 13 2009, 14:37) *
Оформляешь функцию прерывания как закрытый метод некоего класса - и всех делов ;-)


и ....., в общем случае, работать не будет, т.к. указатель на метод класса больше размером, чем указатель на функцию. Этот вопрос уже рассматривался не так давно на форуме. Здесь довольно внятно описано : http://www.parashift.com/c++-faq-lite/poin...to-members.html
kurtis
Где-то скопипастил, но ключевые моменты понять можно, правда код для АВРок, но не думаю что для АРМ он будет сильно отличаться.
Это заголовочный файл, тела методов описаны в соответствующем .cpp файле.
CODE
/// pp.debski@gmail.com
/// Debug with uart c++ example for ATmega88.
/// It's always possible to buy me a beer or two :-).

#ifndef _C_UART_H_
#define _C_UART_H_
#include <avr/interrupt.h>

extern "C" void USART2_TX_vect(void) __attribute__ ((signal));
extern "C" void USART2_RX_vect(void) __attribute__ ((signal));

/// You should definitely change this values.
/// They're correct only for ~8.8MHz and 9600 b/s baud rate.
//#define UBRR0H_9600 0
//#define UBRR0L_9600 47

/// UART class.
class C_UART
{
private:
/// Data to send.
char* pTxBuffer;
/// Buffer for received data.
char* pRxBuffer;
/// Transmitter data counter and data size. When equals - transmiter is ready to send new data.
volatile unsigned int uiTxCounter;
volatile unsigned int uiTxSize;
/// Receiver data counter and data size. When equals - transmiter is ready to send new data.
volatile unsigned int uiRxCounter;
volatile unsigned int uiRxSize;
/// Static pointer used in interrupts routines.
static C_UART* pUart;
public:
/// Setting up UART registers.
void Init(void);
/// Sending data.
bool Send(char* pBuffer, unsigned int uiSize);
/// Receiving data.
bool Receive(char* pBuffer, unsigned int uiSize);
/// Checks if transmitter is ready to send new data.
bool IsTxReady(void)
{
return !uiTxSize;
}
/// Checks if receiver is ready to send new data.
bool IsRxReady(void)
{
return !uiRxSize;
}
/// Setting static pUart pointer.
C_UART()
{
pUart = this;
}
/// Interrupt routines.
friend void USART2_TX_vect(void);
friend void USART2_RX_vect(void);
};

#endif
HARMHARM
Можно просто иметь статическим членом класса:
Код
class TAsync
{
  static __irq __arm void IsrUart0(void);
}
__irq __arm void TAsync::IsrUart0(void)
{}
Andy Mozzhevilov
Функция - точка входа в прерывание делается статической. На нее настраивается VIC.
Далее - вызов функции обработки прерывания по указателю на класс.
Вот пример:
Нажмите для просмотра прикрепленного файла
yuriyc
Действительно. Всё оказалось достаточно просто.
Спасибо за помощь!!!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.