FreeRTOS 只有malloc
and free
,没有calloc
and realloc
。我需要它realloc
并且我尝试自己实现它。这里一切都好吗?内存管理模块本身可以在这里找到。
void *pvPortRealloc(void *ptr, size_t s)
{
uint8_t *puc = ( uint8_t * ) ptr;
BlockLink_t *pxLink;
void *newBlock;
if (ptr != NULL)
{
puc -= heapSTRUCT_SIZE;
pxLink = (void*) puc;
vTaskSuspendAll();
{
newBlock = pvPortMalloc(s);
memcpy(newBlock, ptr, pxLink->xBlockSize);
vPortFree(ptr);
}
xTaskResumeAll();
return newBlock;
}
return NULL;
}
这是 AnT 的评论后创建的新版本。
void *pvPortRealloc(void *ptr, size_t s)
{
uint8_t *puc = ( uint8_t * ) ptr;
BlockLink_t *pxLink;
void *newBlock;
extern void memcpy( void*, void*, size_t );
size_t blockSize;
if (ptr == NULL)
{
newBlock = pvPortMalloc(s);
}
else
{
puc -= heapSTRUCT_SIZE;
pxLink = (void*) puc;
blockSize = pxLink->xBlockSize - heapSTRUCT_SIZE;
if (s == 0)
{
newBlock = NULL;
}
else if (s > blockSize)
{
vTaskSuspendAll();
{
newBlock = pvPortMalloc(s);
if (newBlock != NULL)
{
memcpy(newBlock, ptr, blockSize);
vPortFree(ptr);
}
}
xTaskResumeAll();
}
else //s < blockSize
{
vTaskSuspendAll();
{
size_t newBlockSize = s + heapSTRUCT_SIZE + ( portBYTE_ALIGNMENT - ( s & portBYTE_ALIGNMENT_MASK ) );
//if right segment is to few, do nothing
if (pxLink->xBlockSize - newBlockSize > heapSTRUCT_SIZE)
{
//split current block
pxLink->xBlockSize = newBlockSize;
BlockLink_t *blockToFree = (void*)((uint8_t*)pxLink + pxLink->xBlockSize);
blockToFree->xBlockSize = blockSize + heapSTRUCT_SIZE - pxLink->xBlockSize;
//free second part
prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) blockToFree ) );
xFreeBytesRemaining += blockToFree->xBlockSize;
}
newBlock = ptr;
}
xTaskResumeAll();
}
}
return newBlock;
}
令人惊讶的是,
realloc
如果空指针进入输入,您的立即返回空指针。这已经是错误的了。标准realloc(NULL, size)
的应该像malloc(size)
.它
s
可以小于原始大小的支票在哪里?你从哪里得到的想法,你可以接受它并像那样做?
(变体 2)当请求零尺寸时,标准尺寸
realloc
具有实现定义的行为和一组指定的选项。在您的情况下,如果它0
进入pvPortMalloc
,它将pvPortMalloc
返回一个空指针。你还没有准备好。内存分配失败的处理在哪里?
修复后:
realloc
当使用大小调用时,0
标准realloc
不保证旧内存将被释放(这在标准中没有明确说明,但cppreference.com声明标准应该以这种方式解释)。您的实施正式适合这种行为。但也许释放旧内存块并返回空指针会更优雅。也许...