确定Ravenscar程序中堆栈使用情况的最佳实践

时间:2016-01-13 11:30:07

标签: gcc memory ada

我正在使用Ravenscar子集编写Ada程序(因此,我知道执行时运行任务的数量)。代码由gcc编译,并启用-fstack-check开关。如果我的任务超出其堆栈,这应该导致程序在运行时引发STORAGE_ERROR

Ada允许在指定相应任务期间设置这些(特定于任务)堆栈的上限,如下所示:

pragma Storage_Size (Some_Value);

现在我想知道我有什么选择来确定Some_Value。到目前为止我所听到的:

  1. 做出疯狂的猜测,直到不再引发STORAGE_ERROR。这或多或少是OP建议的here
  2. -fstack-usage的输出输入其中。
  3. 按照概述here使用一些特定于gnat的扩展程序(这在技术上与第2项有何不同?)。
  4. 获取像gnatstack这样的堆栈分析器,让它为您完成工作。
  5. 如果我理解这一点,所有上述技术都是动态(即它们需要程序才能运行)。静态方法是否也可以想象?例如。通过Ada的一些高完整性选项进一步限制自己(例如No_Recursion,还有什么?)。

    也许你们中的任何人都可以列举一些最佳实践来解决这个问题和/或扩展/评论我的(肯定是不完整的)列表。

    额外问题:未指定上述编译指示时,任务堆栈的默认大小是多少? GCC的docs仅表示此值取决于运行时,而不给出任何具体数字。

1 个答案:

答案 0 :(得分:1)

通常可以使用'Storage_Size属性(以位为单位)检查各个类型所需的堆栈空间。

一旦你将它列表(你可能需要将它整理为整个单词/双字),你可以累加每个声明区域使用多少堆栈空间,然后遍历你的调用以找到最大堆栈的使用。