MikroC中的嵌套调用限制是什么?

MikroC中的嵌套调用限制是什么?,c,embedded,pic,mikroc,C,Embedded,Pic,Mikroc,我想知道嵌套调用的限制是什么。我正在使用MikroC进行PIC编程 它说有以下限制 mikroC PRO for PIC将非递归嵌套调用的数量限制为: 8次呼叫PIC12家庭 8次呼叫PIC16家庭 16次呼叫PIC16增强型家庭 31次呼叫PIC18家庭 是外部函数调用限制,还是else或循环调用限制?什么嵌套调用?如何在代码中计数以确定它是否兴奋 没有任何中断的PIC16示例: 这个代码很好: /* prototypes */ void func1 (void); void func2

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

它说有以下限制

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

  • 8次呼叫PIC12家庭
  • 8次呼叫PIC16家庭
  • 16次呼叫PIC16增强型家庭
  • 31次呼叫PIC18家庭

是外部函数调用限制,还是else或循环调用限制?什么嵌套调用?如何在代码中计数以确定它是否兴奋

没有任何中断的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();
} 

没有任何中断的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();
} 

8位PICmcu的硬件调用堆栈数量有限。此堆栈包含函数调用和中断的返回地址。这个堆栈不是像C这样的高级语言的参数堆栈。因为这个堆栈是在硬件中,所以可以根据需要使它变宽,以便在一个周期内向CPU提供整个返回地址。太多的函数调用也不可能导致堆栈悄悄损坏其他内存,如BSS段或堆


用于非传统堆栈模型的其他副作用。看一看这篇关于microforum的文章

8位PICmcu的硬件调用堆栈数量有限。此堆栈包含函数调用和中断的返回地址。这个堆栈不是像C这样的高级语言的参数堆栈。因为这个堆栈是在硬件中,所以可以根据需要使它变宽,以便在一个周期内向CPU提供整个返回地址。太多的函数调用也不可能导致堆栈悄悄损坏其他内存,如BSS段或堆


用于非传统堆栈模型的其他副作用。看一看这篇关于microforum的文章

@Scheff别傻了。PIC是一种嵌入式系统的裸机微控制器。它应该
返回到哪里
,拉兰?对于所有此类“自由标准”系统,使用实现定义形式的
void main(void)
,这是行业标准。这是C标准允许的,请参阅。不要听一些困惑的PC程序员使用
intmain()
教条。这是不正确的,请参阅上面的评论。是的,这回答了这个问题,而不考虑有关main的小细节。@Ctx是的,那将是一个打字错误。我们无法编辑注释。有趣的是,任何合理的编译器都会接受此代码并使其正常工作。只需内联函数即可。我不确定MircoC限制是否与源代码或生成的优化代码有关(或者它是否对代码进行了优化)。注意:上面的代码不是有效的C语言。函数是在没有声明的情况下调用的。@Scheff别傻了。PIC是一种嵌入式系统的裸机微控制器。它应该
返回到哪里
,拉兰?对于所有此类“自由标准”系统,使用实现定义形式的
void main(void)
,这是行业标准。这是C标准允许的,请参阅。不要听一些困惑的PC程序员使用
intmain()
教条。这是不正确的,请参阅上面的评论。是的,这回答了这个问题,而不考虑有关main的小细节。@Ctx是的,那将是一个打字错误。我们无法编辑注释。有趣的是,任何合理的编译器都会接受此代码并使其正常工作。只需内联函数即可。我不确定MircoC限制是否与源代码或生成的优化代码有关(或者它是否对代码进行了优化)。在一个不直接相关的方面注意:上面的代码不是有效的C。调用函数时没有声明。