#include <Arduino.h>
#define DATA_SIZE 1000
volatile byte source[DATA_SIZE];
volatile byte dataDump;
volatile int dmaIndex = 0;
volatile bool dmaRunning = false;
const int ledPin = 13;
unsigned long previousMillis = 0;
bool ledState = LOW;
unsigned long startTimePIO, endTimePIO;
unsigned long startTimeDMA, endTimeDMA;
bool dmaReported = false;
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
for (int i = 0; i < DATA_SIZE; i++) {
source[i] = (byte)(i % 255);
}
// Programmed I/O
Serial.println(F("\n[1] Programmed I/O"));
startTimePIO = micros();
for (int i = 0; i < DATA_SIZE; i++) {
dataDump = source[i];
delayMicroseconds(1);
}
endTimePIO = micros();
Serial.print(F("Waktu Selesai PIO: "));
Serial.print(endTimePIO - startTimePIO);
Serial.println(F(" us"));
delay(1500);
// DMA
Serial.println(F("\n[2] Simulated DMA"));
dmaIndex = 0;
dmaRunning = true;
noInterrupts();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 800;
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS11);
TIMSK1 |= (1 << OCIE1A);
interrupts();
startTimeDMA = micros();
}
ISR(TIMER1_COMPA_vect) {
if (dmaRunning) {
if (dmaIndex < DATA_SIZE) {
dataDump = source[dmaIndex];
dmaIndex++;
} else {
dmaRunning = false;
endTimeDMA = micros();
TIMSK1 &= ~(1 << OCIE1A);
}
}
}
void loop() {
unsigned long now = millis();
if (now - previousMillis >= 200) {
previousMillis = now;
ledState = !ledState;
digitalWrite(ledPin, ledState);
}
if (!dmaRunning && !dmaReported) {
dmaReported = true;
Serial.print(F("Waktu Selesai DMA: "));
Serial.print(endTimeDMA - startTimeDMA);
Serial.println(F(" us"));
}
}