Arduino中断函数调用另一个函数可以吗?

问题描述:

我正在通过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中调用我的入口点函数。我主要关心的是,这可能会导致内存泄漏,因为我留下了中断发生时我正在执行的功能,并且我将回到程序的开始部分。

这是可以的,但不是优选的。做少一点 - 也许简单地设置一个标志 - 并且尽可能快地退出中断总是安全的。然后照顾你的主循环中的旗帜/信号量。例如:

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