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

 
 
 
Reply to this topicStart new topic
> Работа с кучей
athlon64
сообщение Mar 12 2012, 10:26
Сообщение #1


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

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Процессор AT91sam7x512, IAR 6.30
В проекте использую динамическую память. Пробовал использовать библиотечные функции (malloc, free) и менеджер памяти BGET.
Суть проблемы в том, что контроллер периодически (~раз в час уходит в Abort Handler). Адрес в регистре LR указывает на инструкции, выполняющие строку
Код
b->bh.bsize += bn->bh.bsize;
библиотеки BGET (процедура brel).
По состоянию переменных также понятно, что затык происходит при попытке освободить память (указатель, передающийся процедуре brel корректный, по нему лежат данные верного куска памяти).
Куда копать?


--------------------
Руслан
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 12 2012, 12:37
Сообщение #2


Гуру
******

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



QUOTE (athlon64 @ Mar 12 2012, 12:26) *
(указатель, передающийся процедуре brel корректный, по нему лежат данные верного куска памяти).
Куда копать?
Вариантов три:
1) Освобождаете какой-то участок памяти дважды
2) Какая-то процедура, записывая в предыдущий участок, выходит за его пределы и портит служебную информацию следующего блока
3) Нехватка стека - стек налезает на кучу и портит ее.


--------------------
На любой вопрос даю любой ответ
"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
athlon64
сообщение Mar 20 2012, 12:00
Сообщение #3


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

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Такой вопрос.
Функции malloc/realloc/free у меня используются как в основной программе, так и в обработчиках прерываний. Допустимо ли это?
Т.е. например при получении пакета я в обработчике прерывания выделяю память под пакет и копирую его туда. обрабатываю его в основной программе, где после копирования ответа в выходной буфер, освобождаю память

пс: Попробовал сделать в цикле основной программы выделение и последующее освобождение блока памяти. То же самое (с другим блоком памяти) в обработчике 1 мс таймера. В результате процессор переходит в __exit, после чего сбрасывается вачдогом.

Сообщение отредактировал athlon64 - Mar 20 2012, 12:05


--------------------
Руслан
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 20 2012, 12:11
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(athlon64 @ Mar 20 2012, 16:00) *
Допустимо ли это?

В случае BGET - нет. Самый простой вариант обхода проблемы - запрещать прерывания во время вызовов библиотеки.
Go to the top of the page
 
+Quote Post
athlon64
сообщение Mar 20 2012, 12:16
Сообщение #5


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

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



А в случае менеджера памяти библиотеки Си IAR'а?


--------------------
Руслан
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Mar 20 2012, 12:17
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Ну представте (для примера), что в основном цикле работает вызов free(), в этот момент дёргается прерывание, и начинает выполнять malloc() - если нет механизма обеспечение "атомарности" для данных функций - будет каша, а если есть - всё тупо повиснет (если, конечно, "атомарность" не поддержана, до кучи, отключением прерываний wink.gif ).
Предлагаю заранее выделить кольцевую цепочку буферов. sm.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 20 2012, 12:32
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(athlon64 @ Mar 20 2012, 16:16) *
А в случае менеджера памяти библиотеки Си IAR'а?

Смотрите документацию. Например, у RVCT функции кучи так использовать можно.
Go to the top of the page
 
+Quote Post
athlon64
сообщение Mar 20 2012, 16:36
Сообщение #8


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

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Корректно ли будет обрамить функции следующими вставками?
Код
// Запрет прерываний
  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");



--------------------
Руслан
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 20 2012, 17:16
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Если процессор находится в привилегированном режиме, то корректно. Только лучше intrinsic'и использовать, а не вставки.
Go to the top of the page
 
+Quote Post
athlon64
сообщение Mar 21 2012, 01:49
Сообщение #10


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

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Цитата(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-бит в обработчике прерывания?

Сообщение отредактировал athlon64 - Mar 21 2012, 02:14


--------------------
Руслан
Go to the top of the page
 
+Quote Post
microsin
сообщение Mar 21 2012, 03:52
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 27-11-08
Пользователь №: 41 999



Читаю пост и за голову хватаюсь. Калёки/малёки в обработчике прерывания? Запрет прерываний? До чего только не додумается воспаленный разум программиста... RabidRabbit хороший совет дал - кольцевой буфер спасёт великого комбинатора.

Работа с кольцевым буфером.
Go to the top of the page
 
+Quote Post
athlon64
сообщение Mar 21 2012, 08:24
Сообщение #12


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

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



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

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

К сожалению простым кольцевым буфером в данном проекте не обойтись, куча используется ещё кучей процедур.
ARM в режиме SYSTEM, asm вставки вроде дали положительный эффект, точно будет известно после тестирования.


--------------------
Руслан
Go to the top of the page
 
+Quote Post

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

 


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


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