ZHCUAV8W january 1998 – march 2023 66AK2E05 , 66AK2H06 , 66AK2H12 , 66AK2H14 , AM1705 , AM1707 , AM1802 , AM1806 , AM1808 , AM1810 , AM5K2E04 , OMAP-L132 , OMAP-L137 , OMAP-L138 , SM470R1B1M-HT , TMS470R1A288 , TMS470R1A384 , TMS470R1A64 , TMS470R1B1M , TMS470R1B512 , TMS470R1B768
ARM 編譯器隨附的運行時支持庫包含幾個函數(shù)(例如 malloc、calloc 和 realloc),這些函數(shù)允許您在運行時為變量動態(tài)地分配存儲器。
內(nèi)存是從 .sysmem 段中定義的全局池(或堆)分配的??梢栽阪溄悠髅钪惺褂胔eap_size=size 選項來更改 .sysmem 段的大小。鏈接器還會創(chuàng)建一個全局符號 __TI_SYSMEM_SIZE,并為其分配一個等于堆大小的值(以字節(jié)為單位)。默認大小為 2048 字節(jié)。有關(guān) --heap_size 選項的更多信息,請參閱 ARM 匯編語言工具用戶指南 中的鏈接器說明一章。
如果您使用任何 C I/O 函數(shù),RTS 庫會為您訪問的每個文件分配一個 I/O 緩沖區(qū)。這個緩沖區(qū)將比BUFSIZ 大一點,BUFSIZ 在 stdio.h 中定義,默認為 256)。確保為這些緩沖區(qū)分配了足夠大的堆或使用 setvbuf 將緩沖區(qū)更改為靜態(tài)分配的緩沖區(qū)。
動態(tài)分配的對象并非采用直接尋址方式(始終使用指針訪問),并且存儲器池位于單獨的段(.sysmem)中。因此,動態(tài)存儲器池的大小僅受系統(tǒng)中可用存儲器大小的限制。為了節(jié)省 .bss 段的空間,可以從堆中分配大型數(shù)組,而不是將它們定義為全局或靜態(tài)數(shù)組。例如,不是定義如下:
struct big table[100];而是改用指針并調(diào)用 malloc 函數(shù):
struct big *table
table = (struct big *)malloc(100*sizeof(struct big));當從堆進行分配時,請確保堆的大小足夠滿足分配要求。在分配可變長度數(shù)組時,這一點尤為重要。