¿Cuál es la mejor manera de definir un pin de E / S?

9

Leo definiciones como

const int ledPin = 9;

y también

#define ledPin 9

Sé que una definición como

int ledPin = 9;

es una mala práctica si no vas a cambiarlo (lo que generalmente no harás), aunque lo he visto varias veces en los programas de Arduino. ¿Cuál de los otros dos es el preferido?

Joris Groosman
fuente

Respuestas:

6

#define ledPin 9se prefiere. Al hacerlo int ledPin = 9;, asignará una intmemoria cuyo valor se usa cada vez que lo usa ledPin. #definees diferente en el sentido de que no asigna memoria. No hay memoria llamada ledPin. Antes de compilar, todos los "ledPin" del código (que no sean cadenas) se reemplazan por 9. Así que básicamente

digitalWrite(ledPin);

se convierte

digitalWrite(9);

Ventajas de #define: ahorra memoria y, dado que todos ledPinse reemplazan por 9 antes de la ejecución , ahorra tiempo de procesador.

Realmente no importa en códigos pequeños ...


fuente
¿Los compiladores integrados son realmente tan malos que no se doblan constantemente cuando se usan const int?
Chuu
1
@chuu, que yo sepa, Arduino usa gcc para avr. Por lo tanto, casi definitivamente debería optimizarse. Las respuestas aquí no muestran mucha comprensión de las buenas prácticas en C ++
chbaker0
3
en C ++, const int ledPin = 9;se prefiere sobre otras 2 opciones. Esto NO asignará memoria para un intexcepto si define un puntero a él en alguna parte, lo que nadie haría.
jfpoilpret
Const int asigna memoria @jfpoilpret. #define no ocupa memoria porque es solo un nombre simbólico de una expresión y no el nombre de una memoria ...
Consulte este enlace cplusplus.com/forum/beginner/28089 y compruébelo usted mismo. De lo contrario, solo realice la verificación con Arduino IDE: verifique el tamaño de los datos con const y con #define.
jfpoilpret
4

Estrictamente hablando, el #defineenfoque utilizará un poco menos de memoria. Sin embargo, la diferencia suele ser pequeña. Si necesita reducir el uso de memoria, entonces otras optimizaciones probablemente serían mucho más efectivas.

Un argumento a favor del uso const intes la seguridad de tipo . Dondequiera que se refiera a ese número de pin por variable, sabrá exactamente qué tipo de datos está obteniendo. Puede ser promovido / convertido implícita o explícitamente por el código que lo usa, pero debe comportarse de maneras muy claras.

Por el contrario, el valor en a #defineestá abierto a interpretación. La gran mayoría de las veces, probablemente no le causará ningún problema. Solo debe tener un poco de cuidado si tiene un código que haga suposiciones sobre el tipo o tamaño del valor.

Personalmente, casi siempre prefiero el tipo de seguridad a menos que tenga una necesidad muy seria de ahorrar memoria.

Peter Bloomfield
fuente
Estuve en el campo #define hasta que leí la respuesta de Peter. Supongo que sé quién refactorizará el código este fin de semana. ;)
linhartr22
2

Probablemente la mejor manera sería
const uint8_t LED_PIN = 9; // may require to #include <stdint.h>
o
const byte LED_PIN = 9; // with no include necessary
const unsigned char LED_PIN = 9; // similarly
El nombre está en mayúsculas según la práctica general en C ++ (y otros) para nombrar constantes. Esto no debería usar RAM en sí mismo, y usar aproximadamente 1 byte de memoria de programa por uso.
Sin embargo, puede haber problemas cuando el número es mayor que 127 y se amplía el signo al ser promovido a enteros con signo más grandes (no del todo seguro en esto), aunque es poco probable que eso suceda con los números PIN.

Rykien
fuente
-1

No solo

const int ledPin = 9;

ocupa RAM, pero en este caso, usará más RAM de la necesaria, ya que digitalWrite(uint8_t, uint8_t)solo necesita argumentos de un byte, y un int suele ser de dos bytes (depende del compilador, pero es típico). Tenga en cuenta que puede dar al literal un tipo explícito en el #define:

#define ledPin ((int)9) 

aunque en un contexto como un argumento de función en el que se requiere un tipo específico (¡porque la función se prototipó correctamente!), se emitiría implícitamente u obtendría un mensaje de error si los tipos no coinciden.

JRobert
fuente
@DrivebyDownvoter, ¿comentarías tus razones?
JRobert