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

 
 
> Оператор new[] и uCOS-II
aas
сообщение Jun 25 2014, 14:01
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 15-12-11
Из: Краснодар
Пользователь №: 68 865



Доброе время суток!

Имеется контроллер ARM7-TDMI-S (LPC2214), на нем многозадачное приложение C++ с оконной графической оболочкой на основе uCOS-II и uC-GUI. Размер памяти 1 мег. Исключения не используются, STL и шаблоны используются. Компилятор используется GCC.
Вообще я не большой знаток C++ и вообще работы с микрокрнтроллерами, раньше программировал на Java большие веб-порталы, базы данных и т.д. Но мне от предшественника достался уже настроенный проект и среда разработки, т.е. вноси изменения, нажимай кнопочку, и компилируй, прошивай, отлаживай и т.д.

С некоторых пор, когда я сильно увеличил интенсивность использование динамической памяти, около 20-30 обращений в секунду. Программа стала виснуть примерно через 2 - 20 минут работы. На локализацию причины ушло более месяца, и то я не уверен, что локализовал верно.

Начал я с алгоритма распределения памяти, от предшественника досталась папка с исходниками newlib-1.16.0. Оттуда я вытащил исходник malloc и free, интересные алгоритмы, но ничего криминального я там не нашел (спасибо китайцу, их писавшему, очень подробные комментарии оставил, а также больше количество отключаемого диагностического кода!). Как и положено, еще мой предшественник переопределил вызовы, включающие мютекс при обращении к этим функциям. Поигрался я с параметрами компиляции, походил по ним отладчиком, все вроде работает там.
Но потом я заметил, что некорректные адреса иногда возвращает именно вызов new[], а не malloc, причем, new[] сам вызывает malloc, и этот malloc возвращает адреса корректные, а из new[], как правило, тоже вылетают адреса корректные, те же, что malloc вернул. Но иногда вместо них вылетают нулевые указатели, а иногда даже указатели на его собственный, этого самого new[], код (судя по таблице символов), причем, не на точку входа, а куда-то на середину кода. И вот после того, как я по этому указателю что-то пишу, становится все совсем плохо sad.gif.

В общем, заменил я вызов new char[ xxx ] на malloc( xxx ), а delete[] на free(), и все вроде как заработало. Потом я вернул new[] и delete[], но стал запрещать прерывания на время их работы (макросы OS_ENTER_CRITICAL() и OS_EXIT_CRITICAL в uCOS), тоже вроде не падает (по крайней мере, еще не упало, пока я пишу это сообщение...).

Вот я и не понимаю, что такого может быть в new[] и delete[], что они не работаю нормально в много задачной среде? В программе не так уж и много мест, где они вызываются. Даже оконная оболочка ими не пользуется, а обращается напрямую к malloc и free, а с ними то я проблем не нашел. STL еще, наверное, их использует, я так догадываюсь, но он тоже вызывается не так часто. Но все-таки хотелось бы иметь нормальные варианты new и delete, которые корректно конструкторы и деструкторы вызывают, ну и т.д.

Правильно ли я понимаю проблему, и какие есть способы ее решить?

Спасибо за ответы!

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
den_po
сообщение Jun 25 2014, 20:50
Сообщение #2


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

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



Нену, если проблема в new, почему бы не смотреть его код? Ну или просто переписать по-своему.
Go to the top of the page
 
+Quote Post
aas
сообщение Jun 25 2014, 21:14
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 15-12-11
Из: Краснодар
Пользователь №: 68 865



Цитата(den_po @ Jun 26 2014, 00:50) *
Нену, если проблема в new, почему бы не смотреть его код? Ну или просто переписать по-своему.


Я пока не нашел, к сожалению, где посмотреть его код (в смысле, исходник), ну и как правильно его переписать тем более. Там какой-то старый компилятор GNU ARM, еще 2007 или 2008 года, версию сейчас не помню, завтра на работе посмотрю ее...

Но меня удивляет еще другое: что могло заставить разработчиков компилятора или библиотеки сделать new[] не thread-safe, если malloc уже сделан thread-safe?

Сообщение отредактировал aas - Jun 25 2014, 21:16
Go to the top of the page
 
+Quote Post
den_po
сообщение Jun 25 2014, 23:14
Сообщение #4


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

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



Цитата(aas @ Jun 26 2014, 01:14) *
Я пока не нашел, к сожалению, где посмотреть его код (в смысле, исходник),

libstdc++

Цитата(aas @ Jun 26 2014, 01:14) *
ну и как правильно его переписать тем более

Если совсем просто, то как-то так:
Код
void* operator new(size_t sz){ return malloc(sz); };
void* operator new[](size_t sz){ return malloc(sz); };
void operator delete(void * p){ free(p); };
void operator delete[](void * p){ free(p); };
void* operator new(size_t size, void* p){ return p; }
void* operator new[](size_t size, void* p){ return p; }
void operator delete (void*, void*){ }
void operator delete[] (void*, void*){ }

А вообще гугль перегрузка операторов new delete
Go to the top of the page
 
+Quote Post



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

 


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


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