Что такое ограничения вложенных вызовов в MikroC? - PullRequest
0 голосов
/ 24 сентября 2018

Я хочу знать, что такое ограничения вложенных вызовов.Я использую MikroC для программирования PIC.

В нем указаны следующие ограничения:

mikroC PRO для PIC ограничивает количество нерекурсивных вложенных вызовов:

  • 8 вызовов для семейства PIC12,
  • 8 вызовов для семейства PIC16,
  • 16 вызовов для расширенного семейства PIC16.
  • 31 вызывает для семейства PIC18.

Является ли это ограничениями вызова внешних функций или If else или ограничениями вызова цикла?Какие Вложенные Звонки?Как рассчитать в коде, чтобы определить, возбужден он или нет?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

8-битные PICmcu имеют ограниченное количество аппаратных стеков вызовов.Этот стек содержит адрес возврата для вызовов функций и прерываний.Этот стек НЕ является стеком параметров для языков высокого уровня, таких как C. Поскольку этот стек аппаратный, его можно сделать настолько широким, насколько это необходимо, чтобы обеспечить полный адрес возврата для ЦПУ за один цикл.Также при слишком большом количестве вызовов функций невозможно заставить стек незаметно повредить другую память, такую ​​как сегмент BSS или традиционную кучу.

Для других побочных эффектов нетрадиционной модели стека.взгляните на эту статью о микрофоруме. секретное оружие 8-битного PICmcu

0 голосов
/ 24 сентября 2018

Пример для 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();
} 
...