Il perché della notevole differenza (... non proporzionato a quanto si è visto con l'accesso diretto agli I/O) tra AVR e RA4M1, utilizzando la digitalWrite() è comprensibili guardando le implementazioni delle due funzioni ...
Funzione digitalWrite() per MCU AVR:
void digitalWrite(uint8_t pin, uint8_t val)
{
uint8_t timer = digitalPinToTimer(pin);
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *out;
if (port == NOT_A_PIN) return;
// If the pin that support PWM output, we need to turn it off
// before doing a digital write.
if (timer != NOT_ON_TIMER) turnOffPWM(timer);
out = portOutputRegister(port);
uint8_t oldSREG = SREG;
cli();
if (val == LOW) {
*out &= ~bit;
} else {
*out |= bit;
}
SREG = oldSREG;
}
Funzione digitalWrite() per MCU RA4M1:
void digitalWrite(pin_size_t pin, PinStatus val) {
R_IOPORT_PinWrite(NULL, g_pin_cfg[pin].pin, val == LOW ? BSP_IO_LEVEL_LOW : BSP_IO_LEVEL_HIGH);
}
... in cui risulta evidente che la digitalWrite() per AVR esegue un numero decisamente superiore di operazioni rispetto a quelle della sua equivalente per RA4M1.
Guglielmo