在使用 Newlib-Nano 的情况下,通常可以通过在 linker script 文件中定义堆的起始地址和大小来控制 malloc 函数的最大 stack 大小。在 Arm Cortex-M 系列中,堆的大小通常由 _estack 指定,这是栈的顶部地址。
例如,在使用 M451 系列芯片时,链接脚本文件通常命名为 M451.ld。若要将堆的区域配置为从 0x20008000 开始的 16K 字节大小,则需要在链接脚本中添加以下内容:
```
/* Heap section */
.heap :
{
__heap_start__ = ALIGN(ORIGIN(RAM)+LENGTH(RAM));
__heap_end__ = __heap_start__ + 16K;
__end__ = __heap_end__;
PROVIDE(heap_start = __heap_start__);
PROVIDE(heap_end = __heap_end__);
. = __heap_end__;
} >RAM
```
在此例中,堆的起始地址为 RAM + 长度(即 0x20000000 + 96K),而堆的末尾地址为前面定义的 _heap_start + 16K。注意,这里定义了两个符号__heap_start__和 __heap_end__,可以在应用程序代码中使用这些符号来确定堆的实际大小和位置。
一旦链接脚本文件被修改,就需要在编译时使用这个脚本来生成可执行文件。此处使用的编译器是 Arm-none-eabi-gcc,生成链接文件的命令可能类似于以下内容:
```
arm-none-eabi-gcc main.c -T M451.ld -nostdlib -o main.elf
```
注意,使用 -nostdlib 选项使得链接器不链接标准库,因为这样可以避免默认使用的标准库(例如GNU libc)包含的额外标记和符号可能会影响布局和大小。
需要确定所分配给堆的内存大小是否能够满足应用程序需要的内存需求。如果发现不足,则还需要检查 MSP 和 PSP 的设置是否正确,因为当在堆栈上分配大量内存时,会将任务栈指针(及其下面的变量)放置在栈空间末端,而堆又会从另一端开始增长。这可能导致堆与任务栈交叉,导致意外的结果,因此需要使用适当的堆栈大小并小心处理内存使用。
但总而言之,最大 stack 的大小其实是程序所设定的堆的大小。
在使用 Newlib-Nano 的情况下,通常可以通过在 linker script 文件中定义堆的起始地址和大小来控制 malloc 函数的最大 stack 大小。在 Arm Cortex-M 系列中,堆的大小通常由 _estack 指定,这是栈的顶部地址。
例如,在使用 M451 系列芯片时,链接脚本文件通常命名为 M451.ld。若要将堆的区域配置为从 0x20008000 开始的 16K 字节大小,则需要在链接脚本中添加以下内容:
```
/* Heap section */
.heap :
{
__heap_start__ = ALIGN(ORIGIN(RAM)+LENGTH(RAM));
__heap_end__ = __heap_start__ + 16K;
__end__ = __heap_end__;
PROVIDE(heap_start = __heap_start__);
PROVIDE(heap_end = __heap_end__);
. = __heap_end__;
} >RAM
```
在此例中,堆的起始地址为 RAM + 长度(即 0x20000000 + 96K),而堆的末尾地址为前面定义的 _heap_start + 16K。注意,这里定义了两个符号__heap_start__和 __heap_end__,可以在应用程序代码中使用这些符号来确定堆的实际大小和位置。
一旦链接脚本文件被修改,就需要在编译时使用这个脚本来生成可执行文件。此处使用的编译器是 Arm-none-eabi-gcc,生成链接文件的命令可能类似于以下内容:
```
arm-none-eabi-gcc main.c -T M451.ld -nostdlib -o main.elf
```
注意,使用 -nostdlib 选项使得链接器不链接标准库,因为这样可以避免默认使用的标准库(例如GNU libc)包含的额外标记和符号可能会影响布局和大小。
需要确定所分配给堆的内存大小是否能够满足应用程序需要的内存需求。如果发现不足,则还需要检查 MSP 和 PSP 的设置是否正确,因为当在堆栈上分配大量内存时,会将任务栈指针(及其下面的变量)放置在栈空间末端,而堆又会从另一端开始增长。这可能导致堆与任务栈交叉,导致意外的结果,因此需要使用适当的堆栈大小并小心处理内存使用。
但总而言之,最大 stack 的大小其实是程序所设定的堆的大小。
举报