|
Объекты в 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
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
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); То компилятор ошибок не находит, но контроллер после прошивки стоит как "камень" В смысле не реагирует вовсе.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|