gpt4 book ai didi

memory - 评估 GNAT 2012 中裸板的内存使用情况

转载 作者:行者123 更新时间:2023-12-01 10:38:43 24 4
gpt4 key购买 nike

我已经为裸板安装了 GNAT 2012,并调整了为 STM32F4XX(发现板)发布的 sfp 运行时(ravenscar 配置文件)以将其用于 STM32F2XX 微 Controller 。修改后的 SFP 运行时可以运行,并且已与应用程序、库和一些驱动程序集成:UART、SPI 和 DMA 也用 Ada 编写,并且运行良好。

唯一的问题是编译器开始提示 SRAM。更具体地说,“.bss”部分溢出了“x”个字节。

为了公平比较,我们有一个用 C 编写的类似项目(应用程序、库和驱动程序)运行在同一个微 Controller 上,我们可以看到(内存映射)内存使用量几乎是内存的一半(STM32F2XX:128 KB 内存)。所以我想知道 ADA 需要比 C 运行那么多内存是否正常?

预先感谢您的输入! :)

最佳答案

我在 2014 年底才开始使用 MCU,我有 2014 年和 2015 年的版本。 AdaCore demo_leds使用了大约15kb的BSS,其中10k是主程序的secondary stack,在s-taskin.adb中,配置在s-secsta.adsDefault_Secondary_Stack_Size 的值决定。

您需要辅助堆栈来处理返回不确定类型值的函数(例如,String)。我认为您不太可能需要在主程序中执行此操作,更不可能需要那么多。

主程序也有一个堆栈大小,也相当大,为 4kb,在链接描述文件中设置 (_DEFAULT_STACK_SIZE):

__stack_start = .;
. += DEFINED (_STACK_SIZE) ? _STACK_SIZE : _DEFAULT_STACK_SIZE;
. = ALIGN(0x8);
__stack_end = .;

我不知道你是如何设置 _STACK_SIZE 的。

就在这个堆栈声明之前,有一个中断堆栈部分:

__interrupt_stack_start = .;
*(.interrupt_stacks)
. = ALIGN(0x8);
__interrupt_stack_end = .;

我不知道中断堆栈是如何设置的,我一直在使用 FreeRTOS 开发自己的 ARTS,但这里可能会有一些收获。

每个任务都有自己的辅助堆栈,作为主堆栈的一部分进行分配;该比例由 s-parame.ads 中的 Sec_Stack_Percentage 给出,在我的版本中设置为 10%(误导性评论约为 25%!)。

任务默认堆栈大小也在 s-parame.ads 中设置为 4kb。您始终可以使用 pragma Storage_Size ( ARM J.15.4 ) 指定您自己的。尽管如果这些是从堆中分配的,你会得到一个运行时错误而不是链接时错误。

GNAT GPL 2015 arm-eabi 版本支持 -Og,它提供了良好的空间性能,同时尝试保持变量可访问以进行调试。当然,这主要影响代码大小,因此不太可能帮助您解决数据大小问题。

关于memory - 评估 GNAT 2012 中裸板的内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31726808/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com