完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
程序在裸机情况下, 我用的是 arm-none-eabi-gcc 工具链, 里面的 malloc 是 Newlib-Nano 实现的, 现在的问题是, 去哪里设定 malloc的最大 stack 的大小? 是不是在 startup_M451Series.S 里修改?
|
|
相关推荐
1个回答
|
|
在使用 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 的大小其实是程序所设定的堆的大小。 |
|
|
|
只有小组成员才能发言,加入小组>>
791 浏览 0 评论
1151 浏览 1 评论
2527 浏览 5 评论
2860 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2710 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1070浏览 3评论
193浏览 2评论
455浏览 2评论
368浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
453浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 14:04 , Processed in 1.248908 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号