一条随手的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 值判断,否则将导致引擎放弃使用索 ...
随机推荐
- Web Dynpro for ABAP(16):WDA Analysis Tools
3.21 Quality Assurance and Supportability WDA程序效能验证工具. Tests工具: eCATT and Web Dynpro ABAP Debugging工 ...
- 杭电oj 求数列的和
Problem Description 数列的定义如下:数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和. Input 输入数据有多组,每组占一行,由两个整数n(n<10000 ...
- django文件目录
例如主站mysite,mysite下有一个应用testapp 1.在mysite/mysite下的settings需要添加应用进去 2.在musite/mysite下的urls.py记录应用的路径 3 ...
- oracle 数据恢复 回滚数据
1.查询你执行update 语句之前的数据 精确到什么时间 select * from 表名 as of timestamp to_timestamp('2017-07-21 17:16:38', ' ...
- Mysql学习:2、mysql基本命令
1.下载安装好的mysql分为两种数据库: a.系统自带: b.用户自己创建: 2.基本命令: create database 数据库名称; // 创建数据库:记住后面加 分号 drop databa ...
- halcon学习
apply_metrology_model: 目标和背景灰度差别很小,但目标大概位置确定,需要确定目标位置的圆或者矩形: ball:圆形或矩形和图像其他部分相比为特殊图样
- Flask之反向生成url
from flask import Flask, url_forapp = Flask(__name__)endpoint:用来给url起别名,通过url_for来反向生成url,如果不写则默认是函数 ...
- 安卓10.0蓝牙HIDL的直通式初始化流程
本文仅介绍扼要的流程,没有系统化介绍. 首先从system\bt\hci\src\hci_layer_android.cc文件的函数void hci_initialize() 开始初始化: void ...
- Docker基本命令之 仓库管理(docker hub)
仓库管理 仓库介绍:仓库(Repository)就是集中存放镜像的地方 登录docker hub注册一个自己的账号 然后创建一个仓库:xxx 登录:docker login -- 输入用户名/密码(退 ...
- AX2012 循环读取DataSource的记录
static void LoopFormDataSource(Args _args) { FormDataSource formDataSource; SalesLine salesLineSel, ...