评估GNAT 2012中裸机的内存使用情况

时间:2015-07-30 14:38:36

标签: memory ada gnat bare-metal

我已经安装了GNAT 2012 for Bare Boards并调整了为STM32F4XX(发现板)发布的sfp运行时(ravenscar配置文件),以将其用于STM32F2XX微控制器。修改后的SFP运行时工作,它已经与应用程序,库和一些驱动程序集成:用Ada编写的UART,SPI和DMA,它工作正常。

唯一的问题是编译器已开始抱怨SRAM。更具体地说,“。bss”部分被“x”个字节溢出。

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

提前感谢您的意见! :)

1 个答案:

答案 0 :(得分:6)

我在2014年底才开始使用MCU,我有2014年和2014年。 2015年发布。 AdaCore demo_ledss-taskin.adb中使用了大约15kb BSS,其中10k是主程序的辅助堆栈,在s-secsta.ads中以Default_Secondary_Stack_Size的值配置。

您需要辅助堆栈来处理返回不定类型值的函数(例如,String)。我认为你不太可能在你的主程序中这样做,而且你不太可能需要这么多。

主程序也有一个堆栈大小,在链接器脚本(_DEFAULT_STACK_SIZE)中设置的4kb也相当大:

__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,但这里可能会有一些东西可以获得。

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

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

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