有一段freerots里面的代码,第3,4,5,7行我没看明白,有朋友能帮忙一下吗?尤其是那个“@”。
/* Allocate the memory for the heap. */
#if configUSE_HEAP_SECTION_NAME && configCOMPILER==configCOMPILER_ARM_IAR /* << EST */
#pragma language=extended
#pragma location = configHEAP_SECTION_NAME_STRING
static uint8_t ucHeap[configTOTAL_HEAP_SIZE] @ configHEAP_SECTION_NAME_STRING;
#elif configUSE_HEAP_SECTION_NAME
static uint8_t __attribute__((section (configHEAP_SECTION_NAME_STRING))) ucHeap[configTOTAL_HEAP_SIZE];
#else
static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
#endif
首先 #if 的條件編譯就不說了。
#pragma
和__atribute__
都是編譯器的預處理指令。#pragma location
和後面一句是IAR
編譯器有關的預處理指令,這兩句的目的是把陣列ucHeap
放到指定的一個位址。基本文法就是,#pragam location=地址
和变量 @ 地址
具體文法請見http://ftp.iar.se/WWWfiles/arm/webic/doc/EWARM_DevelopmentGuide.ENU.pdf “Controlling data and function placement in memory”(218頁)那一節__attribute__ section
這句話的意思是把這個陣列放到指定的段落中。這個屬於 GNU 編譯器的編譯屬性。所以這段程式碼的意思是,定義一個陣列 ucHeap 然後根據配置決定是否指定這個陣列所在的位址
這應該都是編譯器的擴充功能和語法,尤其是那個#pragma和__attribute__,查一下這是什麼平台的程式碼,用的什麼編譯器,然後去查編譯器文檔吧
就是可以把變數集中放到一個段。例如,經常存取的資料放一起,那麼快取會更加有效。