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

 
 
 
Reply to this topicStart new topic
> Прерывания на С++ и классы для ARM LPC, Как пишется?
yuriyc
сообщение May 13 2009, 09:59
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 27
Регистрация: 28-04-05
Пользователь №: 4 557



Уважаемые коллеги! Перерыл интернет в поисках ответа. Информации нашел крайне мало.
Если кто уже решал подобную проблему поделитесь опытом.
Ранее писал на С для LPC2148. Теперь интересует переход с С++.
Как правильно объявить класс и прерывание. И как потом взаимодействовать с ними.
Или если уже есть подобная тема, адресуйте меня туда .

PS среда разработки keil.
Go to the top of the page
 
+Quote Post
bus16
сообщение May 13 2009, 10:37
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 78
Регистрация: 10-01-07
Пользователь №: 24 270



Оформляешь функцию прерывания как закрытый метод некоего класса - и всех делов ;-)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 13 2009, 11:15
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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


и ....., в общем случае, работать не будет, т.к. указатель на метод класса больше размером, чем указатель на функцию. Этот вопрос уже рассматривался не так давно на форуме. Здесь довольно внятно описано : http://www.parashift.com/c++-faq-lite/poin...to-members.html
Go to the top of the page
 
+Quote Post
kurtis
сообщение May 13 2009, 12:49
Сообщение #4


Местный
***

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



Где-то скопипастил, но ключевые моменты понять можно, правда код для АВРок, но не думаю что для АРМ он будет сильно отличаться.
Это заголовочный файл, тела методов описаны в соответствующем .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
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение May 13 2009, 13:34
Сообщение #5


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Можно просто иметь статическим членом класса:
Код
class TAsync
{
  static __irq __arm void IsrUart0(void);
}
__irq __arm void TAsync::IsrUart0(void)
{}
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение May 14 2009, 08:05
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Функция - точка входа в прерывание делается статической. На нее настраивается VIC.
Далее - вызов функции обработки прерывания по указателю на класс.
Вот пример:
Прикрепленный файл  timer.zip ( 3.7 килобайт ) Кол-во скачиваний: 163


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
yuriyc
сообщение May 20 2009, 10:32
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 27
Регистрация: 28-04-05
Пользователь №: 4 557



Действительно. Всё оказалось достаточно просто.
Спасибо за помощь!!!
Go to the top of the page
 
+Quote Post

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

 


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


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