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

В нем говорится о следующих ограничениях,

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

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

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

1
Ind 24 Сен 2018 в 10:43

2 ответа

Лучший ответ

Пример для 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();
} 
3
Mike 24 Сен 2018 в 12:39

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

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

1
Joseph Julicher 25 Янв 2019 в 13:34