我正在使用Ravenscar子集编写Ada程序(因此,我知道执行时运行任务的数量)。代码由gcc编译,并启用-fstack-check
开关。如果我的任务超出其堆栈,这应该导致程序在运行时引发STORAGE_ERROR。
Ada允许在指定相应任务期间设置这些(特定于任务)堆栈的上限,如下所示:
pragma Storage_Size (Some_Value);
现在我想知道我有什么选择来确定Some_Value
。到目前为止我所听到的:
-fstack-usage
的输出输入其中。如果我理解这一点,所有上述技术都是动态(即它们需要程序才能运行)。静态方法是否也可以想象?例如。通过Ada的一些高完整性选项进一步限制自己(例如No_Recursion,还有什么?)。
也许你们中的任何人都可以列举一些最佳实践来解决这个问题和/或扩展/评论我的(肯定是不完整的)列表。
额外问题:未指定上述编译指示时,任务堆栈的默认大小是多少? GCC的docs仅表示此值取决于运行时,而不给出任何具体数字。
答案 0 :(得分:1)
通常可以使用'Storage_Size
属性(以位为单位)检查各个类型所需的堆栈空间。
一旦你将它列表(你可能需要将它整理为整个单词/双字),你可以累加每个声明区域使用多少堆栈空间,然后遍历你的调用以找到最大堆栈的使用。