2013-04-21 64 views
1

我是使用基於ARM Cortex M3的STM32f100RB的新手。我試圖使用遞歸來處理GPIO輸入,但它沒有工作。任何人都可以告訴我爲什麼? 代碼如下。 它應該設置GPIOc引腳9,當GPIOa引腳0是1.但它只是不工作..我可以使用遞歸來處理GPIO嗎?

我不知道我是否可以發佈這樣的問題。如果它不正確,讓我知道,謝謝。

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(); 
     } 
    } 
+2

這可能是一個壞主意,因爲嵌入式系統沒有太多的堆棧,並且你可以很容易地導致堆棧溢出這樣的代碼。 – 2013-04-21 11:24:54

+0

謝謝! @Joachim Pileborg它一定是原因。 – 2013-04-21 11:40:35

+1

嵌入或不嵌入,如果沒有輸入,你的代碼會自行進入* infinity *,所以它基本上是一個非常糟糕的主意。我會考慮使用一箇中斷引腳,然後代碼不需要做任何事情,直到發生一些輸入,它可以花費所有時間來完成其他事情。 – 2013-05-02 09:17:02

回答

5

使用你的代碼,你可能會得到一個計算器

正如我所見,在您的代碼中,如果沒有輸入,那麼您將調用函數detect_input(),並且沒有其他停止條件。因此,依賴於使用的頻率和堆棧大小,您將使用所有允許的堆棧內存。

因此,這通常不是一個好主意。

對於這個簡單的情況下,你應該使用簡單的while循環:

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

在這種情況下,你將退出循環的時刻,輸入將被接收。

+0

非常感謝。我要試試你的代碼! – 2013-04-21 11:41:54