|
|
  |
Работа с кучей |
|
|
|
Mar 12 2012, 10:26
|

Частый гость
 
Группа: Свой
Сообщений: 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 корректный, по нему лежат данные верного куска памяти). Куда копать?
--------------------
Руслан
|
|
|
|
|
Mar 12 2012, 12:37
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Mar 20 2012, 12:17
|

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

|
Ну представте (для примера), что в основном цикле работает вызов free(), в этот момент дёргается прерывание, и начинает выполнять malloc() - если нет механизма обеспечение "атомарности" для данных функций - будет каша, а если есть - всё тупо повиснет (если, конечно, "атомарность" не поддержана, до кучи, отключением прерываний  ). Предлагаю заранее выделить кольцевую цепочку буферов.
|
|
|
|
|
Mar 20 2012, 16:36
|

Частый гость
 
Группа: Свой
Сообщений: 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");
--------------------
Руслан
|
|
|
|
|
Mar 21 2012, 01:49
|

Частый гость
 
Группа: Свой
Сообщений: 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
--------------------
Руслан
|
|
|
|
|
Mar 21 2012, 03:52
|
Участник

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

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

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

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