Estoy trabajando en un proyecto integrado (objetivo de PowerPC, compilador de Codewarrior Freescale Metrowerks) donde los registros se mapean en memoria y se definen en bonitos campos de bits para facilitar la manipulación de las marcas de bits individuales.¿Qué hace el compilador de C con bitfields?
Por el momento, estamos utilizando esta característica para borrar indicadores de interrupción y controlar la transferencia de datos. Aunque todavía no he notado ningún error, tenía curiosidad de saber si esto es seguro. ¿Hay alguna manera de usar de forma segura los campos de bits, o tengo que ajustar cada uno en DISABLE_INTERRUPTS ... ENABLE_INTERRUPTS?
Para aclarar: la cabecera suministrado con el micro tiene campos como
union {
vuint16_t R;
struct {
vuint16_t MTM:1; /* message buffer transmission mode */
vuint16_t CHNLA:1; /* channel assignement */
vuint16_t CHNLB:1; /* channel assignement */
vuint16_t CCFE:1; /* cycle counter filter enable */
vuint16_t CCFMSK:6; /* cycle counter filter mask */
vuint16_t CCFVAL:6; /* cycle counter filter value */
} B;
} MBCCFR;
Asumo estableciendo un bit en un campo de bits no es atómica. ¿Es esta una suposición correcta? ¿Qué tipo de código realmente genera el compilador para los campos de bits? Realizar la máscara yo mismo usando el campo R (crudo) podría hacer que sea más fácil recordar que la operación no es atómica (es fácil olvidar que una asignación como CAN_A.IMASK1.B.BUF00M = 1
no es atómica).
Su consejo es apreciado.
Estoy en lo correcto al pensar que el '' V' en vuint16_t' significa "volátil"? – JAB
Sí, los tipos son volátiles ya que son todas las ubicaciones de registro mapeadas en memoria. También hay instrucciones de alineación que dejé para mantener las cosas cortas. –
Evite los campos de bits y use la máscara y el desplazamiento en su lugar. – starblue