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

 
 
> IAR AVR C++ class и прерывание
west329_
сообщение Oct 2 2009, 20:21
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Подскажите как правильно описать прерывание от uart0 для функции которая определяется в класе на уровень выше, так сказать пртоколе верхнего уровня cHuProt.

Сам клас
Код
#include "com0.h"

class cHuProt:public cUsart0 {
  protected:  
              void    HU_Rx_Byte(void);
  public:
              ui8     Recive_Pack_HU(void);
              ui8     Recive_Pack_HU_End(void);
              ui8     Init_HU(void);
              ui8     Reset_Recive_HU(void);
              ui8     Expect_new_HU(void);
              ui8     ECM_HU_len(void);
              ui8*    Get_Point_to_ECM_HU_data(void);
              ui8*    Get_Point_to_HU_S(void);
              ui8*    Get_Point_to_HU_C(void);
              ui8*    Get_Point_to_HU_I(void);
              ui8     DW_HU_Transmit(ui8 *pData);
              
  //cHumaxProt();
  //~cHumaxProt();
};


В клас cUsart0 я записал все низкоуровневые функции работы с железом uart
Код
class cUsart0 {
  protected:
              ui8 Usart0_Tx_Raw(ui8 tx_char);
              ui8 Usart0_RX_Raw(void);
  public:
              ui8 Usart0_Init(ui16 ubrr);
              ui8 Usart0_Tx_Data(ui8 *pData, ui8 len_data);
              ui8 Usart0_Tx_Char(ui8 tx_char);
              
  //Usart0();
  //~Usart0();
};

/////////////////////////////////////////////////////////////////////////////
// Реализация класса cUsart0
/////////////////////////////////////////////////////////////////////////////
....
....
....



Сама функция Usart0_Init использует прерывание при получении символа с uart.

Очень хочется вызывать функцию Usart0_RX_Raw(void); когда приходит символ, тоесть както так описать метод в протоколе
Код
#pragma vector = USART0_RXC_vect
__interrupt void cHuProt::HU_Rx_Byte(void) {
      temp=ui8 Usart0_RX_Raw();
      ......
      ......
}


но увы получаю ошибки
Цитата
Error[Ta022]: Interrupt functions cannot take any parameters. D:\Main_prj\tutor\MainTestCPP\hu.h 19
Go to the top of the page
 
+Quote Post
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 18)
Alechin
сообщение Dec 4 2009, 10:55
Сообщение #16


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

Группа: Свой
Сообщений: 158
Регистрация: 27-06-05
Из: Химки, Моск.обл.
Пользователь №: 6 334



Хорошо, допустми каким-либо образом мне удалось создать экземпляры класса таймеров.
Теперь хотелось бы создать класс индивидуального таймера.
Если создать наследника каласса таймеров - получим вызов конструктора базового класса (класса таймеров) при создании каждого экземпляра таймера. Что не нужно (и не правильно). Убрать вызов конструктора базового класса невозможно?
Хорошо, создаем самостоятельный класс. Тогда будем передавать в конструктор класса таймера ссылки/адреса на базовый класс. При этом подстановки компилятор уже не будет делать и получим овехед?
Как тут "выкрутиться"?
Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 4 2009, 11:48
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Классы таймеров состоят исключительно из констант (в виде enum'ов) и статических функций. У них нет конструкторов и деструкторов. Так что их можно безопасно создавать в любых количествах.

И вообще они реализуют так называемый 'compile-time полиморфизм'. Вместо таблиц виртуальных методов (для настройки на конкретный таймер) используются шаблоны, которые ориентируются на ИМЕНА констант и функций. Имея несколько типов классов TIMER с одноименными member'ами с разным содержимым, можно настроить TTimer на любой физический таймер
Go to the top of the page
 
+Quote Post
Alechin
сообщение Dec 4 2009, 12:02
Сообщение #18


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

Группа: Свой
Сообщений: 158
Регистрация: 27-06-05
Из: Химки, Моск.обл.
Пользователь №: 6 334



Цитата
Классы таймеров состоят исключительно из констант (в виде enum'ов) и статических функций. У них нет конструкторов и деструкторов. Так что их можно безопасно создавать в любых количествах.

ну то, что нет деструктора это понятно. А вот конструктор должен быть - надо ведь проинициализировать и "запустить" таймер.
Иначе в начале программы придется все делать руками (типа методы Init() вызывать). Моя задача полность оградить программиста от работы с какой-либо аппаратурой. Т.е. он должен знать, что есть класс "таймер" с известным тиком, экземпляры корого он создает и пользует, есть класс "цифровой потенциометр" в котором он устанавливает значения. А уж какие-там ножки, прерывания задействованы, программный или аппаратный SPI там - это его не должно касаться. Все это прописано в моем хидере, который он просто подключает к проекту. Что-либо править в данном хидере ему нельзя.

Цитата
И вообще они реализуют так называемый 'compile-time полиморфизм'. Вместо таблиц виртуальных методов (для настройки на конкретный таймер) используются шаблоны, которые ориентируются на ИМЕНА констант и функций. Имея несколько типов классов TIMER с одноименными member'ами с разным содержимым, можно настроить TTimer на любой физический таймер

где на это посмотреть?
В принципе я сейчас создал класс таймера (программного), при создании которого конструктору передаю адрес класса аппаратных таймеров. Компилятор молодец - никакого оверхеда! Ну в принципе адреса классов аппаратных таймеров известны на этапе компиляции, так наверное он так и должен был поступить (просто подставить адреса, а не использовать указатель). Плохо то, что неизвестно, можно ли это гарантировать при других уровнях оптимизации например, или смене версии компилятора.
Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 4 2009, 13:51
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Alechin @ Dec 4 2009, 15:02) *
ну то, что нет деструктора это понятно. А вот конструктор должен быть - надо ведь проинициализировать и "запустить" таймер.
Это другое дело. Вопрос в том, как именно 'таймер' передается програмисту? Если передается тип (класс), многочисленные экземпляры которого может создавать програмист для доступа к одному физическому таймеру - то эти экземпляры должны быть 'пустыми'. Т.е. они служат лишь для настройки на конкретный таймер. В этом случае саму аппаратуру нужно инициализировать отдельно: либо руками, либо использовать singleton'ы, которые будут инициализировать конкретные аппаратные таймеры.
Второй вариант - когда програмисту отдаются конкретные ИНСТАНСЫ объекта 'таймер'. В таком случае инициализацию инстанса можно производить в конструкторе

Цитата
Моя задача полность оградить программиста от работы с какой-либо аппаратурой. Т.е. он должен знать, что есть класс "таймер" с известным тиком, экземпляры корого он создает и пользует,
Один экземпляр на таймер или много экземпляров на один и тот же таймер?

Цитата
где на это посмотреть?
Я же писал пример несколько сообщений назад

Цитата
Ну в принципе адреса классов аппаратных таймеров известны на этапе компиляции, так наверное он так и должен был поступить (просто подставить адреса, а не использовать указатель).
Угу, с шаблоном так и будет
Цитата
Плохо то, что неизвестно, можно ли это гарантировать при других уровнях оптимизации например, или смене версии компилятора.
Можно, это врожденное свойство шаблона и от уровня оптимизации это не зависит
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 00:04
Рейтинг@Mail.ru


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