【问题标题】:What is Nested Calls Limitations in MikroC?MikroC 中的嵌套调用限制是什么?
【发布时间】:2018-09-24 07:43:47
【问题描述】:

我想知道什么是嵌套调用限制。我正在使用 MikroC 进行 PIC 编程。

上面写着以下限制,

mikroC PRO for PIC 将非递归嵌套调用的数量限制为:

  • 8 次调用 PIC12 系列,
  • 8 次调用 PIC16 系列,
  • 16 调用 PIC16 增强系列。
  • 31 次调用 PIC18 系列。

是外部函数调用限制还是 If else 或循环调用限制?什么嵌套调用?如何在代码中计数来识别它是否兴奋?

【问题讨论】:

    标签: c embedded pic mikroc


    【解决方案1】:

    没有任何中断的 PIC16 示例:

    这段代码很好:

    /* prototypes */
    void func1 (void);
    void func2 (void);
    void func3 (void);
    void func4 (void);
    void func5 (void);
    void func6 (void);
    void func7 (void);
    void func8 (void);
    
    void func1(void) {
        /* do something here */
    }
    void func2(void) {
        /* do something here */
    }
    void func3(void) {
        /* do something here */
    }
    void func4(void) {
        /* do something here */
    }
    void func5(void) {
        /* do something here */
    }
    void func6(void) {
        /* do something here */
    }
    void func7(void) {
        /* do something here */
    }
    void func8(void) {
        /* do something here */
    }
    
    int main {
        func1();
        func2();
        func3();
        func4();
        func5();
        func6();
        func7();
        func8();
    }
    

    这段代码不行:

    /* prototypes */
    void func1 (void);
    void func2 (void);
    void func3 (void);
    void func4 (void);
    void func5 (void);
    void func6 (void);
    void func7 (void);
    void func8 (void);
    
      void func1(void) {
        func2();
    }
    void func2(void) {
        func3();
    }
    void func3(void) {
        func4();
    }
    void func4(void) {
        func5();
    }
    void func5(void) {
        func6();
    }
    void func6(void) {
        func7();
    }
    void func7(void) {
        func8();             /* here the stack reached 8. this will cause a problem */
    }
    void func8(void) {
        /* do something here */
    }
    
    int main {
        func1();
    } 
    

    【讨论】:

    • @Scheff 别傻了。 PIC是嵌入式系统裸机微控制器。 return 应该去哪里,la-la-land?对于所有此类“freestandarding”系统,使用实现定义的void main (void) 形式是行业标准。这是 C 标准允许的,请参阅 this
    • 不要听信一些混淆了int main() 教条的PC 程序员。这是不正确的,请参阅上面的评论。
    • 是的,不管关于 main 的细节如何,这都回答了这个问题。
    • @Ctx 是的,那是一个错字。我们无法编辑 cmets。
    • 有趣的是,任何合理的编译器仍然会接受此代码并使其工作。只需内联函数即可。我不确定该 MircoC 限制是否与源代码或生成的优化代码有关(或者它是否完全优化了这样的代码)。在不直接相关的旁注中:上面的代码不是有效的 C。函数在没有被声明的情况下被调用。
    【解决方案2】:

    8 位 PICmcu 的硬件调用堆栈数量有限。该堆栈包含函数调用和中断的返回地址。此堆栈不是 C 等高级语言的参数堆栈。因为此堆栈在硬件中,所以可以根据需要将其制作得尽可能宽,以便在一个周期内向 CPU 提供整个返回地址。太多的函数调用也不可能导致堆栈悄悄地破坏其他内存,例如 BSS 段或传统上的堆。

    针对非传统堆栈模型的其他副作用。看看这篇微博上的文章。 secret weapon of the 8-bit PICmcu

    【讨论】:

      猜你喜欢
      • 2013-02-06
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 2011-02-19
      • 2011-08-13
      • 1970-01-01
      • 2013-06-28
      • 2018-09-14
      相关资源
      最近更新 更多