中断处理程序中C块范围的用法?

时间:2017-11-27 11:48:47

标签: c arm embedded cpu

在函数中或特别是在中断处理程序中使用C块作用域是否有任何优点或缺点?

从链接 - http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472i/CJAIIDCG.html - 参考堆栈使用情况。

通常,您可以通过以下方式降低程序的堆栈要求:

  1. 编写只需要少量变量的小函数。
  2. 避免使用大型本地结构或阵列。
  3. 避免递归,例如,使用替代算法。
  4. 最大限度地减少函数中每个部分在任何给定时间使用的变量数。
  5. 使用C块作用域并仅在需要的地方声明变量,因此重叠不同作用域使用的内存。
  6. 使用C块的优点或缺点范围不是很明确。

3 个答案:

答案 0 :(得分:2)

如果你写:

{
    int foo[1000];
    int bar[1000];
    … code that uses foo …
    … code that uses bar …
}

然后整个块存在foobar,并且必须使用不同的内存。 (编译器/优化器可能会认识到它们没有被同时使用并安排使用相同的内存,但是各种各样的东西都会干扰它,所以你不能依赖它。)

如果你写:

{
    {
        int foo[1000];
        … code that uses foo …
    }
    {
        int bar[1000];
        … code that uses bar …
    }
}

然后foobar仅在不同时间存在,因此编译器可以为它们使用相同的内存。

答案 1 :(得分:0)

这意味着如果使用更多范围限制变量的生命周期,编译器可以优化函数执行所需的空间。考虑像

这样的东西
 $('#frmEditNewCompany').ajaxForm({
    beforeSubmit: function (arr, $form, options) {
        $(".blockerModal").show();
    },
    onsubmit: function (event) {
        $(".blockerModal").show();
    },
    success: function (data, textStatus, jqXHR) {
        alert("after submit")
        if (data.Success == true) {
            $("#dv-modal-lg").modal("hide");
         }
        eval(data.Script);
        $(".blockerModal").hide();
    },
    error: function (jqXHR, textStatus, errorThrown) {
        $(".blockerModal").hide();
    }
});

编译器必须保持int x; // [some code] int y; // [some code not using x] 直到函数结束。如果你改为像这样构造它:

x

{ int x; // [some code] } { int y; // [some code not using x] } 使用x在代码中不存在,因此编译器可能重用y之前占用的相同空间(并且很可能编译器确实会这样做。)

一般说明:如果你必须在ISR中考虑这个问题,那么你的ISR可能已经太大了。保持ISR尽可能最小和最快 - 例如将事件排队可能是ISR的良好行动。

答案 2 :(得分:0)

使用C代码中的块来使代码清晰且合乎逻辑。这适用于所有 C编程 - 而不仅仅是中断。通常,只在使用它们的范围内定义局部变量通常是个好主意。 (不要过分关注并为变量定义新的范围 - 但如果变量仅在循环或条件的分支中使用,则在该块中定义它。)

只要您使用优化编译器(并且启用了优化!),当您在块内或外部使用局部变量时,堆栈空间和使用情况很少有差异。编译器足够聪明,可以查看变量的有效生命周期,并适当地限制其分配。

如果你使用编译器进行优化 - 你应该是!