Ситуация такая. Программа зависает либо в процедуре void vPortFree( void *pv ) в
Цитата
prvInsertBlockIntoFreeList( ( ( xBlockLink * ) pxLink ) );
,либо в процедуре void *pvPortMalloc( size_t xWantedSize ) в цикле
Цитата
while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock ) )
{
pxPreviousBlock = pxBlock;
pxBlock = pxBlock->pxNextFreeBlock;
}
{
pxPreviousBlock = pxBlock;
pxBlock = pxBlock->pxNextFreeBlock;
}
Программа сделана так: в нескольких задачах суется в очередь(элементы очереди - это указатели) ссылка на некую структуру. Эта структура перед занесением в очередь создается с помощью pvPortMalloc.
Если очередь заполнена, то сразу же в этой задаче эта структура освобождает память с помощью vPortFree(void *pv).
Выглядит так,например:
Цитата
pxTestTaskSend = (xSendCadrStruct*)pvPortMalloc(sizeof(xSendCadrStruct));
if (pxTestTaskSend == (xSendCadrStruct*)NULL) GotoGlobalCycleProcedure();
pxTestTaskSend->num = 0xFE;
pxTestTaskSend->ulCnt = 0;
pxTestTaskSend->ulData = (unsigned portCHAR*)pxBufferStat;
xResult = xQueueSendToBack(xSendCadrQueue, (void*)&pxTestTaskSend, 0);
if (xResult == errQUEUE_FULL) vPortFree(pxTestTaskSend);
if (pxTestTaskSend == (xSendCadrStruct*)NULL) GotoGlobalCycleProcedure();
pxTestTaskSend->num = 0xFE;
pxTestTaskSend->ulCnt = 0;
pxTestTaskSend->ulData = (unsigned portCHAR*)pxBufferStat;
xResult = xQueueSendToBack(xSendCadrQueue, (void*)&pxTestTaskSend, 0);
if (xResult == errQUEUE_FULL) vPortFree(pxTestTaskSend);
Если прошло все нормально, то в задаче, которая берет из этой очереди элементы, после разборки данных структуры, уничтожает выделенную память для этой структуры, т.е.
Цитата
xSendCadrStruct *xSendCadr;
for (;;){
xQueueReceive(xSendCadrQueue, &xSendCadr, portMAX_DELAY);
/**/
....... разбор структуры ......
switch (xSendCadr->num){
................
};
/**/
vPortFree(xSendCadr)
};
for (;;){
xQueueReceive(xSendCadrQueue, &xSendCadr, portMAX_DELAY);
/**/
....... разбор структуры ......
switch (xSendCadr->num){
................
};
/**/
vPortFree(xSendCadr)
};
Вроде как все должно работать: в одном месте выделяется память, в другом - освобождается...
По вашему, где мог ошибиться?
Подскажите способы/наработки, как быстрее и эффективнее найти причину глюка.
PS. В прерываниях не использую void vPortFree( void *pv ) и void *pvPortMalloc( size_t xWantedSize ).