|
Объекты в IAR |
|
|
|
Dec 6 2006, 16:47
|
Частый гость
 
Группа: Свой
Сообщений: 170
Регистрация: 8-02-06
Из: Москва
Пользователь №: 14 116

|
Реально ли использование объектов в IAR AVR (версия 3.20). Написал простую тестовую программу и столкнулся с несколькими трудностями. Во-первых создаваемый в main объект ни в какую не видится в обработчике прерывания таймера. Undefined говорит и все тут. Ничего не получалось и ушел от этого переносом кода в main, выставляя в прерывании флаг разрешения обработки. Тестирую на двух фильтрах - объектах КИХ (обычное усреднение) и на БИХ (полосовом). В debugere объекты создаются и все вроде правильно а в реальности на железе ерунда полная. Иногда бывает что при создании объекта некоторые переменные объекта начинаю неадекватно изменяться.... Вот так выглядит объект: Код class TAverage { private: #define average_array_size 32 signed int average_array[average_array_size]; signed long int average_out; unsigned int curr_average_array; public: unsigned char average_array_max; TAverage(unsigned char average_array_max_setup) { if(average_array_max_setup <= average_array_size) { average_array_max = average_array_max_setup; } } signed int average(signed int average_in) { average_out -= average_array[curr_average_array]; average_array[curr_average_array] = average_in; average_out += average_array[curr_average_array]; curr_average_array++; if (curr_average_array >= average_array_max) curr_average_array = 0; return ((signed int)(average_out / average_array_max + 0.5)); } }; Вот так создается объект с помощью конструктора: Код TAverage filtr(32); Вот так использую метод объекта: Код InputData.Y.word = filtr.average(InputData.X.word); Может я из-за малого опыта и знания допустил концептуальную ошибку. Или есть объективные причины в невозможности использования объектов в IAR
|
|
|
|
|
 |
Ответов
|
Dec 11 2006, 10:35
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(chernenko @ Dec 6 2006, 19:47)  Реально ли использование объектов в IAR AVR (версия 3.20). Написал простую тестовую программу и столкнулся с несколькими трудностями.
Во-первых создаваемый в main объект ни в какую не видится в обработчике прерывания таймера. Undefined говорит и все тут. Ничего не получалось и ушел от этого переносом кода в main, выставляя в прерывании флаг разрешения обработки.
...
Может я из-за малого опыта и знания допустил концептуальную ошибку.
Или есть объективные причины в невозможности использования объектов в IAR Ваших трудностей не понял, пример их не поясняет. С объектами в IAR'е все в порядке. Чтобы разобраться, используейте более простой пример и после компиляции смотрите в файл листинга (надо включить в опциях компиялтора генерацию листинга с мнемониками ассемблера) - там вся кодогенерация видна, как на блюдце. Насчет того, что в неком обработчике прерываний не виден объект, приведите конкретный пример, как объявлен объект и как он используеся в обрабочтике прерываний. Объекты С++ в этом смысле мало отличаются от переменных встроенных типов.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Dec 13 2006, 13:41
|
Частый гость
 
Группа: Свой
Сообщений: 170
Регистрация: 8-02-06
Из: Москва
Пользователь №: 14 116

|
Цитата(dxp @ Dec 11 2006, 10:35)  Насчет того, что в неком обработчике прерываний не виден объект, приведите конкретный пример, как объявлен объект и как он используеся в обрабочтике прерываний. Пробовал по разному использовать. Один из вариантов такой: -объявляется он как и в предыдущем примере; -затем в main() создается объект с помощью конструктора; - и в прерывании обращаюсь к методу объекта Код //--------------------------------------------------------------------------------------------- #pragma vector = TIMER2_COMP_vect __interrupt void Intr_TIMER2_COMP(void) { InputData.Y.word = filtr.average(InputData.Y.word); Если такое обращение к методу использовать в функции main, то нормально. Если в любом прерывании, то компилятор пишет undefined и ссылается на этот метод.
|
|
|
|
|
Dec 13 2006, 13:51
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(chernenko @ Dec 13 2006, 16:41)  Цитата(dxp @ Dec 11 2006, 10:35)  Насчет того, что в неком обработчике прерываний не виден объект, приведите конкретный пример, как объявлен объект и как он используеся в обрабочтике прерываний.
Пробовал по разному использовать. Один из вариантов такой: -объявляется он как и в предыдущем примере; -затем в main() создается объект с помощью конструктора; - и в прерывании обращаюсь к методу объекта Код //--------------------------------------------------------------------------------------------- #pragma vector = TIMER2_COMP_vect __interrupt void Intr_TIMER2_COMP(void) { InputData.Y.word = filtr.average(InputData.Y.word); Если такое обращение к методу использовать в функции main, то нормально. Если в любом прерывании, то компилятор пишет undefined и ссылается на этот метод. Если такое обращение будет не в прерывании, но и в любой функции, кроме той, где объект создан, то компилятор выдаст ту же ошибку. Если Вы в main создадите int a = 5; ... а потом в прерывании попытаетесь обратиться к этой переменной 'a', что на это скажет компилятор?  По Стандартам С/С++ объекты (переменные), объявленные внутри функции, являются локальными с видимостью и временем жизни внутри функции. И совершенно не важно какой это объект - встроенного типа, агрегатного или класс-типа.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
Сообщений в этой теме
chernenko Объекты в IAR Dec 6 2006, 16:47 jorikdima Объект то где согдается? Глобально? Dec 13 2006, 13:54 chernenko Цитата(jorikdima @ Dec 13 2006, 13:54) Об... Dec 13 2006, 14:00 jorikdima Во-первых локального объявления функции быть не мо... Dec 13 2006, 14:11 chernenko Цитата(jorikdima @ Dec 13 2006, 14:11) Во... Dec 13 2006, 14:19 jorikdima Цитата(chernenko @ Dec 13 2006, 14:19) Ци... Dec 13 2006, 16:39 chernenko Цитата(jorikdima @ Dec 13 2006, 16:39) Ци... Dec 15 2006, 23:00  prottoss Цитата(chernenko @ Dec 16 2006, 03:00) Но... Dec 15 2006, 23:12   chernenko Цитата(prottoss @ Dec 15 2006, 23:12) Пра... Dec 15 2006, 23:40    jorikdima Цитата(chernenko @ Dec 15 2006, 23:40) А ... Dec 16 2006, 12:16    prottoss Цитата(chernenko @ Dec 16 2006, 03:40) А ... Dec 16 2006, 12:34 chernenko Только часто бывает, что в борланде идея работает ... Dec 16 2006, 16:13 prottoss Цитата(chernenko @ Dec 16 2006, 20:13) А ... Dec 17 2006, 01:16  chernenko Цитата(prottoss @ Dec 17 2006, 01:16) Во ... Dec 17 2006, 01:32   SasaVitebsk Цитата(chernenko @ Dec 17 2006, 01:32) Пр... Dec 17 2006, 03:02    chernenko Цитата(SasaVitebsk @ Dec 17 2006, 03:02) ... Dec 17 2006, 04:42     SasaVitebsk Цитата(chernenko @ Dec 17 2006, 04:42) Ци... Dec 17 2006, 16:31      prottoss Цитата(SasaVitebsk @ Dec 17 2006, 20:31) ... Dec 17 2006, 17:09       SasaVitebsk Цитата(prottoss @ Dec 17 2006, 17:09) Сор... Dec 18 2006, 23:58 forever failure Во первых, во всех файлах, где используется переме... Dec 16 2006, 17:07 jorikdima а warning никакких нет? Dec 17 2006, 01:06
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|