Arduino的指令时间研究

习惯了服务器端编程的思路,玩硬件也想把时间搞得清楚一些
简单研究Arduino一个指令所需的时钟周期,板子是某宝上最常见的Arduino UNO R3,先上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
const int LED1  = 13;               //红色LED
const int LED2  = 12;               //蓝色LED
int loopin      = 0;
 
void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
}
 
void loop() {
  loopin++;
  if(loopin % 2 == 1){              //点亮红色LED
    digitalWrite(LED1, HIGH);
    digitalWrite(LED2, LOW);
    delay(1000);                    //持续1秒
  }else{                            //点亮红色LED
    digitalWrite(LED2, HIGH);
    digitalWrite(LED1, LOW);
    delay(1000);                    //持续1秒
    //******************************关键看这里,这个for循环的时间,约等于delay(1000),此时双色同时亮起
    for(long i = 0; i < 160000; i++){
      digitalWrite(LED1, i % 2 == 0 ? LOW : HIGH);
      digitalWrite(LED2, i % 2 == 1 ? LOW : HIGH);
    }
  }
}

就这么多~~
整体上,用一个超长的for循环模拟出一个1秒的delay,然后观察同时亮起的时间,是否等于单独亮起的时间
实际测算,到16万时,同时亮起的时间,基本等于另外两个亮起的时间
(这里只是估算,有时间的话,也可以算的更精确一点:对着计数器数秒,看闪动的次数是否和秒数一直,不一致的话,就调整这个i得最大值)
也就是说,这里的一个for循环,Arduino的大约需要 1/160 毫秒,或者说0.16M,简答分析这个for循环做了哪些事情
1. i+1,= i, i与最大值比较,大约3次
2. i%2,== 0 ?, 高电平或低电平输出,大约3次
3. 与上一步基本一致
加起来大约10个指令?
Arduino UNO R3的晶振频率是16M,也就是说,大约,晶振的10个周期,可以执行一个程序指令
另一个方面,UNO的处理器核心是ATmega328,8位处理器,i是long型32位,上面的每次运算,cpu至少要算四次(具体8位处理器怎么捣腾相加两个32位的数,记不清了),按这种方式算的话,其实也差不多
—-over
转载请注明出处: 昆仑的山头

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

*