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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> IAR 4.41A & C++
mungo
сообщение Sep 21 2007, 13:21
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 21-09-07
Из: СССР
Пользователь №: 30 719



Цитата(alexander55 @ Sep 21 2007, 15:28) *
Ну теперь дело за малым прошагать malloc, а затем понять, что надо что-то поменять в icf файле.


В каком файле? Может в .xcl? Так там задано 8000 под HEAP. Статически распределено около 9 кило, 64 всего у камня.

После дебага я нашел, что и malloc не работает. Различия лишь в том, что malloc не входит в ступор, а new входит. Похоже, считает, что нет памяти в куче. Осталось найти, где копать. Однако фигово сделано - ни исключений, ничего. Просто бесконечный цикл, без возможности узнать, что памяти нет.

Разобрался. По непонятной причине в оболочке писал 8000 хипа, а в файле было 100. Явно не хватало. И при этом все остальные параметры показывает правильно.


--------------------
Сомневаюсь, и вам советую!
Go to the top of the page
 
+Quote Post
zhevak
сообщение Sep 24 2007, 04:35
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(mungo @ Sep 21 2007, 19:21) *
Разобрался. По непонятной причине в оболочке писал 8000 хипа, а в файле было 100. Явно не хватало. И при этом все остальные параметры показывает правильно.


По горячим следам.
1. Посмотрел тут ARM® IAR C/C++ Compiler Reference Guide на стр. 13 есть очень короткая глава
Dynamic memory on the heap в ней раздел Potential problems. Сказано только как избежать исчерпания кучи, но не сказано, как ведут себя new. Не хорошо как-то... возникло чувство недоделанности не только руководства, но и самого компилятора. Жаль.

2. Ради спортивного интереса открыл к MSDN (MS VC++ 6.0)
"If there is insufficient memory for the allocation request, by default operator new returns NULL. You can change this default behavior by writing a custom exception-handling routine and calling the _set_new_handler run-time library function with your function name as its argument."
(Перевод мой)
"Если для запроса нехватает памяти, то поумолчанию оператор new возвращает NULL. Вы можете изменить такое поведение путем создания своей подпрограммы-обработчика исключения и вызова библиотечной функции _set_new_handler (имеется ввиду из ран-тайм бибиотеки) с именем Вашей функции в качестве аргумента."

2 mungo -- Спасибо за обозначенные грабли. Будем иметь ввиду.

Сообщение отредактировал zhevak - Sep 24 2007, 04:36


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
alexander55
сообщение Sep 24 2007, 05:10
Сообщение #18


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(mungo @ Sep 21 2007, 17:21) *
В каком файле? Может в .xcl?

Да, в xcl.
Я уже зациклился на 5.10 (здесь icf).
Насчет куч не обольщайтесь. Они имеют свойство ползти.
Старая, старая сказка (Шварц).
Еще лет 20 назад все работали под ДОС и ставили резидентов. Было замечено, что после убирания резидентных программ часть свободной памяти как корова языком слизывала.
Наше время. До бога молитва дошла, БГ и его банда ввела периодически работающий диспетчер оптимизации свободной памяти.
Результаты использования куч.
В универсаме кассирша покупателям : "Подождите компьютер перезагружается". (Наблюдаю постоянно).
PS.
Не все йогурты одинаковы (реклама).
Навозну кучу разгребая ... (Крылов)
... не верь глазам своим. (К.Прутков).
Go to the top of the page
 
+Quote Post
Alexey Bishletov
сообщение Sep 24 2007, 06:12
Сообщение #19


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

Группа: Новичок
Сообщений: 121
Регистрация: 15-08-06
Пользователь №: 19 557



Цитата(zhevak @ Sep 24 2007, 08:35) *
Сказано только как избежать исчерпания кучи, но не сказано, как ведут себя new. Не хорошо как-то... возникло чувство недоделанности не только руководства, но и самого компилятора. Жаль.

При исчерпании кучи new должен возвращать NULL. Так у всех, поэтому в руководстве про это и не писали. Можно добавить в программу проверку на NULL после new и вывод ошибки. Поможет избежать "загадочного" поведения.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 24 2007, 06:29
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Alexey Bishletov @ Sep 24 2007, 09:12) *
При исчерпании кучи new должен возвращать NULL.

Это malloc() должен, а new, за просто так, никому ничего не должен.
Читаем здесь http://electronix.ru/forum/index.php?showt...hl=new&st=0


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
zhevak
сообщение Sep 24 2007, 06:34
Сообщение #21


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(Alexey Bishletov @ Sep 24 2007, 12:12) *
При исчерпании кучи new должен возвращать NULL. Так у всех, поэтому в руководстве про это и не писали. Можно добавить в программу проверку на NULL после new и вывод ошибки. Поможет избежать "загадочного" поведения.


Чуть выше
Цитата
Короче нашел где ступор - когда вызывает new, заходит в malloc, после чего в abort где и находит бесконечный branch сам на себя.


А в самом первом посту
Цитата
До оператора new все работает, затем просто виснет проц.


Я так понял, что new вообще не возвращает управление. Правда, это все со слов автора темы. Что там генерит ИАР-компайлер я не проверял -- нет под руками изделия, где бы можно было проверить отход опрератора new от всемирно принятых правил игры.

Добавлять проверку на NULL нужно обязательно!. Для коммерческих программ для компов я это делаю в обязательном порядке, хотя там памяти -- умотаться. Но кто его знает, а вдруг при длительной эксплуатации (несколько недель, месяцев) память исчерпается, и что тогда? Позорный BSOD?
А вот для АРМов проврека на NULL -- ну это просто жизненно необходимо!


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
alexander55
сообщение Sep 24 2007, 07:02
Сообщение #22


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Я завелся (значит не прав), но проделал полезную работу в рамках тестирования IAR 5.10.
Привожу тексты.
Это тестовые классы.
#ifndef Class_TestH
#define Class_TestH

void Test_Classes(void);

// проверка С++ 5.10

class TZero {
protected:
unsigned char var_char;
public:
TZero(void) {var_char=0; cout << "Created class TZero\n";};
~TZero(){cout<<"Delete TZero\n";};
void Show(void) { cout <<"var_char=" << (int)var_char <<"\n";};
};

class TOne : public TZero
{
protected:
unsigned short var_short;
unsigned int var_int;
public:
TOne(void) {var_char=5;};
TOne (char i) {
var_char=i;
var_short=0; var_int=0;
cout << "Created class TOne" << (int)var_char << "\n";
};
~TOne(){cout<<"Delete TOne\n";};
void Show(void) {
cout << "var_char="<< (int)var_char <<" var_short="\
<<var_short <<" var_int="<<var_int <<"\n";
};
void Inc_Short(void) {var_short++;};
void Inc_Int(void) {var_int++;};
};

class TAdd {
public:
TAdd(void) {cout << "Created TAdd\n";};
~TAdd(){cout<<"Delete TAdd\n";};
};

class TTwo : public TOne, public TAdd
{
public:
TTwo (void) { cout << "Created class TTwo" << "\n";};
~TTwo(){cout<<"Delete TTwo\n";};
void Show(void) {
cout << "var_char="<< (int)var_char <<" var_short="<<var_short\
<<" var_int="<<var_int <<"\n";
};
};
//------------------------------------------------------------------------
//#define Variant
void Test_Classes(void) {
#ifdef Variant
TZero *ptr_0=new TZero();
TOne *ptr_1=new TOne(1);
TOne *ptr_2=new TOne(2);
TTwo *ptr_3=new TTwo();
ptr_1->Inc_Short();
ptr_2->Inc_Int();
ptr_0->Show(); //TZero
ptr_1->Show(); //TZero>TOne
ptr_2->Show(); //TZero>TOne
ptr_3->Show(); //TZero>TOne+TAdd >TTwo
cout<<"ptr_0="<<ptr_0 \
<<" ptr_1="<<ptr_1 \
<<" ptr_2="<<ptr_2 \
<<" ptr_3="<<ptr_3 <<"\n";
delete ptr_2;
delete ptr_1;
delete ptr_0;
delete ptr_3;
#else
TZero Zero;
TZero *ptr_0=&Zero;
TOne One1(1);
TOne *ptr_1=&One1;
TOne One2(2);
TOne *ptr_2=&One2;
TTwo Two;
TTwo *ptr_3=&Two;

ptr_1->Inc_Short();
ptr_2->Inc_Int();
ptr_0->Show(); //TZero
ptr_1->Show(); //TZero<TOne
ptr_2->Show(); //TZero<TOne
ptr_3->Show(); //TZero<TOne+TAdd <TTwo
cout<<"ptr_0="<<ptr_0 \
<<" ptr_1="<<ptr_1 \
<<" ptr_2="<<ptr_2 \
<<" ptr_3="<<ptr_3 <<"\n"\
<<" SizeOf Zero="<<sizeof(Zero) <<"\n"\
<<" SizeOf One1="<<sizeof(One1) <<"\n"\
<<" SizeOf One2="<<sizeof(One2) <<"\n"\
<<" SizeOf Two="<<sizeof(Two) <<"\n";
#endif
}

#endif
и кусок main тестирующий
//---------
while (TRUE) {
Test_Classes();
for(unsigned int a=0;a<0x100000;a++);
}
}
Результаты: ptr не ползут нигде.

Created class TZero
Created class TOne1
Created class TZero
Created class TOne2
Created class TZero
Created TAdd
Created class TTwo
var_char=0
var_char=1 var_short=1 var_int=0
var_char=2 var_short=0 var_int=1
var_char=5 var_short=0 var_int=1073763204
ptr_0=40001fc0 ptr_1=40001fd4 ptr_2=40001fcc ptr_3=40001fc4
SizeOf Zero=1
SizeOf One1=8
SizeOf One2=8
SizeOf Two=8
Delete TTwo
Delete TAdd
Delete TOne
Delete TZero
Delete TOne
Delete TZero
Delete TOne
Delete TZero
Delete TZero
и т.д.

Created class TZero
Created class TZero
Created class TOne1
Created class TZero
Created class TOne2
Created class TZero
Created TAdd
Created class TTwo
var_char=0
var_char=1 var_short=1 var_int=0
var_char=2 var_short=0 var_int=1
var_char=5 var_short=0 var_int=0
ptr_0=40002068 ptr_1=40002078 ptr_2=40002088 ptr_3=40002098
Delete TOne
Delete TZero
Delete TOne
Delete TZero
Delete TZero
Delete TTwo
Delete TAdd
Delete TOne
Delete TZero
и т.д.

PS. Я менял delete местами - не придраться, все ОК.
Все логично. P.J.P. молодец.
Но к кучам я все равно отношусь с недоверием.
Да, множественное наследование работает в eec++
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 24 2007, 07:06
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(zhevak @ Sep 24 2007, 09:34) *
Добавлять проверку на NULL нужно обязательно!.

Только перед этом нужно убедится в наличии лифта убедится, что установленный Вами или по умолчанию обработчик исключения по нехватке памяти этот самый NULL возвращает а не делает что-либо другое.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 24 2007, 07:14
Сообщение #24


Гуру
******

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



Цитата(zhevak @ Sep 24 2007, 09:34) *
Я так понял, что new вообще не возвращает управление. Правда, это все со слов автора темы. Что там генерит ИАР-компайлер я не проверял -- нет под руками изделия, где бы можно было проверить отход опрератора new от всемирно принятых правил игры.
Простой вызов new в случае нехватки памяти вызывает функцию, установленную при помощи set_new_handler(). После чего пытается выделить память снова. В варианте int a= new(nothrow) int[1000]; new при нехватке памяти возвращает 0.


--------------------
На любой вопрос даю любой ответ
"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
zhevak
сообщение Sep 24 2007, 07:51
Сообщение #25


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(zltigo @ Sep 24 2007, 13:06) *
Только перед этом нужно убедится в наличии лифта убедится, что установленный Вами или по умолчанию обработчик исключения по нехватке памяти этот самый NULL возвращает а не делает что-либо другое.

Лифт -- О-о, эта аллегория мне нравитсяsmile.gif
Продолжим нашу священную "религиозную" войну.

Я только одного не могу понять. Почему разработчики ИАР-компилятора сделали поведение new несколько отличное от стандарта и при этом никак не удосужились описать его? Может я не там читал?

Почему архитекторы спроектировали такуй странный лифт, каждый раз входя в который нужно всегда убеждаться том, что он вообще является лифтом, а не сортиром -- "вошел и провалился". Что до меня, так после таких дел я вообще не хочу пользоваться в ИАРе этим лифтом (new).


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
alexander55
сообщение Sep 24 2007, 08:02
Сообщение #26


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(zhevak @ Sep 24 2007, 11:51) *
я вообще не хочу пользоваться в ИАРе этим лифтом (new).

Я стараюсь не пользоваться им везде.
Я говорил ему, чтобы не мешал водку с портвейном. А он....у-у-у хипи волосатый. (Осенний марофон).
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 24 2007, 08:04
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(zhevak @ Sep 24 2007, 10:51) *
Я только одного не могу понять. Почему разработчики ИАР-компилятора сделали поведение new несколько отличное от стандарта и при этом никак не удосужились описать его? Может я не там читал?

Стандарт читали? Ну и что там вычитали? Там все отдано на откуп программисту.
Цитата
Почему архитекторы спроектировали такуй странный лифт, каждый раз входя в который нужно всегда убеждаться том, что он вообще является лифтом

Архитекторы предоставили прекрасную возможность все гибко настраивать, ибо существует, как минимум, три логичных варианта поведения:
- ждать, пока память освободиться в другом процессе и возможно инициализировать процесс освобождения;
- повесить общий обработчик этой исключительной ситуации (именно с целью дабы каждый раз не проверять наличия лифта);
- возвратить, например, NULL, как это принято в malloc();
Цитата
Что до меня, так после таких дел я вообще не хочу пользоваться в ИАРе этим лифтом (new).

Я честно говоря не знаю, как он в IAR по умолчанию устроен, но set_new_handler() всегда позволит сделать, то, что Вам надо, да и new(nothrow) поддерживается.
Проблемы возникают, только тогда, когда кто-то считает, что new кому-то чего-то должен сделать только по той причине, что так, например, VC++ так сделано.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
zhevak
сообщение Sep 24 2007, 08:30
Сообщение #28


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(Сергей Борщ @ Sep 24 2007, 13:14) *
Простой вызов new в случае нехватки памяти вызывает функцию, установленную при помощи set_new_handler(). После чего пытается выделить память снова. В варианте int a= new(nothrow) int[1000]; new при нехватке памяти возвращает 0.

Да. Это как раз ожидаемое поведение new.
Но, получается, ИАР работает немного по-другому: если обработчик указан -- вызываю, если не указан -- висю. Так?


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 24 2007, 08:41
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(zhevak @ Sep 24 2007, 11:30) *
Да. Это как раз ожидаемое поведение new.

Почуствуйте разницу между new и new( nothrow ) smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 24 2007, 10:34
Сообщение #30


Гуру
******

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



Цитата(zhevak @ Sep 24 2007, 11:30) *
Да. Это как раз ожидаемое поведение new.
Но, получается, ИАР работает немного по-другому: если обработчик указан -- вызываю, если не указан -- висю. Так?
Нет, получается именно так, как ожидается. Выделяем - памяти нет - вызываем функцию new_handler() (по умолчанию там пустышка) - пытаемся снова выделить память. Поскольку new_handler() ничего не сделал, памяти взяться не откуда, снова получаем "памяти нет" и ку.
2 zltigo: new_handler() возвращает void, поэтому через него нельзя заставить new вернуть 0.


--------------------
На любой вопрос даю любой ответ
"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

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:30
Рейтинг@Mail.ru


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