我已经安装了GNAT 2012 for Bare Boards,并适应了为STM32F4XX (Discovery board)发布的sfp运行时(ravenscar配置文件),将其用于STM32F2XX微控制器。修改后的SFP运行时工作,它已经集成了一个应用程序,库和一些驱动程序:用Ada编写的UART, SPI和DMA,它工作得很好。
唯一的问题是编译器已经开始抱怨SRAM。更具体地说,"。部分被"x"字节溢出。
为了进行公平的比较,我们有一个用C编写的类似项目(应用程序,库和驱动程序)运行在相同的微控制器上,我们可以看到(内存映射)内存使用量几乎是内存的一半(STM32F2XX: 128 Kb RAM)。所以我想知道ADA是否需要比C多的内存来运行是正常的?
提前感谢您的输入!:)
我在2014年底才开始使用mcu,我有2014 &2015年的版本。AdaCore demo_leds
在s-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,但这里可能有一些东西可以获得。
每个任务都有自己的辅助堆栈,作为其主堆栈的一部分分配;比例由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
,它提供了良好的空间性能,同时试图保持调试时变量的可访问性。当然,这主要影响代码大小,因此不太可能帮助解决数据大小问题。