|
Объекты в 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', что на это скажет компилятор?  По Стандартам С/С++ объекты (переменные), объявленные внутри функции, являются локальными с видимостью и временем жизни внутри функции. И совершенно не важно какой это объект - встроенного типа, агрегатного или класс-типа.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Dec 13 2006, 14:00
|
Частый гость
 
Группа: Свой
Сообщений: 170
Регистрация: 8-02-06
Из: Москва
Пользователь №: 14 116

|
Цитата(jorikdima @ Dec 13 2006, 13:54)  Объект то где согдается? Глобально? Я только набираюсь опыта и знаний паралельно, так что не судите заранее строго  . Не могу же я каждый раз создавать объект в прерывании.... Как же использовать конструктор объекта вне функции? То есть как создать объект глобально? Так же как и глобальное объявление функции? А если будет необходимость перегрузить объект? Правильно ли я понимаю, что для создания глобального объекта я должен использовать конструктор Код TAverage filtr(32); в том же месте где и объявление других функций?
|
|
|
|
|
Dec 13 2006, 14:19
|
Частый гость
 
Группа: Свой
Сообщений: 170
Регистрация: 8-02-06
Из: Москва
Пользователь №: 14 116

|
Цитата(jorikdima @ Dec 13 2006, 14:11)  Во-первых локального объявления функции быть не может. (это я к фразе "Так же как и глобальное объявление функции? ") Признаю ошибку в выражении. Поверьте, что начальные представления о Си, которые позволяют делать обработку сигналов с выхода СШП радара, я имею. Просто выразился по-идиотски. Видно не читал то, что сам написал. До этого я проекты писал на Си и решил попробовать на Си++ с применением объектов. Я не програмист, а радиотехник и вынужден изучать язык не имея никакой академической начальной платформы.
Сообщение отредактировал chernenko - Dec 13 2006, 14:44
|
|
|
|
|
Dec 15 2006, 23:00
|
Частый гость
 
Группа: Свой
Сообщений: 170
Регистрация: 8-02-06
Из: Москва
Пользователь №: 14 116

|
Цитата(jorikdima @ Dec 13 2006, 16:39)  Цитата(chernenko @ Dec 13 2006, 14:19)  Цитата(jorikdima @ Dec 13 2006, 14:11)  Во-первых локального объявления функции быть не может. (это я к фразе "Так же как и глобальное объявление функции? ")
Я не програмист, а радиотехник и вынужден изучать язык не имея никакой академической начальной платформы. И я Так в итоге вышло?? В результате получилась последовательность элементарных КИХ - фильтров. Одна проблема: В тестовой программке объекты создаются вот так: Код int main(void); void SerialSetDelay(void); void StartADC(void); void StopADC(void); TAverage filtr(8); TAverage filtr0(16); Затем в прерывании используются вот так: Код InputData.Y.word = filtr.average(filtr0.average(InputData.Y.word)); Но это не гибко совсем. То есть эти объекты в процессе программы я не могу удалить и не могу создать другие фильтры с новыми параметрами.
|
|
|
|
|
Dec 15 2006, 23:12
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(chernenko @ Dec 16 2006, 03:00)  Но это не гибко совсем. То есть эти объекты в процессе программы я не могу удалить и не могу создать другие фильтры с новыми параметрами. ну а почему бы не воспользоваться new и delete? Схема такая: Объявляете в глобальном пространстве не статические классы, а указатели: Код TAverage *filtr; В функции main создаете объекты с помощью new Код filtr = new TAverage(32); Когда надо, удаляете объект Код delete filtr; Правда сдесь уже надо будет следить за тем, создался ли объект или нет, кроме того распределять, кто может создавать объекты, а кто может их убивать. Конечно, как говорили выше, стоит почитать соотв. литературу, прежде чем сурьезно браться за C++
--------------------
|
|
|
|
|
Dec 15 2006, 23:40
|
Частый гость
 
Группа: Свой
Сообщений: 170
Регистрация: 8-02-06
Из: Москва
Пользователь №: 14 116

|
Цитата(prottoss @ Dec 15 2006, 23:12)  Правда сдесь уже надо будет следить за тем, создался ли объект или нет, кроме того распределять, кто может создавать объекты, а кто может их убивать. Конечно, как говорили выше, стоит почитать соотв. литературу, прежде чем сурьезно браться за C++ А разве я серьезно взялся... Увы книжка не дает реального опыта А изучение происходит на текущем опыте решения конкретных небольших задачек, так как практически нет времени глубоко погрузиться. А дальше, если я правильные книги читаю  , к методам этих объектов я должен уже обращаться вот так: Код InputData.Y.word = filtr->average(filtr0->average(InputData.Y.word));
Сообщение отредактировал chernenko - Dec 16 2006, 00:00
|
|
|
|
|
Dec 16 2006, 12:16
|

тут может быть ваша реклама
    
Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280

|
Цитата(chernenko @ Dec 15 2006, 23:40)  А дальше, если я правильные книги читаю  , к методам этих объектов я должен уже обращаться вот так: Код InputData.Y.word = filtr->average(filtr0->average(InputData.Y.word));  Если в даннос случае filtr это указатель на объект, то да. Но указатель также глобальным должен быть. И не забывайте про удаление ненужных объектов. Вообще есть рекомендации, как только вы где-то написали new сразу где то напишите delete
|
|
|
|
|
Dec 16 2006, 16:13
|
Частый гость
 
Группа: Свой
Сообщений: 170
Регистрация: 8-02-06
Из: Москва
Пользователь №: 14 116

|
Только часто бывает, что в борланде идея работает а в железе нет. Вот сейчас, если объект создать так: Код int main(void); TAverage filtr(8); И использовать его вот так: Код InputData.Y.word = filtr.average(InputData.Y.word); Все прекрасно работает! А если через указатели: Код TAverage *filtr; int main(void); Код int main { filtr = new TAverage(32); } И к объекту уже обращаться вот так: Код InputData.Y.word = filtr->average(InputData.Y.word); То компилятор ошибок не находит, но контроллер после прошивки стоит как "камень" В смысле не реагирует вовсе.
|
|
|
|
|
Dec 17 2006, 01:16
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(chernenko @ Dec 16 2006, 20:13)  А если через указатели: Код TAverage *filtr; int main(void); Код int main { filtr = new TAverage(32); } И к объекту уже обращаться вот так: Код InputData.Y.word = filtr->average(InputData.Y.word); То компилятор ошибок не находит, но контроллер после прошивки стоит как "камень" В смысле не реагирует вовсе. Во первых, хотя бы в отладочной версии проверяйте,, создался ли объект, типа так: Код TAverage *filtr; ...
filtr = NULL;
filtr = new TAverage(32);
if(NULL == filtr)
{ /* что то с памятью моей стало!!! */
}
/* хромаем дальше */ Во вторых - с помощью new память под объект выделяется в куче (есть такой термин) - это "свободная" память. Ее размер можно указать в опциях проекта
--------------------
|
|
|
|
|
Dec 17 2006, 01:32
|
Частый гость
 
Группа: Свой
Сообщений: 170
Регистрация: 8-02-06
Из: Москва
Пользователь №: 14 116

|
Цитата(prottoss @ Dec 17 2006, 01:16)  Во вторых - с помощью new память под объект выделяется в куче (есть такой термин) - это "свободная" память. Ее размер можно указать в опциях проекта Проверку я прописал, но до неё выполнение програмы просто не доходило. Увеличил CSTACK и Dynamic memory allocation в Debuger объект стал создаваться, до этого выполнение кода бесконечно в одном месте (пока не понял каком) циклилось при создании объекта. Сейчас объект создается. В железе проверить пока не могу, так как сейчас далеко, но думаю все наладилось в этой части. Большое спасибо!
Сообщение отредактировал chernenko - Dec 17 2006, 01:34
|
|
|
|
|
Dec 17 2006, 17:09
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(SasaVitebsk @ Dec 17 2006, 20:31)  В области СИ/СИ++ мои знания - зачаточные. Но я сражаюсь!  И очень уверен в себе.  Мне кажется без этой уверенности ничего сделать нельзя. Когда что-то не получается нельзя чтобы охватывала паника. Я или стискиваю зубы или оставляю тему на неделю.  Кстати результат почти всегда один и тот же. Сорри, конечно, если обижу))) Без учебников по Си/Си++ Вы можете сражаться очень долго и без толку, и прыгать, как баран на новые ворота сколь угодно долго. Результат очевиден, ворота будут - Вас возле ворот нет... Могу порекомендовать две книги - это мои настольные "дао" по Си/Си++: 1.Б.И.Березин, С.Б.Березин. "Начальный курс С и С++". Москва.ДИАЛОГ- МИФИ.1999г 2.Джефф Элджер. "С++: Библиотека программиста ".- СПб: Издательство "Питер". 2000. Перевод с английского Е. Матвеев. :Jeff Alger. "C++ for real PROGRAMMERS" Из первой можно узнать практически все, если что-то подзабыл по синтаксису и все начальные сведения об объектно-ориентированном программировании (ООП), вторая позволяет получить более углубленные знания по ООП и научиться обходить ошибки в ООП, а так же различным "выкрутасам" с объектами...
--------------------
|
|
|
|
|
Dec 18 2006, 23:58
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(prottoss @ Dec 17 2006, 17:09)  Сорри, конечно, если обижу)))
Без учебников по Си/Си++ Вы можете сражаться очень долго и без толку, и прыгать, как баран на новые ворота сколь угодно долго. Результат очевиден, ворота будут - Вас возле ворот нет...
Могу порекомендовать две книги - это мои настольные "дао" по Си/Си++:
1.Б.И.Березин, С.Б.Березин. "Начальный курс С и С++". Москва.ДИАЛОГ- МИФИ.1999г
2.Джефф Элджер. "С++: Библиотека программиста ".- СПб: Издательство "Питер". 2000. Перевод с английского Е. Матвеев. :Jeff Alger. "C++ for real PROGRAMMERS"
Из первой можно узнать практически все, если что-то подзабыл по синтаксису и все начальные сведения об объектно-ориентированном программировании (ООП), вторая позволяет получить более углубленные знания по ООП и научиться обходить ошибки в ООП, а так же различным "выкрутасам" с объектами... Спасибо, но я конечно пользуюсь книгами.  Я не до такой степени в себе уверен, чтобы отбросить чужой опыт и знания. В то же время не могу не отметить, что живое общение (я имею ввиду не SMS и телефон, а ELECTRONIX  ), не променяю ни на какие коврижки. Большое человеческое спасибо организаторам, ну и авторам конечно же!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|