Arduino UNO R4 - manipolazione diretta dei pin di I/O

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

Infatti: sugli AVR fa un sacco di cose solitamente inutili prima di fare quel pochissimo che serve... :frowning:

... non sono d'accordo, sono cose che, vista l'idea con cui è nato il tutto, ovvero di permettere l'uso di una MCU anche a gente non del mestiere, sono state introdotte per evitare o aggirare problemi che potevano sorgere ... chiaramente ne fa le spese l'efficienza.

Guglielmo

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.