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

 
 
> heap_5.c, функция vPortFree() : клинит во время configASSERT( pxLink->pxNextFreeBlock == NULL ), вызывается из vQueueDelete()
Ruslan1
сообщение Aug 19 2016, 17:18
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



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

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 не влезал, может что-то не так сделал...
Go to the top of the page
 
+Quote Post



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

 


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


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