Arduino 快速I/O 基本代码优化

Arduino优化指南
本文介绍Arduino UNO板子上的代码优化技巧,包括将频繁调用的代码从loop移动到setup,直接操作端口寄存器来替代digitalWrite和digitalRead函数,并提供模拟量读取的加速方法。

此文档针对UNO板子。


arduino的底层main.cpp文件是这样写的

#include <Arduino.h>

// Declared weak in Arduino.h to allow user redefinitions.
int atexit(void (* /*func*/ )()) { return 0; }

// Weak empty variant initialization function.
// May be redefined by variant files.
void initVariant() __attribute__((weak));
void initVariant() { }

void setupUSB() __attribute__((weak));
void setupUSB() { }

int main(void)
{
	init();

	initVariant();

#if defined(USBCON)
	USBDevice.attach();
#endif
	
	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}
        
	return 0;
}

所以我们发现在loop里每次都还要检查serial,所以我们可行的优化之一是把code从loop放到setup函数里去。

然后ATmega328的端口D对应D0-D7,端口B对应D8-D13,端口C对应A0-A5
对每个端口有8位的DDR,PORT,PIN寄存器。
DDR 对应 pinMode (1-output 0-input)
PORT 对应 digitalWrtie
PIN 对应 digitalRead
高电平代表执行对应操作

所以优化代码为:

比如digitalWrite(10,HIGH)
优化为PORTB=B00000100;

示例程序:

byte state=0;
void setup(){
	DDRB = B00000100;
	while(true){
		PORTB=B00000100;
		PORTB=B00000000;
	}
}
void loop(){
}

模拟量的加速操作:

源程序:

void setup(){
	Serial.begin(9600);
	while(!Serial){};
	Serial.println("Starting Test");
	long startTime=millis();
	long i=0;
	for(i=0;i<1000000;i++)analogRead(A0);
	long endTime=millis();
	Serial.println("Finished Test");
	Serial.print("Seconds taken:");
	Serial.println((endTime-startTime)/10001);
}
void loop(){
}

优化为:

const byte PS_128=(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
const byte PS_16=(1<<ADPS2);
void setup(){
	ADCSRA &= ~PS_128;//remove prescale of 128
	ADCSRA |= PS_16;//add prescale of 16 (1MHz)
	Serial.begin(9600);
	while(!Serial){};
	Serial.println("Starting Test");
	long startTime=millis();
	long i=0;
	for(i=0;i<1000000;i++)analogRead(A0);
	long endTime=millis();
	Serial.println("Finished Test");
	Serial.print("Seconds taken:");
	Serial.println((endTime-startTime)/10001);
}
void loop(){
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真·skysys

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值