¿Debo definir valores de registro predeterminados en el código de inicio?

Me ha llamado la atención que algunos programadores de ARM configuran algunos registros de la CPU con valores que son los mismos valores predeterminados del registro en el reinicio del microcontrolador.

Por ejemplo: el valor predeterminado del IOCON_PIO2_9parámetro MODEen LCP1114 es 0x02 (resistencia pull-up habilitada). En el código de ejemplo de Olimex, este valor se establece 0x02en la inicialización del software, pero este ya es el valor predeterminado.

Este comportamiento ocurre con muchos otros registros.

Por qué alguien haría eso? En mi opinión, este código adicional solo contamina todo y empeora la legibilidad del código. ¿Es esta una buena práctica de programación?

No soy una persona que hable de "mejores prácticas", pero especialmente en una plataforma como ARM, donde toda la funcionalidad periférica está en manos del fabricante y es posible que se encuentre saltando entre fabricantes, parece que esta práctica mejoraría la portabilidad.
¿Alguna vez escuchaste la cita "La suposición es la madre de todos los f *** kups"? Nunca asuma nada, incluso los valores predeterminados pueden cambiar si hay un apagón o algo así, así que nunca confíe en que nada esté en ningún estado a menos que lo configure usted mismo.

Respuestas (1)

  1. Para hacer código modular. Si su rutina A/D, por ejemplo, siempre configura completamente el A/D para cualquier modo en el que lo use, entonces se puede llamar a esa rutina en cualquier momento, ya sea inmediatamente después del encendido o después de que el A/D se haya usado en algún otro modo. forma.
  2. El código puede regresar a la ubicación de inicio para hacer un reinicio de software. En ese caso, es posible que la configuración no tenga los valores predeterminados de encendido.
  3. Los valores predeterminados de encendido pueden ser diferentes en diferentes procesadores, por lo que configurarlos en el código hace que el código sea más portátil.
  4. Documenta cuáles son los ajustes. Si estos registros se configuran explícitamente al inicio, entonces alguien que mira el código no tiene que buscar en la hoja de datos para ver en qué están configurados.
  5. Documenta que te importa. Deje que el hardware establezca por defecto las configuraciones que no está usando, pero configure explícitamente aquellas en las que confía. Esto puede alertar a algún mantenedor futuro sobre la importancia de esta configuración particular.
Puede valer la pena señalar que si FOO->CTLtiene un valor predeterminado de 0x12345678, y a uno solo le importa tener los bits inferiores configurados en 8, hay una compensación de claridad/espacio de código/rendimiento entre escribir todo el registro en 0x12345678, versus usar algo como maskedwrite32(&(FOO->CTL), BLAH_MASK, BLAH_MODE8);_ Si la rutina de escritura enmascarada incluye código para hacerlo atómico en caso de interrupciones, eso puede hacer que sea más lento de lo necesario, pero mejora la generalidad del código.