ZHCU820Y September 2004 – June 2021
MSP430 编译器随附的运行时支持库包含几个函数(例如 malloc、calloc 和 realloc),这些函数允许您在运行时为变量动态地分配内存。
内存是从 .sysmem 段中定义的全局池(或堆)分配的。可以在链接器命令中使用heap_size=size 选项来更改 .sysmem 段的大小。链接器还会创建一个全局符号 __TI_SYSMEM_SIZE,并为其分配一个等于堆大小的值(以字节为单位)。默认大小为 128 字节。有关 --heap_size 选项的更多信息,请参阅《MSP430 汇编语言工具用户指南》 中的链接器说明一章。
如果您使用任何 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));
当从堆进行分配时,请确保堆的大小足够满足分配要求。这在分配可变长度数组时尤为重要。