qushengnian 发表于 2016-7-12 15:31:15

arduino程序的执行顺序问题

我有一个程序
void setup(){
   ...初始化...      
interruptSetup();            
}
void loop(){
   S输出
}

interruptSetup(); {                                  //定时器中断
定义中断
}
ISR(TIMER2_COMPA_vect){                         //采集数据   
cli();
S = analogRead(pulsePin1);
sei();
}
我知道程序刚开始通过void setup()初始化,然后进行定时器中断并采样,在void loop()中将采到的数据进行输出。我问问大神,定时器中断和loop()怎么个执行顺序。定时器在中断,loop()循环同时将采到的数据输出,还是定时器中断执行后停一下,loop()循环进行输出。因为loop()也是不断循环,定时器中断也是不断循环,不知道他们到底是个什么顺序。

林定祥 发表于 2016-7-13 10:05:12

无中断程序时,程序先setup,然后在loop中循环。有终端程序时,中断打开后,没有中断出现时,也是在loop中循环,在循环时的任意时刻,中断出现,loop停下来,执行中断程序,中断完成后,继续loop程序。

xiaoliumonitor 发表于 2016-7-13 23:46:06

定时器中断来到时,主程序(loop函数)会暂时停顿一下,开始执行定时器中断函数里的代码,这段代码可能仅需要几十us,例如S = analogRead(pulsePin1);这个函数,而定时器中断的时间很长,例如1s,停顿之后会继续执行loop函数,loop函数从哪里断开的就接着从哪里执行。对于atmega328而言,PC(程序计数器)只有一个,定时器这种资源不应阻塞loop很长时间,也就是说定时器中断函数越快越好,阻塞的时间长(例如500ms),如果loop函数中有按键识别的功能,用户体验就差。进入中断函数后,328会自动关闭全局中断,执行完中断函数返回前sei()也会自动调用。 一些arduino定时器的库也很方便用,感觉比直接操作gcc   ISR(TIMER2_COMPA_vect)方便些
页: [1]
查看完整版本: arduino程序的执行顺序问题