Могу ли я использовать рекурсию для обработки GPIO?

Я новичок, использую STM32f100RB, основанный на ARM Cortex M3. Я пытался использовать рекурсию для обработки ввода GPIO, но это не сработало. Кто-нибудь может сказать мне, почему? Коды следующие. предполагается установить GPIOc Pin 9, когда GPIOa Pin 0 равен 1. Но это просто не работает ..

Я не уверен, что смогу задать такой вопрос. Если это неправильно, дайте мне знать. Спасибо.

    void detect_input(void);

    void main()
    {
        init_ports();
        detect_input();
        while(1)
        {
            GPIO_WriteBit(GPIOC, GPIO_Pin_9, Bit_SET);//turn on the green led
        }
    }

    void detect_input()
    {
        if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
        {
        detect_input();
        }
   }

person Yue Wang    schedule 21.04.2013    source источник
comment
Вероятно, это плохая идея, поскольку у встроенных систем не так много стека, и вы можете легко вызвать переполнение стека с помощью такого кода.   -  person Some programmer dude    schedule 21.04.2013
comment
Спасибо! @Joachim Pileborg Это должно быть причина.   -  person Yue Wang    schedule 21.04.2013
comment
Встроенный или нет, ваш код будет рекурсивно возвращаться в бесконечность, если нет ввода, так что это в основном очень плохая идея. Я бы посмотрел на использование вывода прерывания, тогда код не должен делать ничего, пока не произойдет какой-то ввод, он может тратить все свое время на другие дела.   -  person John U    schedule 02.05.2013


Ответы (1)


Используя свой код, вы, вероятно, получите stackoverflow.

Как я вижу, в вашем коде, если нет ввода, вы вызываете функцию detect_input(), и нет другого условия остановки. Таким образом, в зависимости от используемой частоты и размера стека вы будете использовать всю разрешенную память стека.

Таким образом, это в целом не очень хорошая идея.

В этом простом случае вам следует использовать простой цикл while:

void detect_input() {
    while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0));
}

В этом случае вы выйдете из цикла в момент получения ввода.

person Alex    schedule 21.04.2013