Visual Studio y Estructuras

2

Estoy tratando de trasladar una aplicación escrita para un micro a Visual Studio para poder ejecutar más fácilmente el depurador y escanear el código, en lugar de depurar en el chip, lo cual es un poco molesto cuando se quiere saber cómo funciona la aplicación. fue escrito. No soy en absoluto un gurú de la programación, y sigo recibiendo este error, que figura a continuación, que está relacionado con una estructura:

error C2059: syntax error : '.'

El código está en la lista a continuación, ¿puede alguien apuntarme en la dirección correcta?

typedef struct usart_reg_map 
{
    volatile uint32 SR;
    volatile uint32 DR;
    volatile uint32 BRR;
    volatile uint32 CR1;
    volatile uint32 CR2;
    volatile uint32 CR3;
    volatile uint32 GTPR;
}usart_reg_map;

#define USART1_BASE ((struct usart_reg_map*))

typedef struct usart_dev 
{
    usart_reg_map *regs;
}usart_dev;

struct usart_dev usart1 =
{
    .regs = USART1_BASE, 
};

usart_dev *USART1 = &usart1;

fuente
2
Es probablemente .regs = USART1_BASE, que parece no estándar, pero ninguno de ese código UART funcionará en una PC sin muchos cambios.
PeterJ
3
@PeterJ es un designated initializer. El OP debe asegurarse de que los indicadores del compilador estén configurados para admitir C99, que es el estándar que agregó esto.
4
Mi punto principal es que, si compila, no funcionará de todos modos en una PC: cuando intentes acceder a 0x40013800 obtendrás una infracción de acceso porque no es donde está una UART de una PC y, bajo Windows, necesitas acceder a un puerto de comunicaciones completamente. De otra manera, por ejemplo, lo abres con un Win32. CreateFile llamada.
PeterJ
1
Visual Studio no es totalmente compatible con C99 y no tiene la intención de hacerlo. Le recomendaría encarecidamente que considere utilizar otro compilador, por ejemplo, GCC.
Morten Jensen
1
En general, parece que debería invertir en un mejor depurador en circuito para su MCU. Confíe en mí, no hay mejor manera de aprender que ejecutar el código en el hardware real. Parece que la raíz de su problema es una cadena de herramientas tóxicas como Eclipse, en cuyo caso la solución es obtener algo mejor.

Respuestas:

1

En todos los casos es mucho trabajo, pero es posible:

  1. Averigüe qué clases, estructuras, tipos y funciones necesita de las micro bibliotecas.
  2. Cree archivos para ellos, similares a las bibliotecas de micros, preferiblemente sobre la misma estructura de archivos, pero en una ubicación diferente. Estos solo se ejecutarán en la versión para PC.
  3. Cree un nuevo proyecto para el entorno no micro, donde se usan los archivos del paso 2 en lugar de 1. Esto se puede hacer cambiando la ruta de inclusión probablemente.

En el paso 2, puede hacer incluso algo de inteligencia en las funciones si desea probar eso. Además, no necesita cambiar ningún archivo que se ejecute en el micro que usted mismo creó, porque solo las micro bibliotecas tienen una contraparte de PC.

Acerca de C99, asegúrese de no usar las funciones específicas de C99 en el código genérico (su código del microcontrolador) y, si lo necesita, cree ese código en funciones separadas que pueda transferir a VS o tal vez no sean necesarias Como forman parte de las bibliotecas de microcontroladores o funciones de fachada.

Michel Keijzers
fuente
Sí, tu correcto, es mucho trabajo. Acabo de leer en otra publicación. C99 no es compatible con VS for C, así que perdí mi entusiasmo, ya que hay docenas de estas estructuras y algunas son muy largas.
pero solo necesitas agregar lo que usas directamente. Lo que también podría hacer, pero también es complicado, es hacer algunas funciones genéricas con tipos de parámetros de entrada conocidos por el microcontrolador y VS, y en el microcontrolador asignarlos a los tipos reales de microcontroladores; esto significa que tienes que hacer clases / funciones extra de 'fachada' en el medio.
Michel Keijzers
acerca de C99, asegúrese de no usar las funciones específicas de C99 en el código genérico (su código del microcontrolador) y, si lo necesita, cree ese código en funciones separadas que pueda transferir a VS o tal vez no sean necesarias Como forman parte de las bibliotecas de microcontroladores o funciones de fachada.
Michel Keijzers
Buen consejo Michel.
1

Hay dos cuestiones a considerar:

  • Lo más probable es que esté compilando el código como C ++. Pero C ++ no es C y viceversa, no son lenguajes compatibles. Debe imponer la compilación de C, que normalmente se hace al nombrar su archivo .c en lugar de .cpp.

  • Incluso en el modo C, Visual Studio tiene un soporte horrible para el estándar C. El . La sintaxis de inicialización se conoce como inicializadores designados y se introdujo en el año 1999. Sin embargo, Microsoft ha insistido en no actualizar su compilador de C, hasta hace algunos años un intento poco entusiasta. Pueden o no pueden apoyar inicializadores designados, no lo sé.

Recomendaría encarecidamente a cualquier programador principiante que use un compilador estándar compilante en su lugar. Puede decirle a VS que use el compilador gcc en lugar del crap predeterminado, o puede descargar otro IDE como Codeblocks, que viene con gcc / mingw preinstalado por defecto.


fuente
Secundo esto. Obtenga una cadena de compilación basada en GCC para Windows, si desea compilar C99.
Morten Jensen
0

Su problema específico es porque, como ha descubierto, el inicializador designado .regs = USART1_BASE No funciona en Visual Studio.

Normalmente uso GCC y un makefile al probar mis proyectos de microcontroladores en Windows. Esto parece funcionar mucho mejor cuando se intenta usar características de un estándar específico como C99.

Como han señalado otros, es probable que tenga que hacer mucha refactorización para que todo su proyecto se ejecute en Windows. Por lo general, dividí mi proyecto en módulos simples que puedo compilar y probar en Windows con GCC, y luego combino esos módulos bien probados en una aplicación más grande que puedo ejecutar y probar en el dispositivo de destino.

cholz
fuente