en el archivo de encabezado core_cm4.h definido algo como esto:
#ifdef __cplusplus
#define __I volatile /*!< Defines 'read only' permissions */
#else
#define __I volatile const /*!< Defines 'read only' permissions */
#endif
#define __O volatile /*!< Defines 'write only' permissions */
#define __IO volatile /*!< Defines 'read / write' permissions */
¿Cuál es la diferencia entre __I, __O y __IO mientras se definen de la misma manera?
"I" significa: Entrada
"O" significa: Salida
"IO" significa: Entrada y Salida
Como señala Long Pham, es una convención de nomenclatura, pero también es normal usar significados para un tipo. Al igual que un número entero, puede ser un contador, una marca de tiempo, una fecha, etc.
Hay algunas razones para usar esto:
Dado que esto es para la definición de un mapa de registro de hardware:
Creo que la razón es que C, a diferencia de C++, permite la declaración de const
variables calificadas sin proporcionar un inicializador:
volatile const uint32_t REG; // Ok in C, invalid in C++
Del mismo modo, C ++ tampoco permite que const
los miembros de struct/classes no se inicialicen. Esto es un inconveniente cuando tenemos registros de hardware de solo lectura y deseamos hacer un mapa de registros usando estructuras (clases).
Es probable que esta limitación del lenguaje C++ sea la razón por la que este encabezado usa un truco sucio #ifdef __cplusplus
para eliminar const
de un registro que debería haberse const
calificado.
Este archivo de encabezado también se creó para admitir c ++,
Por lo tanto, en el caso de la variable const de C , se indica como constante y el usuario no puede modificarla. Sin embargo, el compilador de C no realiza ninguna optimización adicional para esta variable const .
Pero en el caso de C++, esta variable constante puede ser reemplazada por el valor constante asignado a esa variable.
En el caso de que las variables miembro de la estructura de c ++ no estén optimizadas, por lo tanto, const se puede usar allí.
Por lo tanto, este archivo de encabezado proporciona __I,__O, __IO para las variables escalares y
__IM,__OM,__IOM para los miembros de la estructura.
Pham largo