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