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();
}
}
}
{
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 );
{
{ ( uint8_t * ) 0x20020000UL, 0x00010000 },
{ ( uint8_t * ) 0xC0000000UL, 0x00700000 },
{ NULL, 0 }
};
vPortDefineHeapRegions( xHeapRegions );
Буду благодарен за любые идеи. Раньше глубоко в менеджемент памяти FreeRTOS не влезал, может что-то не так сделал...