es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Acceda a la misma variable con 2 dimensiones diferentes usando Uniones.

Tengo el siguiente problema: Estoy utilizando este tipo de estructura para acceder a la misma variable pero con diferentes tamaños.

typedef struct {
union {
struct {
uint16 progressNumber;
};
uint8 progressNumberArr[2];
};
} ProgressNum_t;
ProgressNum_t totalProgressiveNumber;

De esta forma, puedo acceder a una matriz de 8 bits (es útil para comunicaciones SPI) y también para gestionar una variable de 16 bits. En mi caso es un contador, y tengo que gestionar desbordamientos y así sucesivamente…

Este procedimiento funciona bien, pero para las reglas MISRA no se me permite usarlo (porque el comportamiento podría ser indefinido).

¿Tiene alguna sugerencia para tener el mismo “truco” pero compatible con MISRA?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en c, unions, MISRA y type-punning, sugiero utilizar un enfoque diferente para lograr la misma funcionalidad mientras se cumple con MISRA. Una solución podría ser utilizar una función o un macro para acceder a la variable en el formato deseado, en lugar de acceder directamente a través de la unión.

    Por ejemplo, podrías definir un macro de la siguiente manera:

    #define GET_PROGRESS_NUMBER(p) ((p).progressNumberArr[0] << 8 | (p).progressNumberArr[1])
    

    Este macro te permitiría acceder a la variable como un número de 16 bits, mientras aseguras la conformidad con MISRA al no acceder directamente a los miembros de la unión. De manera similar, podrías definir otro macro para establecer el valor de la variable:

    #define SET_PROGRESS_NUMBER(p, val) \
        do { (p).progressNumberArr[0] = (val) >> 8; (p).progressNumberArr[1] = (val) & 0xFF; } while(0)
    

    Este macro establecería el valor de la variable mientras lo divide en sus componentes de 8 bits.

    En conclusión, al evitar el acceso directo a los miembros de la unión y utilizar funciones o macros en su lugar, puedes lograr la misma funcionalidad mientras se cumple con MISRA.

Comments are closed.