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

版权声明:转载请注明原文地址即可,要是本文对您有些许帮助的话,请您在下方点个赞,谢谢啦ヾ(o◕∀◕)ノヾ https://blog.csdn.net/qq_33583069/article/details/88763080

此文档针对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(){
}

猜你喜欢

转载自blog.csdn.net/qq_33583069/article/details/88763080