一条随手的Arduino sketch优化 以Examples-02.Digital-Debounce为例
1 const int buttonPin = 2;
2 const int ledPin = 13;
3
4 int ledState = HIGH;
5 int buttonState;
6 int lastButtonState = LOW;
7
8 unsigned long lastDebounceTime = 0;
9 unsigned long debounceDelay = 50;
10
11 void setup() {
12 pinMode(buttonPin, INPUT);
13 pinMode(ledPin, OUTPUT);
14 digitalWrite(ledPin, ledState);
15 }
16
17 void loop() {
18 int reading = digitalRead(buttonPin);
19 if (reading != lastButtonState) {
20 lastDebounceTime = millis();
21 }
22 if ((millis() - lastDebounceTime) > debounceDelay) {
23 if (reading != buttonState) {
24 buttonState = reading;
25 if (buttonState == HIGH) {
26 ledState = !ledState;
27 }
28 }
29 }
30 digitalWrite(ledPin, ledState);
31 lastButtonState = reading;
32 }
原文的代码 暂时去掉注释,便于显示重点。
编译结果:
Sketch uses 1116 bytes (3%) of program storage space. Maximum is 30720 bytes.
Global variables use 19 bytes (0%) of dynamic memory, leaving 2029 bytes for local variables. Maximum is 2048 bytes.
优化手段1:选用够用的数据类型,这里面的int对象,都是小于255的,可以换成byte:
const byte buttonPin = 2;
const byte ledPin = 13;
byte ledState = HIGH;
byte buttonState;
byte lastButtonState = LOW; unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50; void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, ledState);
} void loop() {
byte reading = digitalRead(buttonPin);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;
if (buttonState == HIGH) {
ledState = !ledState;
}
}
}
digitalWrite(ledPin, ledState);
lastButtonState = reading;
}
编译结果:
Sketch uses 1074 bytes (3%) of program storage space. Maximum is 30720 bytes.
Global variables use 17 bytes (0%) of dynamic memory, leaving 2031 bytes for local variables. Maximum is 2048 bytes.
效果:
程序空间减少42字节;SRAM减少2字节。
继续淦:
里面有一个函数在相近的位置,用了两遍,且貌似挺复杂的,就是:millis();
将其合二为一,但是又要增加一个全局变量,试试效果:
const byte buttonPin = 2;
const byte ledPin = 13;
byte ledState = HIGH;
byte buttonState;
byte lastButtonState = LOW;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
unsigned long ml = 0; void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, ledState);
}
void loop() {
byte reading = digitalRead(buttonPin);
ml = millis();
if (reading != lastButtonState) {
lastDebounceTime = ml;
}
if ((ml - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;
if (buttonState == HIGH) {
ledState = !ledState;
}
}
}
digitalWrite(ledPin, ledState);
lastButtonState = reading;
}
编译结果:
Sketch uses 1052 bytes (3%) of program storage space. Maximum is 30720 bytes.
Global variables use 17 bytes (0%) of dynamic memory, leaving 2031 bytes for local variables. Maximum is 2048 bytes.
又干掉22字节的程序空间,SRAM竟然没变?
(1166-1052)/1166 = 104/1166 = 9.8%
将近10%的优化成果,这还没使用骨灰级的寄存器大法来优化pinMode和digitalRead/Write。
后续再试:const byte debounceDelay = 50; 结果还是1052、17,看来是编译器自动将其优化了。
一条随手的Arduino sketch优化 以Examples-02.Digital-Debounce为例的更多相关文章
- 关于Yahoo十四条军规与前端性能优化
关于Yahoo十四条军规与前端性能优化 热度 4已有 223 次阅读2014-8-3 15:01 |个人分类:前端相关|系统分类:前端优化| 前端优化, yahoo, 性能优化 启用Gzip压缩.Gz ...
- 在 Edison 上自动启动 Arduino Sketch
前言 原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正. 本文使用Markdown写成,为获得更好的阅读体验和正常的链接.图片显示,请访问我的博客原文: http://www.cnblog ...
- 多条asp.net网站的优化建议
一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库通信的时间,使你的 ...
- [转]SqlSever2005 一千万条以上记录分页数据库优化经验总结【索引优化 + 代码优化】一周搞定
对普通开发人员来说经常能接触到上千万条数据优化的机会也不是很多,这里还是要感 谢公司提供了这样的一个环境,而且公司让我来做优化工作.当数据库中的记录不超过10万条时,很难分辨出开发人员的水平有多高,当 ...
- MS SqlSever一千万条以上记录分页数据库优化经验总结【索引优化 + 代码优化】[转]
对普通开发人员来说经常能接触到上千万条数据优化的机会也不是很多,这里还是要感谢公司提供了这样的一个环境,而且公司让我来做优化工作.当数据库中的记录不超过10万条时,很难分辨出开发人员的水平有多高,当数 ...
- SqlSever2005 一千万条以上记录分页数据库优化经验总结【索引优化 + 代码优化】
对普通开发人员来说经常能接触到上千万条数据优化的机会也不是很多,这里还是要感谢公司提供了这样的一个环境,而且公司让我来做优化工作.当数据库中的记录不超过10万条时,很难分辨出开发人员的水平有多高,当数 ...
- 给你一条sql语句如何进行优化
我们sql语句的书写是根据业务逻辑进行书写的,如果执行比较慢,那么我们对sql重写: 如分步查询,然后在代码层进行拼接:用临时表:改变sql语句的写法等等.我们称之为逻辑层优化. 然后我们看看每条sq ...
- 提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)
转自http://blog.163.com/zhangjie_0303/blog/static/9908270620146951355834/ 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 w ...
- (转)提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- (转载)提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
随机推荐
- FTP为什么越来越不好用了?要如何替代?
FTP相信很多人都不陌生,作为世界范围内第一个文件传输协议,FTP解决了互联网文件传输需求,至今已被广泛使用30多年.但很多人现在慢慢发现,FTP越来越不好用了,或者说越来越无法满足自己需求了,这是为 ...
- python中的import、from import以及import as的区别
import import是python提供的用于导入模块的机制,导入的是整个模块的内容.模块可以是py.pyc.pyd,可以是系统自带的,也可以是自定义的. 使用语法:import os pytho ...
- C++ 手动实现单向循环链表(课后作业版)
单向循环链表,并实现增删查改等功能 首先定义节点类,类成员包含当前节点的值, 指向下一个节点的指针 循环链表的尾节点指向头节点 节点定义: //node definition template < ...
- (linux笔记)开放防火墙端口
关闭防火墙 CentOS 7.RedHat 7 之前的 Linux 发行版防火墙开启和关闭( iptables ): 即时生效,重启失效 #开启 service iptables start #关闭 ...
- react 学习笔记更新
生命周期 插槽 组件中间内容用this.props.children访问 是否组件更新 shouldcompontsupdata(props,newstatus){ return false: } 父 ...
- react module.scss文件中弹窗中 keyframes动画不生效,
以下修改,亲测有效非弹窗内动画写法 .submit_btn{ animation: submit_btn 1.5s infinite; -webkit-animation: submit_ ...
- mysql的日期输出格式列出来
mysql的日期输出格式列出来: %a 缩写星期名 %b 缩写月名 %c 月,数值 %D 带有英文前缀的月中的天 %d 月的天,数值(00-31) %e 月的天,数值(0-31) %f 微秒 %H 小 ...
- MongoDB 副本集(Replica Set)
副本集(Replica Set) 副本集概念 此集群拥有一个主节点(Master)和多个从节点(Slave),与主从复制模式类似,但是副本集与主从复制的区别在于:当集群中主节点发生故障时,副本集可以自 ...
- 项目实训 DAY 9
加入页面之间定向的按钮,并改了一个typo
- c++学习8 动态空间申请
一 动态分配内存的概述 在数组一幕中,介绍过数组的长度是事先预定好的,在整个程序中固定不变.但是在实际的编程过程中,往往会发生这种情况:我们并不清楚到底需要多少数目的空间,而且无法事先预定,所以对了应 ...