mirando el enlace de detalles de la pregunta Macros, Direcciones base y funciones de API, hay varias preguntas. Lo intentaré desde abajo
Incluso aquí:
#definir USART1 ((USART_TypeDef *) USART1_BASE) / ** <puntero base USART1 * /
- ¿Qué tan relevante es C # en el mundo de los sistemas integrados?
- ¿Cuál es el sistema integrado más barato?
- ¿Cómo progresaremos en la visión de dispositivos con recursos limitados (sistemas integrados), considerando la adopción de Deep Learning? También el estado actual?
- ¿Es bueno usar Buck Converter para suministrar microcontrolador?
- ¿Cuáles son los temas importantes para la entrevista del desarrollador integrado?
El paso de la estructura como primer parámetro (y la dirección base como segundo parámetro) a la macro solo es relevante cuando llamo a esa macro directamente … ¿sí?
No hay parámetros pasados a esta macro, y la macro no se “llama”. Las macros son reemplazos de texto realizados por el preprocesador, antes de la compilación.
El preprocesador escanea el archivo fuente y reemplaza cada aspecto del token USART1
con, letra por letra (técnicamente, token por token) el texto ((USART_TypeDef *) USART1_BASE)
(los comentarios se ((USART_TypeDef *) USART1_BASE)
en un pase anterior). Como USART1_BASE
también es una macro, se reemplaza letra por letra con su contenido, que era (0x4000C400UL)
.
Entonces, cuando su código fuente tiene
USART1-> RUTA
El código fuente real que verá el compilador es:
(USART_TypeDef *) (0x4000C400UL) -> RUTA
Que toma esa dirección fija, la convierte en un puntero a esa estructura y accede a un miembro de esa estructura imaginada a través de ese puntero.
Será útil aprender cómo expandir las macros usted mismo para que pueda leer el mismo código fuente que leerá el compilador: para gcc, clang e intel es la opción -E.
Para Visual Studio es la opción /E