Перейти к содержанию
    

heap_5.c, функция vPortFree() : клинит во время configASSERT( pxLink->pxNextFreeBlock == NULL )

Здравствуйте!

 

FreeRTOS версия 8.2.1

heap_5.c

 

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

 

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

 

функция небольшая, приведу целиком

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 не влезал, может что-то не так сделал...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

В-общем, извиняюсь за беспокойство. Fixed.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...