Ruslan1 17 19 августа, 2016 Опубликовано 19 августа, 2016 · Жалоба Здравствуйте! 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 не влезал, может что-то не так сделал... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 19 августа, 2016 Опубликовано 19 августа, 2016 · Жалоба Разобрался. Как обычно, никаких чудес: перед сегментом памяти, выделенным этой очереди, была структура, при записи в которую происходил выход за границу выделенной памяти. Затиралась аккуратно только первая переменная заголовка, используемого менеджером памяти (там 4 байта должны быть нулями). То есть сама очередь и переменная "длина используемого выделенного блока памяти" не портились, портился только этот маркер. А ассерт наступал только при попытке менеджера использовать этот хедер во время освобождения блока. (это heap_5). В-общем, извиняюсь за беспокойство. Fixed. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться