FreeRTOS 增加Realloc内存分配函数

FreeRTOS 增加Realloc内存分配函数
经测试,稳定可用

// ******************************************************************************************************
// *                                                                                                    *
// * pvPortRealloc                                                                 						*
// *                                                                                                    *
// * Funzione per riallocare dimensione memoria in heap region											*
// *                                                                                                    *
// * Parameter : (void *) Pointer to a memory block previously allocated with malloc, calloc or realloc *
// *			 (size_t) Number of byte to resize section                                              *
// *                                                                                                    *
// * Return    : (void *) Pointer to allocate region, NULL if error on allocation                       *
// *                                                                                                    *
// ******************************************************************************************************

void *pvPortRealloc( void *pv, size_t xWantedSize )
{
	// Local variable	
	size_t move_size;
	size_t block_size;
	BlockLink_t *pxLink;
	void *pvReturn = NULL;
	uint8_t *puc = ( uint8_t * ) pv;

	// Se NULL, exit
	if (xWantedSize > 0)
	{
		// Controllo se buffer valido
		if (pv != NULL)
		{
			// The memory being freed will have an BlockLink_t structure immediately before it.
			puc -= xHeapStructSize;

			// This casting is to keep the compiler from issuing warnings.
			pxLink = ( void * ) puc;

			// Check allocate block
			if ((pxLink->xBlockSize & xBlockAllocatedBit) != 0)
			{
				// The block is being returned to the heap - it is no longer allocated.
				block_size = (pxLink->xBlockSize & ~xBlockAllocatedBit) - xHeapStructSize;

				// Alloco nuovo spazio di memoria
				pvReturn = pvPortCalloc(1, xWantedSize);

				// Check creation
				if (pvReturn != NULL)
				{
					// Sposta soltanto fino al limite
					if (block_size < xWantedSize)
					{
						// Il nuovo posto disponibile è inferiore
						move_size = block_size;
					}
					else
					{
						// Il nuovo posto disponibile è maggiore
						move_size = xWantedSize;
					}

					// Copio dati nel nuovo spazio di memoria
					memcpy(pvReturn, pv, move_size);

					// Libero vecchio blocco di memoria
					vPortFree(pv);
				}
			}
			else
			{
				// Puntatore nullo, alloca memoria come fosse nuova
				pvReturn = pvPortCalloc(1, xWantedSize);
			}
		}
		else
		{
			// Puntatore nullo, alloca memoria come fosse nuova
			pvReturn = pvPortCalloc(1, xWantedSize);
		}
	}
	else
	{
		// Exit without memory block
		if(pv!=NULL)
			vPortFree(pv);
		pvReturn = NULL;
	}

	// Exit with memory block
	return pvReturn;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值