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

mor*_*ido 6 memory gcc ada

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

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

pragma Storage_Size (Some_Value);
Run Code Online (Sandbox Code Playgroud)

现在我想知道我必须确定哪些选项Some_Value.到目前为止我所听到的:

  1. 做疯狂的猜测,直到没有STORAGE_ERROR被提出为止.这或多或少是OP 在此提出的建议.
  2. 输出-fstack-usage那里的输出.
  3. 使用此处概述的一些特定于gnat的扩展(这在技术上与第2项有何不同?).
  4. 得到像gnatstack这样的堆栈分析器,让它为你完成工作.

如果我理解这一点,所有上述技术都是动态的(即它们需要程序运行才能工作).静态方法是否也可以想象?例如,通过Ada的一些高完整性选项进一步限制自己(例如No_Recursion,还有什么?).

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

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

Jac*_*sen 1

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

一旦您将其制成表格(您可能需要将其四舍五入为整个字/双字),您可以将每个声明区域使用的堆栈空间加起来,然后遍历您的调用以查找最大堆栈使用量。