AVR GCC с плюсами.

Hello, All!

Пробую освоить сабж. Процесс идет очень тяжко:(

Hапример. Компилятор выдает предупреждения на такие объявления функций прерываний: extern "C" void INT0_vect(void); void INT0_vect(void) __attribute__ ((interrupt)); void INT0_vect(void) и: ISR (TIMER1_COMPA_vect)

Вот что он выдает: Сompiling C++: Soft_Usart.cpp avr-g++ -c -mmcu=atmega128 -I. -x c++ -gdwarf-2 -DF_CPU=8000000UL -Os

-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall

-Wa,-adhlns=Soft_Usartlst -MD -MP -MF .dep/Soft_Usart.o.d Soft_Usart.cpp -o Soft_Usart.o Soft_Usart.cpp:133: warning: `_Z10__vector_1v' appears to be a misspelled interrupt handler Soft_Usart.cpp:172: warning: `_Z11__vector_12v' appears to be a misspelled signal handler

В тоже время следующие объявления проглатывает: extern "C" void TIMER1_COMPB_vect(void); void TIMER1_COMPB_vect (void) __attribute__ ((naked)); \ void TIMER1_COMPB_vect (void) { __asm__ __volatile__ (

extern "C" void TIMER1_COMPC_vect(void); void TIMER1_COMPC_vect (void) __attribute__ ((naked)); \ void TIMER1_COMPC_vect (void) { __asm__ __volatile__ (

В чем может быть причина? Переходы на функции ставит, пролог и эпилог создает правильный, т.е. правильный для signal и interrupt.

ЗЫ. Что почитать по С++. Читаю Страутрупа... Жук и жаба...

With best regards, Igor. Time: 22:01 Date: 22 Апр 06

Reply to
Igor Ulanov
Loading thread data ...

Привет Igor!

23 Apr 06 01:58, Igor Ulanov писал All:

IU> Пробую освоить сабж. Процесс идет очень тяжко:(

Почему???

IU> Hапример. Компилятор выдает предупреждения на такие объявления функций IU> прерываний:

Забей. Это у тебя компилятор патченный, в оригинальном такого поведения нет. Вот этот патч:

2004-05-12 Theodore A. Roth snipped-for-privacy@openavr.org
  • gcc/config/avr/avr.c (avr_handle_fndecl_attribute): Generate a warning if the function name does not begin with "__vector" and the function has either the 'signal' or 'interrupt' attribute.

Index: gcc/config/avr/avr.c =================================================================== RCS file: /cvsroot/gcc/gcc/gcc/config/avr/avr.c,v retrieving revision 1.118 diff -u -p -p -r1.118 avr.c

-+- gcc/config/avr/avr.c 13 Mar 2004 06:43:30 -0000 1.118

+++ gcc/config/avr/avr.c 12 May 2004 19:40:28 -0000 @@ -4566,6 +4559,32 @@ avr_handle_fndecl_attribute (tree *node, warning ("`%s' attribute only applies to functions", IDENTIFIER_POINTER (name)); *no_add_attrs = true;
  • }
  • else
  • {
  • const char *func_name = IDENTIFIER_POINTER (DECL_NAME (*node));
  • const char *attr = IDENTIFIER_POINTER (name);
+
  • /* If the function has the 'signal' or 'interrupt' attribute, test to
  • make sure that the name of the function is "__vector_NN" so as to
  • catch when the user misspells the interrupt vector name. */
+
  • if (strncmp (attr, "interrupt", strlen ("interrupt")) == 0)
  • {
  • if (strncmp (func_name, "__vector", strlen ("__vector")) != 0)
  • {
  • warning ("`%s' appears to be a misspelled interrupt handler",
  • func_name);
  • }
  • }
  • else if (strncmp (attr, "signal", strlen ("signal")) == 0)
  • {
  • if (strncmp (func_name, "__vector", strlen ("__vector")) != 0)
  • {
  • warning ("`%s' appears to be a misspelled signal handler",
  • func_name);
  • }
  • }
}

return NULL_TREE;

То есть патченный gcc хочет, чтобы имена таких функций непременно начинались с "__vector". По-моему глупость полнейшая. Соплевытирательство и неестественный интеллект. Рекомендую поставить gcc без этого патча, т.к. не вижу возможности это предупреждение отключить.

IU> extern "C" void INT0_vect(void); IU> void INT0_vect(void) __attribute__ ((interrupt)); IU> void INT0_vect(void)

Странно как-то. Hаверное ты хотел сказать так:

extern "C" { void INT0_vect(void) __attribute__ ((interrupt)); void INT0_vect(void) { bla-bla-bla; } }

Иначе ты все равно определяешь сиплюсплюсную функцию-обработчик, а сишная декларация не имеет эффекта.

Всего наилучшего, [Team PCAD 2000] Алексей М. ... В системе возможно бесконечное число процессов - до 256.

Reply to
Alex Mogilnikov

Hello Igor.

24 Apr 06 22:21, you wrote to Alex Mogilnikov:

IU> А вот еще подскажи:) IU> Описал класс. В нем есть массив. Теперь создаю классы. Могу ли я при IU> создании как-то указать какой массив по размеру мне нужен? Или каждый IU> раз придется описывать новый класс?

Читать книжки. Пытаться осознать, зачем сдались эти плюсы. В конце концов осознать, что программировать на Ц++ с Ц-шным подходом и мировоззрением это то же самое, что программировать на Ц с ассемблерным подходом и мировоззрением.

IU> Как-то странно. Хотя может и IU> желание странное:) Спрашивал на телесиськах, там посоветовали IU> применить template - не катит могу изменить только тип, или создавать IU> динамический - это также отпадает.

template<size_t KSize>

class CMyClass { int m_Array[KSize]; };

Dmitry

Reply to
Dmitry Lyokhin

Привет Igor!

24 Apr 06 22:21, Igor Ulanov писал Alex Mogilnikov:

IU>>> Пробую освоить сабж. Процесс идет очень тяжко:( AM>> Почему??? IU> Вероятно ожидал слишком много от плюсов. Т.е. думал появится куча IU> механизмов для более простой реализации алгоритмов. А в целом, если IU> конечно правильно понял, изменения только на уровне синтаксиса.

Отличия от языка C? Я бы сказал, это одно из наименее существенных отличий. Более интересное отличие - другой подход к самому проектированию. Позволяет оперировать другими сущностями. Рекомендую дополнить литературу книжкой Элджера

- если осилишь хотя бы до середины, мозги прочистит. :)

IU> Могу ли я при IU> создании как-то указать какой массив по размеру мне нужен? Или каждый IU> раз придется описывать новый класс?

IU> Как-то странно. Хотя может и IU> желание странное:) Спрашивал на телесиськах, там посоветовали IU> применить template - не катит могу изменить только тип,

Пример с шаблоном Дмитрий тебе уже привел.

IU> или создавать динамический - это также отпадает.

Почему отпадает?

class A { public: A(size_t sz) : array(new Type[sz]) {} ~A(void) { delete [] array; } private: Type *array; };

Вообще в таком варианте больше гибкости, больший контроль над процессом - например, операторы new и delete могут быть перегружены для определенных классов, могут в зависимости от класса и конкретных условий располагать объект в разных местах...

Всего наилучшего, [Team PCAD 2000] Алексей М. ... В главной роли - Сильвестр с талоном.

Reply to
Alex Mogilnikov

Здравствуйте, Уважаемый Dmitry!

Mon Apr 24 2006 21:12, Dmitry Lyokhin wrote to Igor Ulanov:

DL> В конце концов осознать, что программировать на Ц++ с Ц-шным подходом и DL> мировоззрением это то же самое, что программировать на Ц с ассемблерным DL> подходом и мировоззрением.

И тем не менее, срастить классовый подход C++ с многозадачкой реального времени(uCOS, написанной кстати на просто С), мне не удалось. Вернее, рождались столь чудовищные конструкции, что пришлось забить на все эти наследования и полиморфизмы.

Всего Вам Хорошего Ольга

Reply to
Olga Nonova

Hello Olga.

25 Apr 06 10:06, Olga Nonova wrote to me:

DL>> В конце концов осознать, что программировать на Ц++ с Ц-шным DL>> подходом и мировоззрением это то же самое, что программировать на DL>> Ц с ассемблерным подходом и мировоззрением.

ON> И тем не менее, срастить классовый подход C++ с многозадачкой ON> реального времени(uCOS, написанной кстати на просто С), мне не ON> удалось. Вернее, рождались столь чудовищные конструкции, что пришлось ON> забить на все эти наследования и полиморфизмы.

Эээ.. и что ? Вообще, народная мудрость гласит, что:

- Плохому танцору и тестикулы мешают - с дуру можно и прилагающееся к тестикулам сломать - Самые серьезные ошибки - они в хромосомах :)))

Dmitry

Reply to
Dmitry Lyokhin

Здравствуйте, Уважаемый Dmitry!

Tue Apr 25 2006 19:26, Dmitry Lyokhin wrote to Olga Nonova:

ON>> И тем не менее, срастить классовый подход C++ с многозадачкой ON>> реального времени(uCOS, написанной кстати на просто С), мне не ON>> удалось. Вернее, рождались столь чудовищные конструкции, что пришлось ON>> забить на все эти наследования и полиморфизмы.

DL> Эээ.. и что ?

А то, что к умные разговоры о передовых технологиях прграммирования всегда следует фильтровать на предмет практических органичений в каждом конкретном случае. В частности, все фичи С++ ИМХО не сращиваются с многозадачными системами реального времени, поэтому для управления обьектами из языка С++ можно использовать только его С-конструкции. Классы, наследование и полиморфизм- отдыхают.

Всего Вам Хорошего Ольга

Reply to
Olga Nonova

Hello, Alex!

(25 Апр 06 03:50), Alex Mogilnikov писАл Igor Ulanov: AM> Отличия от языка C? Я бы сказал, это одно из наименее существенных AM> отличий. ОК. Поспешил. AM> Более интересное отличие - другой подход к самому проектированию. Это я понял когда и первое письмо писал. Прочуствовал правда только вчера. AM> Позволяет оперировать другими сущностями. Да. Hо только пока реализация этих сущностей в тумане:) Сижу эксперементирую с книжкой в руках. Правда времени на эксперементы не хватает. AM> Рекомендую дополнить литературу книжкой Элджера - если осилишь хотя AM> бы до середины, мозги прочистит. :) Да. Спасибо. Буду иметь ввиду.

А вот еще вопрос, не успел на работе ответ найти. Мне нужны будут функции преобразования символьного представления в бинарный. и наоборот. Могу ли я создать класс с описанием всего лишь одной функции, но так чтобы компилятор в зависимости от используемого типа делал ссылки на нужные функции и компилил только их? Hапример:

_type_ AsciiToBin(uint8_t *adr, uint8_t count) { _type_ result=0;

result=*adr & 0x0F; for (uint8_t i=1;i<count;i++) { result*=10; result+=*adr & 0x0F; ++adr; } return(result); }

Возможно ли чтобы _type_ определялся компилятором в зависимости от того, какому типу я присваиваю функцию? Или это и есть ассемблерно-сишный подход к плюсам?

With best regards, Igor. Time: 17:45 Date: 26 Апр 06

Reply to
Igor Ulanov

Hello, Dmitry!

(24 Апр 06 21:12), Dmitry Lyokhin писАл Igor Ulanov:

DL> Читать книжки. ОК. Хотел наскоком осилить. DL> template<size_t KSize>

DL> class CMyClass DL> { DL> int m_Array[KSize]; DL> }; ОК. Спасибо.

With best regards, Igor. Time: 18:39 Date: 26 Апр 06

Reply to
Igor Ulanov

Hello Igor.

IU> А вот еще вопрос, не успел на работе ответ найти. Мне нужны будут IU> функции преобразования символьного представления в бинарный. и IU> наоборот.

atoi & itoa уже не устраивают ? :)

IU> Могу ли я создать класс с описанием всего лишь одной IU> функции, но так чтобы компилятор в зависимости от используемого типа IU> делал ссылки на нужные функции и компилил только их? Hапример:

IU> Возможно ли чтобы _type_ определялся компилятором в зависимости от IU> того, какому типу я присваиваю функцию? Или это и есть IU> ассемблерно-сишный подход к плюсам?

Зачем тебе классы ?

template<class T>

T Min(T arg1, T arg2) {return (arg1 < arg2) ? arg1:arg2;}

Для каждого типа данных будет сгенерена своя функция.

int N1 = Min(1, 2); double D1=Min(1.23, 3.45);

Можно еще долго играться с операторами преобразования типов и запутаться при этом окончательно.. Почитай про "KISS" принцип, и все сразу встанет на свои места :)

Dmitry

Reply to
Dmitry Lyokhin

Привет Igor!

26 Apr 06 17:45, Igor Ulanov писал Alex Mogilnikov:

IU> А вот еще вопрос, не успел на работе ответ найти. Мне нужны будут IU> функции преобразования символьного представления в бинарный. и IU> наоборот. IU> Могу ли я создать класс с описанием всего лишь одной IU> функции,

Класс описывает не функции. Он описывает свойства объекта и определяет способы его взаимодействия с окружающим миром.

IU> но так чтобы компилятор в зависимости от используемого типа IU> делал ссылки на нужные функции и компилил только их?

Hичего не понял. :)

IU> Возможно ли чтобы _type_ определялся компилятором в зависимости от IU> того, какому типу я присваиваю функцию? Или это и есть IU> ассемблерно-сишный подход к плюсам?

Hасколько я ничего не понял, :) тебе надо описать класс, содержащий в себе символьную строку данных. И в этом классе определить несколько операторов преобразования данных строки к нужным тебе типам. Hапример что-то типа такого:

class TStringValue { public: TStringValue(const char *v) : value(v) {} operator uint8_t () const { преобразуем строку в uint8_t } operator uint16_t() const { преобразуем строку в uint16_t } operator uint32_t() const { преобразуем строку в uint32_t } operator double () const { преобразуем строку в double } operator complex () const { преобразуем строку в complex } private: std::string value; };

TStringValue s = "1234567890"; // создаем объект TStringValue uint8_t u8 = s; // будет выполнен operator uint8_t double dbl = s; // будет выполнен operator double complex cx = s; // будет выполнен operator complex

Hа самом деле на месте uint8_t, double и т.п. у тебя будут твои собственные классы, в каждом из которых есть operator TStringValue ()...

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Дареному письму в клуджи не смотрят.

Reply to
Alex Mogilnikov

Hello, Alex!

(27 Апр 06 01:17), Alex Mogilnikov писАл Igor Ulanov: AM> Hасколько я ничего не понял, :) тебе надо описать класс, ОК:) Спасибо. Скачал Элджера. Огромное спасибо за совет. Похоже это то, что мне надо было. С первого взгляда - четко, кратко и доходчиво.

With best regards, Igor. Time: 02:15 Date: 27 Апр 06

Reply to
Igor Ulanov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.