原创 Arduino,做到最优才叫编程

2019-2-27 14:51 1384 16 2 分类: 智能硬件
转自北邮电路课程公众号,模电数电

标准的Arduino UNO板子上的13引脚接有一个LED,IDE中的Blink例程就是控制这个LED以一秒的间隔闪烁,下面给出的就是Blink程序代码。


/*

  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.

  Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO 
  it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to
  the correct LED pin independent of which board is used.
*/
  
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on 
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off
  delay(1000);                       // wait for a second
}
这段代码编译后占用1018字节,由于AVR单片机上电后所有的I/O口默认为输入端口,如果想做输出端口用,需要设置端口模式,在这段代码中,是用pinMode函数来指定端口工作模式的。


在AVR单片机中,每个I/O引脚也称为端口,每个引脚由三个寄存器控制:
  • 数据方向寄存器(DDRx):指定引脚是输入或输出,默认为输入。
  • 数据寄存器(PORTx):引脚指定为输出时,决定引脚的电压值;指定为输入时,写如1开启内置上拉电阻。
  • 输入寄存器(PINx):对应引脚上当前逻辑电平;若向输入寄存器写1,等效为翻转对应数据寄存器的值。



以占用较少资源为目标,下面给出实现同样功能的另一段代码
extern volatile unsigned long timer0_millis;

void setup() {
   bitSet(DDRB,5);   //初始化PB5,即13引脚为输出引脚
}
void loop() {
  bitSet(PINB,5);  //通过往13引脚的输入寄存器写1实现输出翻转
  while(timer0_millis <1000);
  timer0_millis=0;
}
这段代码编译后只占用490字节而两段代码实现的功能是一样的。


为了降低功耗,代码可以再次修改如下
#include

extern volatile unsigned long timer0_millis;
void setup() {
   bitSet(DDRB,5);
}

void loop() {
  while(timer0_millis <1000) {
    set_sleep_mode(SLEEP_MODE_IDLE);
    sleep_mode();
  }
  timer0_millis=0;
  bitSet(PINB,5);
}
这段代码编译后占用512字节,AVR体系结构有几种不同深度的睡眠模式,上面的代码是让AVR进入最浅的空闲模式,其效果使芯片在90%的时间里处于睡眠状态,节约了大量能量。

怎么样,你真的熟悉Arduino吗?不是把代码输入计算机就是编程,只有优化,甚至做到最优才叫编程,一件事情只有做到极致才有意义


在Arduino IDE中只有 setup() 和 loop() 两个函数,其背后C语言框架代码应该是这样的:
void setup(void);
void loop(void);

int main(void) {
   setup();
   while (1)
       loop();
   return 0;


PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
16
关闭 站长推荐上一条 /3 下一条