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 编译器随附的运行时支持库包含几个函数(例如 malloc、calloc 和 realloc),这些函数允许您在运行时为变量动态地分配存储器。
内存是从 .sysmem 段中定义的全局池(或堆)分配的。可以在链接器命令中使用heap_size=size 选项来更改 .sysmem 段的大小。链接器还会创建一个全局符号 __TI_SYSMEM_SIZE,并为其分配一个等于堆大小的值(以字节为单位)。默认大小为 2048 字节。有关 --heap_size 选项的更多信息,请参阅 ARM 汇编语言工具用户指南 中的链接器说明一章。
如果您使用任何 C I/O 函数,RTS 库会为您访问的每个文件分配一个 I/O 缓冲区。这个缓冲区将比BUFSIZ 大一点,BUFSIZ 在 stdio.h 中定义,默认为 256)。确保为这些缓冲区分配了足够大的堆或使用 setvbuf 将缓冲区更改为静态分配的缓冲区。
动态分配的对象并非采用直接寻址方式(始终使用指针访问),并且存储器池位于单独的段(.sysmem)中。因此,动态存储器池的大小仅受系统中可用存储器大小的限制。为了节省 .bss 段的空间,可以从堆中分配大型数组,而不是将它们定义为全局或静态数组。例如,不是定义如下:
struct big table[100];
而是改用指针并调用 malloc 函数:
struct big *table
table = (struct big *)malloc(100*sizeof(struct big));
当从堆进行分配时,请确保堆的大小足够满足分配要求。在分配可变长度数组时,这一点尤为重要。