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
}
}
这实现了中断,这是理想的设置信号灯的目标,要在主回路迅速采取行动。
哦,这对中断部分是有意义的,但我的主要问题是我的程序每隔30秒左右访问一次主循环,因为它在2个其他功能中忙碌。如果(i2cmessage == 1)到处都有中断发生而没有扩散,是否有从这些函数返回的简单方法? – Saik
微控制器设计中每30秒只访问一次主循环并不典型。这通常表明设计可以改进。但好消息是,如果你只是担心内存泄漏,即使很小的泄漏很快就会显现出来,因为这些设备上的SRAM非常小。坏消息是,如果你有泄漏,无论如何你都需要认真对待你的设计。我建议所有函数,特别是中断的快速返回。 – TomServo