Eli*_*eth 3 memory ada bare-metal gnat
我已经安装了GNAT 2012 for Bare Boards并调整了为STM32F4XX(发现板)发布的sfp运行时(ravenscar配置文件),以将其用于STM32F2XX微控制器.修改后的SFP运行时工作,它已经与应用程序,库和一些驱动程序集成:UART,SPI和DMA也用Ada编写,它工作正常.
唯一的问题是编译器已开始抱怨SRAM.更具体地说,".bss"部分被"x"个字节溢出.
为了公平比较,我们有一个类似的项目(应用程序,库和驱动程序)用C语言在相同的微控制器上运行,我们可以看到(内存映射)内存使用率几乎是内存的一半(STM32F2XX:128 Kb RAM) .所以我想知道ADA是否需要比C运行更多的内存是否正常?
提前感谢您的意见!:)
我在2014年底才开始使用MCU,我有2014年和2015年的版本.AdaCore demo_leds使用了大约15kb的BSS,其中10k是主程序的辅助堆栈,在其中s-taskin.adb配置s-secsta.ads了值Default_Secondary_Stack_Size.
您需要辅助堆栈来处理返回不定类型值的函数(例如,String).我认为你在主程序中不太可能需要这样做,而且你不太可能需要这么多.
主程序也有一个堆栈大小,它在4kb时相当大,在链接器脚本(_DEFAULT_STACK_SIZE)中设置:
__stack_start = .;
. += DEFINED (_STACK_SIZE) ? _STACK_SIZE : _DEFAULT_STACK_SIZE;
. = ALIGN(0x8);
__stack_end = .;
Run Code Online (Sandbox Code Playgroud)
我不知道你是怎么设置的_STACK_SIZE.
就在这个堆栈声明之前,有一个中断堆栈的部分:
__interrupt_stack_start = .;
*(.interrupt_stacks)
. = ALIGN(0x8);
__interrupt_stack_end = .;
Run Code Online (Sandbox Code Playgroud)
我不知道如何设置中断堆栈,我一直在使用FreeRTOS处理我自己的ARTS,但这里可能会有一些东西可以获得.
每个任务都有自己的辅助堆栈,作为主堆栈的一部分分配; 比例由Sec_Stack_Percentagein 给出,在s-parame.ads我的版本中设置为10%(误导性评论约为25%!).
任务默认堆栈大小也设置s-parame.ads为4kb.您始终可以使用pragma Storage_Size(ARM J.15.4)指定自己的.虽然如果从堆中分配这些,你会得到运行时错误,而不是链接时错误.
GNAT GPL 2015 arm-eabi版本支持-Og,在尝试保持变量可供调试时提供良好的空间性能.当然,这主要影响代码大小,因此不太可能帮助解决数据大小问题.
| 归档时间: |
|
| 查看次数: |
212 次 |
| 最近记录: |