MikroC 中的嵌套调用限制是什么?
What is Nested Calls Limitations in MikroC?
我想知道什么是嵌套调用限制。我正在使用 MikroC 进行 PIC 编程。
它说了以下限制,
mikroC PRO for PIC limits the number of non-recursive nested calls to:
- 8 calls for PIC12 family,
- 8 calls for PIC16 family,
- 16 calls for PIC16 Enhanced family.
- 31 calls for PIC18 family.
是外部函数调用限制还是If 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();
}
8 位 PICmcu 的硬件调用堆栈数量有限。该堆栈包含用于函数调用和中断的 return 地址。这个堆栈不是像 C 这样的高级语言的参数堆栈。因为这个堆栈是在硬件中的,所以它可以变得尽可能宽,以便在一个周期内将整个 return 地址提供给 CPU。太多的函数调用也不可能导致堆栈悄悄地破坏其他内存,例如 BSS 段或传统上的堆。
对于非传统堆栈模型的其他副作用。看看微博上的这篇文章。 secret weapon of the 8-bit PICmcu
我想知道什么是嵌套调用限制。我正在使用 MikroC 进行 PIC 编程。
它说了以下限制,
mikroC PRO for PIC limits the number of non-recursive nested calls to:
- 8 calls for PIC12 family,
- 8 calls for PIC16 family,
- 16 calls for PIC16 Enhanced family.
- 31 calls for PIC18 family.
是外部函数调用限制还是If 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();
}
8 位 PICmcu 的硬件调用堆栈数量有限。该堆栈包含用于函数调用和中断的 return 地址。这个堆栈不是像 C 这样的高级语言的参数堆栈。因为这个堆栈是在硬件中的,所以它可以变得尽可能宽,以便在一个周期内将整个 return 地址提供给 CPU。太多的函数调用也不可能导致堆栈悄悄地破坏其他内存,例如 BSS 段或传统上的堆。
对于非传统堆栈模型的其他副作用。看看微博上的这篇文章。 secret weapon of the 8-bit PICmcu