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

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

标准的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;


广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
大帝七七 2019-03-05 16:11
为 SAR ADC 的新性能标准做好准备了吗?
凌力尔特已用了数年时间对通常被称为逐次逼近寄存器ADC (SAR ADC) 的非常通用之模数转换器(ADC) 展开了创新。SARADC 面市已有多年,并被宽泛地接受为最简单易用的ADC 类型。许多人仅...
大帝七七 2019-03-05 16:05
ADI参考电路设计 1-4册+仪器仪表选集
ADI参考电路设计 1-4册,外加一本仪器仪表选集,均为中文。《参考电路合集 -  1-4册》书中的电路为许多通用应用提供解决方案。每款电路包含详细的设计文档,常见电路变化以及更多...
大帝七七 2019-02-27 15:59
胡润百富榜机器人共8席
机器人虽然属于新兴行业,近几年上榜人数不多,但一直呈上升趋势,今年新上榜两家机器人企业大佬,分别是“扫地机器人”起家的科沃斯钱奇东家族和“巡检机器人”大拿亿嘉和董事长朱付云;而大疆造就了3位身价超过2...
大帝七七 2019-02-27 15:50
PID控制原理
小明接到这样一个任务:有一个水缸漏水,且漏水的速度是不定的,但要求水面高度维持在某个位置,一旦发现水面高度低于要求位置,就要往水缸里加水。    开始小明用瓢加...
大帝七七 2019-02-27 15:47
I2C与SMBus之间的技术差异
关于I2C与SMBus,许多人很少去谈论与了解两者的细节差异,包括很多国外的简报,文章也经常将两者混写、交杂描述、交替运用。确实,在一般运用下,I2C Bus与SMBus没有太大的差别,从实际接线上看...
广告
我要评论
0
1
广告
关闭 热点推荐上一条 /2 下一条