【问题标题】:Assessment of Memory usage in GNAT 2012 for Bare Boards评估 GNAT 2012 中裸板的内存使用情况
【发布时间】:2015-07-31 00:27:47
【问题描述】:

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

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

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

提前感谢您的意见! :)

【问题讨论】:

    标签: memory ada gnat bare-metal


    【解决方案1】:

    我在 2014 年底才开始使用 MCU,我有 2014 和 2015 版本。 AdaCoredemo_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 = .;
    

    我不知道你是怎么设置_STACK_SIZE的。

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

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

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

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

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

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

    【讨论】:

    • 关于.interrupt_stacks,这是在s-bbinte.adb中定义的:Interrupt_Stacks : array (CPU, Int_Stack_Id) of Stack_Space; pragma Linker_Section (Interrupt_Stacks, ".interrupt_stacks"); 所以中断堆栈部分已经是30 KB (15 * 2KB)。不过我不知道编译器是否设置了值_STACK_SIZE
    • 你如何计算.bss内存部分?加载 demo_leds 程序后有一条消息显示.text.data.rodata 部分的大小,但.bss
    • 对于.bss,试试arm-eabi-size; SYSV 选项 (-A) 提供更多信息。
    • 鉴于在 Cortex MCU 上 NVIC 应该允许嵌套中断,AdaCore 为每个中断优先级实现了单独的中断堆栈,这让我有点惊讶。我想否则任何任务都需要有足够的备用堆栈来允许最大数量的并发中断;还有第二个堆栈..
    猜你喜欢
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 2013-03-12
    • 1970-01-01
    • 2010-10-17
    • 2020-08-13
    • 2018-10-17
    相关资源
    最近更新 更多