Encuentro el estilo de codificación en el STM32F0 (microcontrolador ARM Cortex-M0) SPL (biblioteca de periféricos estándar) innecesariamente detallado. A modo de ejemplo, aquí hay un fragmento de código para configurar el bucle de fase bloqueada para SYSCLK:
/* Select PLL as system clock source */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
Donde RCC_CFGR_SW
y RCC_CFGR_SW_PLL
son macros para literales enteros ya convertidos a uint32_t
.
#define RCC_CFGR_SW ((uint32_t)0x00000003)
#define RCC_CFGR_SW_PLL ((uint32_t)0x00000002)
Y RCC->CFGR
es una instancia (asignada en memoria) de una estructura del tipo
typedef struct
{
...
__IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x04 */
...
} RCC_TypeDef;
Por lo tanto, el resultado se emitirá implícitamente a uint32_t
de todos modos, incluso dará una advertencia si ocurre algo gracioso (a diferencia de lo que sucedería con un reparto explícito).
¿Se pueden eliminar estos lanzamientos explícitos, especialmente dado que C99 garantiza (6.3.1.3) que
- Cuando un valor con tipo entero se convierte en otro tipo entero distinto de _Bool, si el valor puede representarse por el nuevo tipo, no se modifica.
Permitir la simplificación del código para que sea significativamente más claro
//Select the PLL as system clock source
RCC->CFGR &= ~(RCC_CFGR_SW);
RCC->CFGR |= RCC_CFGR_SW_PLL;
¿O podría causar algunos efectos secundarios imprevistos? No estoy seguro, y supongo que las personas que escribieron ese código tienen más experiencia en la escritura de C incrustada que yo ...
Estoy haciendo esta pregunta en electronics.stackexchange en lugar de stackoverflow, ya que es bastante específico para la programación integrada de bajo nivel.