реплика не в тему созданную мной, но дабы не занимать пространство форума продолжу сдесь задавать вопросы по Embedded C++ и моих траблах с ним)
в итоге я содал класс:
Код
/*****************************************************************************
Описание класса USART
******************************************************************************/
class clUSART
{
/****************************************************************************/
protected:
UINT RX_Flags; // флаги ошибок
UCHAR RX_Count; // количество принятых байт в буфере
UCHAR RX_WrIndex; // индекс для принимаемых в буфер данных
UCHAR RX_RdIndex; // индекс для читаемых из буфера данных
UCHAR RX_Buffer[USART_RX_BUFFER_SIZE];// кольцевой FIFO буфер приемника
public:
void RX_Reset(void); // сброс буфера приемника
BOOL RX_GetChar(UCHAR *dest); // получить байт из буфера приемника
UCHAR RX_GetCount(void); // проверить, если принятые данные
UCHAR RX_GetState(void); // получить состояние приемника
/****************************************************************************/
protected:
UINT TX_Flags; // флаги ошибок
UCHAR TX_Count; // количество отправляемых байт в буфере
UCHAR TX_WrIndex; // индекс для принимаемых в буфер данных
UCHAR TX_RdIndex; // индекс для читаемых из буфера данных
UCHAR TX_Buffer[USART_TX_BUFFER_SIZE];// кольцевой FIFO буфер передатчика
public:
void TX_Reset(void); // сброс буфера передатчика
BOOL TX_PutChar(UCHAR srch); // отправить байт в буфер передатчика
UCHAR TX_GetCount(void); // проверить, если данные для отправки
UCHAR TX_GetState(void); // получить состояние передатчика
/****************************************************************************/
protected:
UCHAR Timeout; // счетчик для подсчета таймаутов
public:
BOOL IsFrameTimeout(void); // проверить таймаут кадра
/****************************************************************************/
protected:
/****************************************************************************/
public:
clUSART(void);
void UDR_Empty(void);
void RX_Complete(void);
void TX_Complete(void);
void TIMER_Timeout(void);
};
В модуле создал глобальную переменную, которую конструктор класса инициализирует адресом класса:
Код
/*****************************************************************************
Глобальные переменные
******************************************************************************/
clUSART *g_usart = NULL;
....
/*****************************************************************************
Инциализация USART
******************************************************************************/
clUSART::clUSART(void)
{
g_usart = this;
....
}
А прерывания использовал так:
Код
/*****************************************************************************
Обработчик опустошения регистра данных передатчика USART UDR
******************************************************************************/
__interrupt void UDR_Empty(void)
{ g_usart->UDR_Empty();
}
void clUSART::UDR_Empty(void)
{
.....
}
// и так все остальные прерывания
В итоге когда я посмотрел листинг то опешил, каждое прерывание сопровождается массовым сохранением в стек регистров, в начале, и таким же массовым в конце, что не есть хорошо на больших скоростях обмена по USART. В принципе я знаю про такой эффект компилятора, но надеялся что когда я перейду на Си++, компилятор "поумнеет". Увы.. Может быть кто занет как решить проблему, или подскажет способ, как внедрить прерывание в класс?