FreeRTOS内存管理方案1 - 请求帮助以了解内存对齐

时间:2017-09-20 20:24:11

标签: memory-management arm memory-alignment freertos cortex-m

我试图理解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; ?

感谢您的回答。

1 个答案:

答案 0 :(得分:1)

所有FreeRTOS heap allocation schemes都这样做,因为C标准要求动态分配的内存的起始地址与处理器的要求保持一致。您发布的代码正在进行对齐。许多代码假定malloc()是对齐的,因此使用它来存储必须对齐的项目而不必执行额外的检查,或者必须分配比所需的RAM更多的RAM,以便自己截断到对齐的地址。