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

 
 
 
Reply to this topicStart new topic
> Extended Embedded C++ и кол-во объектов, Создает динамически не более двух, на третьем зависает.
Colobox
сообщение Aug 26 2008, 10:39
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 31-10-07
Пользователь №: 31 901



Вот такая простенькая программа:
Код
................
TByte*bb0,*bb1,*bb2;
.................
//---------------------------
int main()
{
    bb0=new TByte(1);
    bb1=new TByte(2);
    bb2=new TByte(3);
}
//-----------------------------

TByte - некий тип объектов с параметром.
При прогоне JTAG выдает: "The application aborted."
В случае:
Код
//---------------------------
int main()
{
    bb0=new TByte(1);
    bb1=new TByte(2);
}
//-----------------------------

все нормально, прога прокатывает без особенностей.
Неужели количество динамически создаваемых объектов проблемно или
ограниченно?! Или просто глюк? crying.gif
Надеюсь, просто чо-то не понимаю.
P.S. IAR for AVR 4.20

Сообщение отредактировал Colobox - Aug 26 2008, 10:57
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 26 2008, 10:58
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



А к моменту вызова main() heap инициализирована?
Go to the top of the page
 
+Quote Post
Colobox
сообщение Aug 26 2008, 11:23
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 31-10-07
Пользователь №: 31 901



Опс! А как это, простите, делать надо? unsure.gif
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 26 2008, 11:38
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Ну дожен быть в библиотеке некий набор функций, обеспечивающий возможность динамического размещения неких объектов в памяти. До вызова main обычно работает startup модуль, в котором должна инициироваться "куча". Вопрос еще в том где физически она размещается, и каков ее размер.
Go to the top of the page
 
+Quote Post
Colobox
сообщение Aug 26 2008, 12:59
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 31-10-07
Пользователь №: 31 901



Хм, а какие, например, вообще функции это делают?!
Разве куча не инициализируется автоматически? А физически куча в RAM, конечно.То, что осталось от стеков и глобальных и статических переменных- это и есть куча. Чего то недопонимаю?
Проц: Атмега128.
Aaaa, все!!! разобрался... В настройках проекта NEAR_HEAP увеличил в 2 раза 0x20->0x40
От напАсть-то!!! a14.gif

Сообщение отредактировал Colobox - Aug 26 2008, 13:28
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 26 2008, 13:37
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Можно и так сделать. Но кто-то должен кучу инициировать с указанием начального адреса и объема. Интересно, а как ты себе представляешь "инициализируется автоматически"? Скорее всего в startup'e вызывается фукция инициализации кучи (а может и не вызывается, не всем же нужна куча!). Так вот и возникают два вопроса:
1. Вызывается ли функция инициализации?
2. С какими параметрами?

Может куча и создается, но размером в 8-16 или кто его знает байт. Вот туда что-то помещается, а больше - нет.

Вообще полезно при написании программ с этим делом сразу разобраться, чтобы в будущем понимать что к чему. Да. кстати интересно, а что кажет sizeof(TByte)?
Go to the top of the page
 
+Quote Post
Colobox
сообщение Aug 26 2008, 19:34
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 31-10-07
Пользователь №: 31 901



Цитата
Интересно, а как ты себе представляешь "инициализируется автоматически"?

Компилятор генерит стартап, который и рулит начальными параметрами кучи-это я и назвал: "автоматически"-отдельно ручками ничего делать не надо.
Цитата
(а может и не вызывается, не всем же нужна куча!).

Судя по-наличию в настройках параметра near_heap со значением по-умолчанию (0x20)- скорее всего,
куча по-любому как-то обрабатывается- она ж просто остаток от памяти, чего ей не быть?!
Цитата
2. С какими параметрами?

вот с этим как-раз near_heap, но что означает 0х20 -не въезжал пока...
Цитата
Может куча и создается, но размером в 8-16 или кто его знает байт. Вот туда что-то помещается, а больше - нет.

Это очевидно, сейчас, по-меньшей мере.
Цитата
Вообще полезно при написании программ с этим делом сразу разобраться, чтобы в будущем понимать что к чему. Да. кстати интересно, а что кажет sizeof(TByte)?

Полезно, думаю еще столкнусь: в проге много динамических объектов будет.
Пользую new, нууу объект типа TByte небольшой вообще.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 27 2008, 05:54
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Ну так и с помощью : printf("size of TByte - %d\n", sizeof(TByte)) - выясни, сколько занимает твой объект места в памяти. И очень похоже, что куча твоя имеет всего 32 байта.
Go to the top of the page
 
+Quote Post
Colobox
сообщение Aug 27 2008, 06:23
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 31-10-07
Пользователь №: 31 901



Совершенно верно: в настройках проекта эта самая near_heap находится в группе "DLIB heap sizes".
Только сейчас осознал, вот, блин... :-)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 27 2008, 07:50
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(sergeeff @ Aug 27 2008, 08:54) *
Ну так и с помощью : printf("size of TByte - %d\n", sizeof(TByte)) - выясни, сколько занимает твой объект места в памяти.
И не забывайте, что при каждом выделении памяти в куче еще несколько (зависит от реализации) байт резервируются для служебных целей.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 27 2008, 08:03
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Плюс к этому, часто выделяемая память выравнивается на адрес, кратный степени 2, если того требует (или желательно с точки зрения быстродействия) архитектура конкретного процессора, что также может приводить к повышенному "расходу" памяти.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 26th June 2025 - 12:28
Рейтинг@Mail.ru


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