版权声明:转载请注明原文地址即可,要是本文对您有些许帮助的话,请您在下方点个赞,谢谢啦ヾ(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(){
}