Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: heap_5.c, функция vPortFree() : клинит во время configASSERT( pxLink->pxNextFreeBlock == NULL )
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
Ruslan1
Здравствуйте!

FreeRTOS версия 8.2.1
heap_5.c

процессор STM32F429, с внешней DRAM

у меня configASSERT( pxLink->pxNextFreeBlock == NULL ) в функции vPortFree().

функция небольшая, приведу целиком
CODE
void vPortFree( void *pv )
{
uint8_t *puc = ( uint8_t * ) pv;
BlockLink_t *pxLink;

if( pv != NULL )
{
/* The memory being freed will have an BlockLink_t structure immediately
before it. */
puc -= uxHeapStructSize;

/* This casting is to keep the compiler from issuing warnings. */
pxLink = ( void * ) puc;

/* Check the block is actually allocated. */
configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 );
configASSERT( pxLink->pxNextFreeBlock == NULL );

if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 )
{
if( pxLink->pxNextFreeBlock == NULL )
{
/* The block is being returned to the heap - it is no longer
allocated. */
pxLink->xBlockSize &= ~xBlockAllocatedBit;

vTaskSuspendAll();
{
/* Add this block to the list of free blocks. */
xFreeBytesRemaining += pxLink->xBlockSize;
traceFREE( pv, pxLink->xBlockSize );
prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );
}
( void ) xTaskResumeAll();
}
else
{
mtCOVERAGE_TEST_MARKER();
}
}
else
{
mtCOVERAGE_TEST_MARKER();
}
}
}


Update: убрал из текста то, что уже сам понял. Извиняюсь, бред удалил. Пятница, вечер....наверное отдохнуть надо.


Где может быть ошибка, которая проявляется только во время удаления объекта? Кто-то наложил своего в те же ячейки, где менеджер хранит данные о следующем блоке?


некоторые подробности:

Происходит это после вызова функции vQueueDelete().
Удаляемая очередь работает, ничего больше нигде не вылетает в Assert. Проблема возникает только в момент удаления очереди.
Объявлена и используется очередь штатно, без извратов.
Куча тоже штатно объявлена:

Код
  HeapRegion_t xHeapRegions[] =
  {
    { ( uint8_t * ) 0x20020000UL, 0x00010000 },
    { ( uint8_t * ) 0xC0000000UL, 0x00700000 },
    { NULL, 0 }
  };
  vPortDefineHeapRegions( xHeapRegions );


Буду благодарен за любые идеи. Раньше глубоко в менеджемент памяти FreeRTOS не влезал, может что-то не так сделал...
Ruslan1
Разобрался. Как обычно, никаких чудес: перед сегментом памяти, выделенным этой очереди, была структура, при записи в которую происходил выход за границу выделенной памяти. Затиралась аккуратно только первая переменная заголовка, используемого менеджером памяти (там 4 байта должны быть нулями). То есть сама очередь и переменная "длина используемого выделенного блока памяти" не портились, портился только этот маркер. А ассерт наступал только при попытке менеджера использовать этот хедер во время освобождения блока. (это heap_5).

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