Escribiendo un programa para diferentes microcontroladores

2

Tengo 2 microcontroladores totalmente diferentes (uno es MSP de 16 bits y otro nórdico de 32 bits). Se supone que deben hacer la misma tarea y pensé que tal vez sería posible escribir un programa en lenguaje C y luego usar diferentes compiladores mientras los programaba. Obtuve algunos archivos xxx.h comunes con diferentes implementaciones de origen para cada dispositivo, por lo que parte del código se vería exactamente igual. La diferencia es cuando se trata de escribir registros internos y esa parte del código tiene que ser diferente para cada dispositivo, por lo que he pensado en introducir una macro que apunte a qué microcontrolador quiero compilar el código. Entonces podría utilizar la directiva #ifdef dentro de los archivos de origen para llevar la compilación condicional. No tengo experiencia con tal programación, así que necesito algunos consejos, ¿es una buena idea o es mejor escribir un programa para cada microcontrolador?

    
pregunta Al Bundy

2 respuestas

5

El truco consiste en definir una interfaz que le brinde acceso a los pines de E / S (u otros periféricos y funciones que necesite, y quizás a funciones de retardo). Declara esta interfaz en un archivo .h. Ahora escriba su aplicación en uno o más archivos .c que usan este archivo .h. Escriba dos archivos .c, uno para cada plataforma, que implementen la interfaz para esa plataforma en particular. Cuando compile para una plataforma, compile y vincule con el archivo .c de implementación correcto.

Un posible archivo .h:

bool pin_read( unsigned char pin );
void pin_write( unsigned char pin, bool value );
void configure_pin_as_input(  unsigned char pin );
void configure_pin_as_output(  unsigned char pin );
void delay_us( unsigned int t );

Este enfoque no requiere ningún truco del preprocesador, pero sí impone una sobrecarga de llamada a la función en cada acceso a una función específica de la plataforma. Si esto no es aceptable, puede implementar ambas interfaces como macro en el archivo .h (usando #ifdefs para seleccionar entre ellas).

Otro truco es seguir con el enfoque .h / .c, pero compilar todo el código de la aplicación con la implementación.c incluida, y confiar en el optimizador para eliminar la sobrecarga de llamadas a funciones. Esto requiere dos archivos 'principales' diferentes, uno para el destino de 16 bits

// main.c for MSP430
#include "interface.h"
#include "msp430-interface.c"
#include "application.c"

y uno para el otro objetivo

// main.c for Cortex-M0
#include "interface.h"
#include "CortexM0-interface.c"
#include "application.c"

Personalmente, prefiero que C ++ aborde estos problemas y, esencialmente, uso el último enfoque, que es bastante normal para la programación basada en plantillas de C ++ (las plantillas deben estar en el archivo .h). (Vea esto artículo y este video para mi enfoque)

    
respondido por el Wouter van Ooijen
4

Bueno, imagino que el programa que está haciendo tiene la misma funcionalidad en ambos microcontroladores.

Primero, escribiría las partes genéricas del código, las que no dependen de la arquitectura. Cuando escriba o recupere datos de un dispositivo específico desde el microcontrolador o incluso acceda a registros particulares del procesador, llamará a una función.

En el archivo .c que implementa esta función, debería hacer la #ifdef con una variable que defina la arquitectura para seleccionar entre la función para el microcontrolador X y la para Y.

Tal vez tendrá que estandarizar la interfaz de comunicación entre el código genérico y la función específica para poder admitir las particularidades de ambas MCU.

Recuerde que sería eficiente para un programa que tiene muchas partes comunes y un poco específico de la arquitectura.

Otra ventaja tiene que ver con la implementación de nuevas MCU. Si tiene que introducir una tercera arquitectura en su proyecto, simplemente escribiría un par de funciones nuevas, en lugar de volver a escribir todo su código.

    
respondido por el gstorto

Lea otras preguntas en las etiquetas