2017-09-20 5 views
0

Ich versuche das Speicherzuordnungsschema 1 im freeRTOS zu verstehen.FreeRTOS-Speicherverwaltungsschema 1 - Hilfe zum Verständnis der Speicherausrichtung anfordern

In dieser Funktion wird der folgende Code verwendet.

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))); 
     } 

Ich arbeite am Arm Kortex m3 MCU. Also

portPOINTER_SIZE_TYPE defined as uint32_t 
portBYTE_ALIGNMENT defined as 8 
portBYTE_ALIGNMENT_MASK defined as 0x0007 

Warum können wir nicht nur pucAlignedHeap = & ucHeap; ?

Danke für Ihre Antworten.

Antwort

0

Alle FreeRTOS heap allocation schemes tun dies, weil der C-Standard erfordert die Startadresse dynamisch zugewiesenen Speicher an den Anforderungen des Prozessors ausgerichtet werden. Der von Ihnen gepostete Code führt die Ausrichtung aus. Viel Code geht davon aus, dass malloc() so ausgerichtet ist, dass es Elemente speichert, die ausgerichtet werden müssen, ohne zusätzliche Prüfungen durchführen zu müssen, oder mehr RAM zuweisen müssen, als erforderlich ist, um selbst eine ausgerichtete Adresse abzuschneiden.

Verwandte Themen