一条随手的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 值判断,否则将导致引擎放弃使用索 ...
随机推荐
- 每一行输出5个字符之后换行 js
方法1 使用正则 (如果是汉字,此正则,每五个字换行,如果是英文字符,每十个英文,换行) let arrX ="这是个测试字符串,这是个测试字符串" arrX = arrX.re ...
- nginx 负载均衡时,一台tomcat宕机时的问题 自动切换
如果Nginx没有仅仅只能代理一台服务器的话,那它也不可能像今天这么火,Nginx可以配置代理多台服务器,当一台服务器宕机之后,仍能保持系统可用.具体配置过程如下: 1. 在http节点下,添加ups ...
- golang 指针
一个指针变量指向了一个值的内存地址,类似于变量和常量,在使用指针前你需要声明指针. 每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置.使用&字符放在变量前面对变量进行" ...
- java-功能-参数校验
1.map中数据 if (null == input.get("logId") || StringUtils.isBlank((String) input.get("lo ...
- mybati之sql集合
mybatis 详解(五)------动态SQL - YSOcean - 博客园 (cnblogs.com) mybatis参数注入: 根据参数名称 使用#{} 注入参数 <insert id= ...
- macOS 常用键盘快捷键大全
对于初次接触 macOS 的朋友来说,除了要寻找不同的 APP 软件之外,还有一件事情也直接影响着使用电脑的效率,那就是 - 键盘快捷键! 与 Windows 的差异 我们先来认识一下苹果 Mac 键 ...
- vue3+ts获取dom元素高度
vue3+ts获取dom元素高度 <template> <div class="digestDetail-indedx"> <div class=&q ...
- [Unity3D 小Tricks] 如何修改Unity3d脚本默认模板?
众所周知,unity默认的模板总是Update()和Start(),但往往我们并不需要,每次都要手动删除非常麻烦. 但可以更改如下模板文件 C:\Program Files\Unity 2020.3. ...
- 24 Django模块的导入--常用总结
常用模块导入 1 forms # forms组件的使用 from django import forms 2 ValidationError # modelform报错时使用 from django. ...
- 前端vue框架上手记录
---恢复内容开始--- Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,提供: 通过 @vue/cli 搭建交互式的项目脚手架. 通过 @vue/cli + @vue/cli-se ...