Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: malloc в iar 4.20A
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
DenF1
Здравствуйте!

Странное поведение функции malloc обнаружилось. Иногда она возвращает указатель на уже выделенную область, хотя область эту является занятой. Складывается впечатление, что рушится системная информация о цепочке выделенных блоков, в результате ошибочной записи по кривому указателю. Где сидит инфа о выделенных блоках? Кто-нить сталкивался с чем-то подобным?
SasaVitebsk
Цитата(DenF1 @ May 4 2007, 14:23) *
Здравствуйте!

Странное поведение функции malloc обнаружилось. Иногда она возвращает указатель на уже выделенную область, хотя область эту является занятой. Складывается впечатление, что рушится системная информация о цепочке выделенных блоков, в результате ошибочной записи по кривому указателю. Где сидит инфа о выделенных блоках? Кто-нить сталкивался с чем-то подобным?


Это врядли. Но по своему проекту заметил одну интересную особенность хотя и понятную (интересную для человека). IAR сегменты располагает как придётся. Человек обычно под кучу край озу выделяет, а компилятор в середине озу. Таким образом если совершенно другой ваш сегмент (например стек) вылазит за отведённые (вами же) пределы, то компилятор об этом знать не будет (не статическое распределение памяти а динамическое её потребление. Тем же стеком к примеру). Вот и получится что malloc выделяет занятую память (согласно рамкам установленным компилятором под сегмент она свободна.)

Для того чтобы избежать такой ошибки я чётко определяю реальные размеры стека и прибавляю запас. После чего распределяю оставшуюся кучу.
zltigo
Цитата(SasaVitebsk @ May 4 2007, 15:14) *
После чего распределяю оставшуюся кучу.

Менеджер памяти штука не сложная, посему и самому написать под себя можно.
В "родных" категорически не устраивало:
1. Статическое указание размера памяти под heap - единственное разумное - всю оставшуюся память.
2. Часто встречается наипростейший вариант, когда есть только список свободных блоков и посмотреть кто чем и сколько занят невозможно
3. Часто никаких, даже минимальных (например слияние двух свободных) мер по уменьшению дефрагментации не предпринимается.
shamray
malloc может сбоить если его вызывать во вложенных в прерываниях - у меня такое было.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.