Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с кучей
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
athlon64
Процессор AT91sam7x512, IAR 6.30
В проекте использую динамическую память. Пробовал использовать библиотечные функции (malloc, free) и менеджер памяти BGET.
Суть проблемы в том, что контроллер периодически (~раз в час уходит в Abort Handler). Адрес в регистре LR указывает на инструкции, выполняющие строку
Код
b->bh.bsize += bn->bh.bsize;
библиотеки BGET (процедура brel).
По состоянию переменных также понятно, что затык происходит при попытке освободить память (указатель, передающийся процедуре brel корректный, по нему лежат данные верного куска памяти).
Куда копать?
Сергей Борщ
QUOTE (athlon64 @ Mar 12 2012, 12:26) *
(указатель, передающийся процедуре brel корректный, по нему лежат данные верного куска памяти).
Куда копать?
Вариантов три:
1) Освобождаете какой-то участок памяти дважды
2) Какая-то процедура, записывая в предыдущий участок, выходит за его пределы и портит служебную информацию следующего блока
3) Нехватка стека - стек налезает на кучу и портит ее.
athlon64
Такой вопрос.
Функции malloc/realloc/free у меня используются как в основной программе, так и в обработчиках прерываний. Допустимо ли это?
Т.е. например при получении пакета я в обработчике прерывания выделяю память под пакет и копирую его туда. обрабатываю его в основной программе, где после копирования ответа в выходной буфер, освобождаю память

пс: Попробовал сделать в цикле основной программы выделение и последующее освобождение блока памяти. То же самое (с другим блоком памяти) в обработчике 1 мс таймера. В результате процессор переходит в __exit, после чего сбрасывается вачдогом.
aaarrr
Цитата(athlon64 @ Mar 20 2012, 16:00) *
Допустимо ли это?

В случае BGET - нет. Самый простой вариант обхода проблемы - запрещать прерывания во время вызовов библиотеки.
athlon64
А в случае менеджера памяти библиотеки Си IAR'а?
RabidRabbit
Ну представте (для примера), что в основном цикле работает вызов free(), в этот момент дёргается прерывание, и начинает выполнять malloc() - если нет механизма обеспечение "атомарности" для данных функций - будет каша, а если есть - всё тупо повиснет (если, конечно, "атомарность" не поддержана, до кучи, отключением прерываний wink.gif ).
Предлагаю заранее выделить кольцевую цепочку буферов. sm.gif
aaarrr
Цитата(athlon64 @ Mar 20 2012, 16:16) *
А в случае менеджера памяти библиотеки Си IAR'а?

Смотрите документацию. Например, у RVCT функции кучи так использовать можно.
athlon64
Корректно ли будет обрамить функции следующими вставками?
Код
// Запрет прерываний
  asm("MRS R0, CPSR");
  asm("ORR R0, R0, #192");
  asm("MSR CPSR_c, R0");

// Разрешение прерываний
  asm("MRS R0, CPSR");
  asm("BIC R0, R0, #192");
  asm("MSR CPSR_c, R0");

aaarrr
Если процессор находится в привилегированном режиме, то корректно. Только лучше intrinsic'и использовать, а не вставки.
athlon64
Цитата(aaarrr @ Mar 20 2012, 23:16) *
Если процессор находится в привилегированном режиме, то корректно. Только лучше intrinsic'и использовать, а не вставки.

Ну эти вставки и взяты из дизассемблера яровских intrinsic (__enable interrupt, __disable interrupt).

Могу добавив в cstartup следующего кода перевести процессор в режим SYSTEM? Чем чревато постоянное нахождение в SYSTEM-режиме?
Код
mrs     r0,cpsr                        ; Original PSR value
bic     r0,r0,#MODE_BITS                  ; Clear the mode bits
orr     r0,r0,#SYS_MODE                ; Set System mode
msr     cpsr_c,r0                         ; Change the mode


Хотелось бы найти способ отключения обработки всех прерываний, не привязанный к IAR, при этом не задержав обработку прерываний на время более чем время нахождени в malloc/free. Или лучше отключать/включать прерывания от всей периферии по отдельности?
Не приведёт ли манипуляция с I-битом к негативным последствиям при попытке снять I-бит в обработчике прерывания?
microsin
Читаю пост и за голову хватаюсь. Калёки/малёки в обработчике прерывания? Запрет прерываний? До чего только не додумается воспаленный разум программиста... RabidRabbit хороший совет дал - кольцевой буфер спасёт великого комбинатора.

Работа с кольцевым буфером.
athlon64
Цитата(microsin @ Mar 21 2012, 09:52) *
Читаю пост и за голову хватаюсь. Калёки/малёки в обработчике прерывания? Запрет прерываний? До чего только не додумается воспаленный разум программиста... RabidRabbit хороший совет дал - кольцевой буфер спасёт великого комбинатора.

Работа с кольцевым буфером.

К сожалению простым кольцевым буфером в данном проекте не обойтись, куча используется ещё кучей процедур.
ARM в режиме SYSTEM, asm вставки вроде дали положительный эффект, точно будет известно после тестирования.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.