我试图理解freeRTOS中的内存分配方案1。
在此功能中,使用以下代码。
static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
static uint8_t *pucAlignedHeap = NULL;
if( pucAlignedHeap == NULL )
{
/* Ensure the heap starts on a correctly aligned boundary. */
pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) &ucHeap[ portBYTE_ALIGNMENT ] ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) );
}
我正在做手臂皮质m3 mcu。所以
portPOINTER_SIZE_TYPE defined as uint32_t
portBYTE_ALIGNMENT defined as 8
portBYTE_ALIGNMENT_MASK defined as 0x0007
为什么我们不能只使用pucAlignedHeap =& ucHeap; ?
感谢您的回答。
答案 0 :(得分:1)
所有FreeRTOS heap allocation schemes都这样做,因为C标准要求动态分配的内存的起始地址与处理器的要求保持一致。您发布的代码正在进行对齐。许多代码假定malloc()是对齐的,因此使用它来存储必须对齐的项目而不必执行额外的检查,或者必须分配比所需的RAM更多的RAM,以便自己截断到对齐的地址。