2017-06-16 460 views
1

我正在通過I2C通信接收消息的Arduino項目。我有幾個例程,程序花了很多時間在他們沒有返回。目前,當發生中斷時,我設置了一箇中斷標誌,我基本在幾個地方檢查這些功能,如果發生中斷,我將返回。我想知道中斷函數是否可以調用我的入口點函數。Arduino中斷函數調用另一個函數可以嗎?

所以這是我當前的中斷功能

void ReceivedI2CMessage(int numBytes) 
{ 
    Serial.print(F("Received message = ")); 
    while (Wire.available()) 
    { 
     messageFromBigArduino = Wire.read(); 
    } 
    Serial.println(messageFromBigArduino); 

    I2CInterrupt = true; 
} 

,並在該程序花費大部分時間的功能,我不得不這樣做的像情侶的地方

if(I2CInterrupt) return; 

現在我想知道是否可以在我的ReceiveI2CMessage中調用我的入口點函數。我主要關心的是,這可能會導致內存泄漏,因爲我留下了中斷髮生時我正在執行的功能,並且我將回到程序的開始部分。

回答

4

這是可以的,但不是優選的。做少一點 - 也許簡單地設置一個標誌 - 並且儘可能快地退出中斷總是安全的。然後照顧你的主循環中的旗幟/信號量。例如:

volatile uint8_t i2cmessage = 0; // must be volatile since altered in an interrupt 

void ReceivedI2CMessage(int numBytes) // not sure what numBytes are used for... 
{ 
    i2cmessage = 1; // set a flag and get out quickly 
} 

然後在你的主循環:

loop() 
{ 
    if (i2cmessage == 1) // act on the semaphore 
    { 
     cli(); // optional but maybe smart to turn off interrupts while big message traffic going through... 
     i2cmessage = 0; // reset until next interrupt 
     while (Wire.available()) 
     { 
      messageFromBigArduino = Wire.read(); 
      // do something with bytes read 
     } 
     Serial.println(messageFromBigArduino); 
     sei(); // restore interrupts if turned off earlier 
    } 
} 

這實現了中斷,這是理想的設置信號燈的目標,要在主迴路迅速採取行動。

+0

哦,這對中斷部分是有意義的,但我的主要問題是我的程序每隔30秒左右訪問一次主循環,因爲它在2個其他功能中忙碌。如果(i2cmessage == 1)到處都有中斷髮生而沒有擴散,是否有從這些函數返回的簡單方法? – Saik

+1

微控制器設計中每30秒只訪問一次主循環並不典型。這通常表明設計可以改進。但好消息是,如果你只是擔心內存泄漏,即使很小的泄漏很快就會顯現出來,因爲這些設備上的SRAM非常小。壞消息是,如果你有泄漏,無論如何你都需要認真對待你的設計。我建議所有函數,特別是中斷的快速返回。 – TomServo

相關問題