极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12994|回复: 2

arduino程序的执行顺序问题

[复制链接]
发表于 2016-7-12 15:31:15 | 显示全部楼层 |阅读模式
我有一个程序
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程序。
回复 支持 反对

使用道具 举报

发表于 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)方便些
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-19 18:34 , Processed in 0.039221 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表