AVR GCC с плюсами.

Apr 22, 2006 11 Replies

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


Привет 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.

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

Привет 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] Алексей М. ... В главной роли - Сильвестр с талоном.

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

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

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

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

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

Hello Olga.

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

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

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

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

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

Dmitry

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

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

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

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

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

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

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

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

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

Привет 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] Алексей М. ... Дареному письму в клуджи не смотрят.

Hello, Alex!

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

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required