реклама на сайте
подробности

 
 
> Объекты в IAR
chernenko
сообщение Dec 6 2006, 16:47
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 23)
dxp
сообщение Dec 11 2006, 10:35
Сообщение #2


Adept
******

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



Цитата(chernenko @ Dec 6 2006, 19:47) *
Реально ли использование объектов в IAR AVR (версия 3.20).
Написал простую тестовую программу и столкнулся с несколькими трудностями.

Во-первых создаваемый в main объект ни в какую не видится в обработчике прерывания таймера. Undefined говорит и все тут. Ничего не получалось и ушел от этого переносом кода в main, выставляя в прерывании флаг разрешения обработки.

...

Может я из-за малого опыта и знания допустил концептуальную ошибку.

Или есть объективные причины в невозможности использования объектов в IAR

Ваших трудностей не понял, пример их не поясняет. С объектами в IAR'е все в порядке. Чтобы разобраться, используейте более простой пример и после компиляции смотрите в файл листинга (надо включить в опциях компиялтора генерацию листинга с мнемониками ассемблера) - там вся кодогенерация видна, как на блюдце.

Насчет того, что в неком обработчике прерываний не виден объект, приведите конкретный пример, как объявлен объект и как он используеся в обрабочтике прерываний. Объекты С++ в этом смысле мало отличаются от переменных встроенных типов.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
chernenko
сообщение Dec 13 2006, 13:41
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 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 и ссылается на этот метод.
Go to the top of the page
 
+Quote Post
dxp
сообщение Dec 13 2006, 13:51
Сообщение #4


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', что на это скажет компилятор? smile.gif

По Стандартам С/С++ объекты (переменные), объявленные внутри функции, являются локальными с видимостью и временем жизни внутри функции. И совершенно не важно какой это объект - встроенного типа, агрегатного или класс-типа.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Dec 13 2006, 13:54
Сообщение #5


тут может быть ваша реклама
*****

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



Объект то где согдается? Глобально?
Go to the top of the page
 
+Quote Post
chernenko
сообщение Dec 13 2006, 14:00
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 170
Регистрация: 8-02-06
Из: Москва
Пользователь №: 14 116



Цитата(jorikdima @ Dec 13 2006, 13:54) *
Объект то где согдается? Глобально?


Я только набираюсь опыта и знаний паралельно, так что не судите заранее строго smile.gif .

Не могу же я каждый раз создавать объект в прерывании....
Как же использовать конструктор объекта вне функции? То есть как создать объект глобально? Так же как и глобальное объявление функции? А если будет необходимость перегрузить объект?

Правильно ли я понимаю, что для создания глобального объекта я должен использовать конструктор
Код
TAverage filtr(32);
в том же месте где и объявление других функций?
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Dec 13 2006, 14:11
Сообщение #7


тут может быть ваша реклама
*****

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



Во-первых локального объявления функции быть не может. (это я к фразе "Так же как и глобальное объявление функции? ")

В прерывании согдавать объект тоже не надо.

Правило такое. Если вы создадите объект внутри функции, то доступ к нему получите только внутри этой же функции. Если глобально (не знаю как сказать... ну да там, где вы функции объявляете), то доступ отовсюду.

Это азы программирования. Не стоит к объектному программированию, тем более контроллеро,в приступать не поняв этого. Сужу не строго, но какую нибудь книженцию почитать надо бы.
Go to the top of the page
 
+Quote Post
chernenko
сообщение Dec 13 2006, 14:19
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 170
Регистрация: 8-02-06
Из: Москва
Пользователь №: 14 116



Цитата(jorikdima @ Dec 13 2006, 14:11) *
Во-первых локального объявления функции быть не может. (это я к фразе "Так же как и глобальное объявление функции? ")


Признаю ошибку в выражении. Поверьте, что начальные представления о Си, которые позволяют делать обработку сигналов с выхода СШП радара, я имею. Просто выразился по-идиотски. Видно не читал то, что сам написал.

До этого я проекты писал на Си и решил попробовать на Си++ с применением объектов.

Я не програмист, а радиотехник и вынужден изучать язык не имея никакой академической начальной платформы.

Сообщение отредактировал chernenko - Dec 13 2006, 14:44
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Dec 13 2006, 16:39
Сообщение #9


тут может быть ваша реклама
*****

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



Цитата(chernenko @ Dec 13 2006, 14:19) *
Цитата(jorikdima @ Dec 13 2006, 14:11) *

Во-первых локального объявления функции быть не может. (это я к фразе "Так же как и глобальное объявление функции? ")

Я не програмист, а радиотехник и вынужден изучать язык не имея никакой академической начальной платформы.

И я biggrin.gif biggrin.gif
Так в итоге вышло??
Go to the top of the page
 
+Quote Post
chernenko
сообщение Dec 15 2006, 23:00
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 170
Регистрация: 8-02-06
Из: Москва
Пользователь №: 14 116



Цитата(jorikdima @ Dec 13 2006, 16:39) *
Цитата(chernenko @ Dec 13 2006, 14:19) *

Цитата(jorikdima @ Dec 13 2006, 14:11) *

Во-первых локального объявления функции быть не может. (это я к фразе "Так же как и глобальное объявление функции? ")

Я не програмист, а радиотехник и вынужден изучать язык не имея никакой академической начальной платформы.

И я biggrin.gif biggrin.gif
Так в итоге вышло??



В результате получилась последовательность элементарных КИХ - фильтров.

Одна проблема:

В тестовой программке объекты создаются вот так:

Код
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));


Но это не гибко совсем.
То есть эти объекты в процессе программы я не могу удалить и не могу создать другие фильтры с новыми параметрами.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Dec 15 2006, 23:12
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 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++


--------------------
Go to the top of the page
 
+Quote Post
chernenko
сообщение Dec 15 2006, 23:40
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 170
Регистрация: 8-02-06
Из: Москва
Пользователь №: 14 116



Цитата(prottoss @ Dec 15 2006, 23:12) *
Правда сдесь уже надо будет следить за тем, создался ли объект или нет, кроме того распределять, кто может создавать объекты, а кто может их убивать. Конечно, как говорили выше, стоит почитать соотв. литературу, прежде чем сурьезно браться за C++



А разве я серьезно взялся...
Увы книжка не дает реального опыта smile.gif
А изучение происходит на текущем опыте решения конкретных небольших задачек, так как практически нет времени глубоко погрузиться.

А дальше, если я правильные книги читаю smile.gif , к методам этих объектов я должен уже обращаться вот так:
Код
InputData.Y.word = filtr->average(filtr0->average(InputData.Y.word));


smile.gif

Сообщение отредактировал chernenko - Dec 16 2006, 00:00
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Dec 16 2006, 12:16
Сообщение #13


тут может быть ваша реклама
*****

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



Цитата(chernenko @ Dec 15 2006, 23:40) *
А дальше, если я правильные книги читаю smile.gif , к методам этих объектов я должен уже обращаться вот так:
Код
InputData.Y.word = filtr->average(filtr0->average(InputData.Y.word));


smile.gif


Если в даннос случае
filtr
это указатель на объект, то да. Но указатель также глобальным должен быть. И не забывайте про удаление ненужных объектов. Вообще есть рекомендации, как только вы где-то написали new сразу где то напишите delete
Go to the top of the page
 
+Quote Post
prottoss
сообщение Dec 16 2006, 12:34
Сообщение #14


Гуру
******

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



Цитата(chernenko @ Dec 16 2006, 03:40) *
А разве я серьезно взялся...
Увы книжка не дает реального опыта smile.gif
А изучение происходит на текущем опыте решения конкретных небольших задачек, так как практически нет времени глубоко погрузиться.
Еще, я бы порекомендовал Вам установить какую нить систему программирования на С++ и на ней отлаживать работу с объектами. Если Вы не планируете работать плотно с Win32 и т.п. то ИМХО Borland C++ v 3.0 (под DOS) самое то, все есть, чтобы спокойно отладить скелет программы с объектами. Ну а потом перенести все отлаженное на ИАР и отшлифовать все там...


--------------------
Go to the top of the page
 
+Quote Post
chernenko
сообщение Dec 16 2006, 16:13
Сообщение #15


Частый гость
**

Группа: Свой
Сообщений: 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);


То компилятор ошибок не находит, но контроллер после прошивки стоит как "камень" smile.gif

В смысле не реагирует вовсе.
Go to the top of the page
 
+Quote Post
forever failure
сообщение Dec 16 2006, 17:07
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



Во первых, во всех файлах, где используется переменная типа TAverage должно быть включено
определние класса TAverage.
Во вторых, во всех файлах, где происходит обращение к полям и методам конкеретной переменной
TAverage filtr, должно быть объявление этой переменной:
extern TAverage filtr;
При этом сама переменная (объект) должна быть объявлена один и только один раз.

Всё получится. Успехов !
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Dec 17 2006, 01:06
Сообщение #17


тут может быть ваша реклама
*****

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



а warning никакких нет?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Dec 17 2006, 01:16
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 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);


То компилятор ошибок не находит, но контроллер после прошивки стоит как "камень" smile.gif

В смысле не реагирует вовсе.


Во первых, хотя бы в отладочной версии проверяйте,, создался ли объект, типа так:

Код
TAverage *filtr;
...



filtr = NULL;

filtr = new TAverage(32);

if(NULL == filtr)

{      /* что то с памятью моей стало!!! */

}



/* хромаем дальше */




Во вторых - с помощью new память под объект выделяется в куче (есть такой термин) - это "свободная" память. Ее размер можно указать в опциях проекта


--------------------
Go to the top of the page
 
+Quote Post
chernenko
сообщение Dec 17 2006, 01:32
Сообщение #19


Частый гость
**

Группа: Свой
Сообщений: 170
Регистрация: 8-02-06
Из: Москва
Пользователь №: 14 116



Цитата(prottoss @ Dec 17 2006, 01:16) *
Во вторых - с помощью new память под объект выделяется в куче (есть такой термин) - это "свободная" память. Ее размер можно указать в опциях проекта


Проверку я прописал, но до неё выполнение програмы просто не доходило. Увеличил CSTACK и Dynamic memory allocation в Debuger объект стал создаваться, до этого выполнение кода бесконечно в одном месте (пока не понял каком) циклилось при создании объекта. Сейчас объект создается. В железе проверить пока не могу, так как сейчас далеко, но думаю все наладилось в этой части. Большое спасибо!

Сообщение отредактировал chernenko - Dec 17 2006, 01:34
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 17 2006, 03:02
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



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


И ещё один совет от новичка. smile.gif Используйте сразу ".xcl" файл для настройки опций проекта, а то стандартное размещение как то хромает... С файлом разобраться не сложно даже без букваря.
Go to the top of the page
 
+Quote Post
chernenko
сообщение Dec 17 2006, 04:42
Сообщение #21


Частый гость
**

Группа: Свой
Сообщений: 170
Регистрация: 8-02-06
Из: Москва
Пользователь №: 14 116



Цитата(SasaVitebsk @ Dec 17 2006, 03:02) *
И ещё один совет от новичка. smile.gif

А почему новичка? Судя по конференции fulcrum Вы далеко не новичок. smile.gif
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 17 2006, 16:31
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(chernenko @ Dec 17 2006, 04:42) *
Цитата(SasaVitebsk @ Dec 17 2006, 03:02) *

И ещё один совет от новичка. smile.gif

А почему новичка? Судя по конференции fulcrum Вы далеко не новичок. smile.gif


В области СИ/СИ++ мои знания - зачаточные. Но я сражаюсь! biggrin.gif И очень уверен в себе. smile.gif Мне кажется без этой уверенности ничего сделать нельзя. Когда что-то не получается нельзя чтобы охватывала паника. Я или стискиваю зубы или оставляю тему на неделю. biggrin.gif Кстати результат почти всегда один и тот же.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Dec 17 2006, 17:09
Сообщение #23


Гуру
******

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



Цитата(SasaVitebsk @ Dec 17 2006, 20:31) *
В области СИ/СИ++ мои знания - зачаточные. Но я сражаюсь! biggrin.gif И очень уверен в себе. smile.gif Мне кажется без этой уверенности ничего сделать нельзя. Когда что-то не получается нельзя чтобы охватывала паника. Я или стискиваю зубы или оставляю тему на неделю. biggrin.gif Кстати результат почти всегда один и тот же.
Сорри, конечно, если обижу)))

Без учебников по Си/Си++ Вы можете сражаться очень долго и без толку, и прыгать, как баран на новые ворота сколь угодно долго. Результат очевиден, ворота будут - Вас возле ворот нет...

Могу порекомендовать две книги - это мои настольные "дао" по Си/Си++:

1.Б.И.Березин, С.Б.Березин. "Начальный курс С и С++". Москва.ДИАЛОГ- МИФИ.1999г

2.Джефф Элджер. "С++: Библиотека программиста ".- СПб: Издательство "Питер". 2000. Перевод с английского Е. Матвеев. :Jeff Alger. "C++ for real PROGRAMMERS"

Из первой можно узнать практически все, если что-то подзабыл по синтаксису и все начальные сведения об объектно-ориентированном программировании (ООП), вторая позволяет получить более углубленные знания по ООП и научиться обходить ошибки в ООП, а так же различным "выкрутасам" с объектами...


--------------------
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 18 2006, 23:58
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 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"

Из первой можно узнать практически все, если что-то подзабыл по синтаксису и все начальные сведения об объектно-ориентированном программировании (ООП), вторая позволяет получить более углубленные знания по ООП и научиться обходить ошибки в ООП, а так же различным "выкрутасам" с объектами...


Спасибо, но я конечно пользуюсь книгами. smile.gif Я не до такой степени в себе уверен, чтобы отбросить чужой опыт и знания. biggrin.gif

В то же время не могу не отметить, что живое общение (я имею ввиду не SMS и телефон, а ELECTRONIX smile.gif ), не променяю ни на какие коврижки. Большое человеческое спасибо организаторам, ну и авторам конечно же!
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 17:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01604 секунд с 7
ELECTRONIX ©2004-2016