Cómo escribir un código C eficiente para un firmware [cerrado]

-1

Esta pregunta es sobre programación, pero sobre programación electrónica, así que pensé en publicarla aquí en lugar de stackoverflow . Acabo de empezar mis proyectos de electrónica. He diseñado dos aplicaciones y he hecho su parte de hardware y firmware yo mismo. Aquí, en esta pregunta, quiero saber cómo escribir un programa de C eficiente y cómo administrar todos los archivos del proyecto.

Digamos en una aplicación, tenemos las siguientes partes:

  1. GPIOs
  2. Comunicación en serie
  3. RTC (Comunicación I2C)
  4. Tarjeta SD (SPI Communication)

La forma en que trabajo es crear diferentes archivos para cada módulo. Me gusta para Serial Communication :

//serial.c  

//function to initialize serial communication
void serialInit()
{

}
//function to send data
void serialSend()
{

}
//function to receive data
void serialReceive()
{

}

Así que en serial.c he hecho todas las funciones necesarias para la comunicación en serie.

//serial.h

void serialInit();
void serialSend();
void serialReceive();

/*
* All the variable used in serialInit(), serialSend(), serialReceive().
* char rxData = 0;
* int i,j=0; ..etc
*/

y en serial.h incluyo todas las variables utilizadas en serial.c . Lo mismo ocurre con cada archivo como rtc.c rtc.h sdcard.c sdcard.h . I main.c Incluyo todos los archivos de encabezado:

//main.c
#include "serial.h"
#include "rtc.h"
#include "sdcard.h"

main.c contiene toda la parte de lógica y programación. Todas las variables utilizadas dentro de main.c se definen en main.h. Ahora el problema ocurre aquí alguna vez. Como main.h contiene todas las variables y si necesito incluir main.h en cualquier otro archivo fuente, da error: multiple definition . He buscado este error y he encontrado muchas soluciones a él. Quiero saber la eficacia de manejar este problema. ¿Cuáles son algunas buenas prácticas para el diseño de firmwares. Es la forma en que estoy escribiendo es la manera correcta o no. ¿Cuáles son otros métodos para manejar los principales firmwares integrados?

    
pregunta S Andrew

1 respuesta

4

En general, su división de funcionalidad entre los diferentes archivos se ve bien, pero no debe definir variables en un archivo .h.
El archivo .h es más para compartir variable & Funciones con otros módulos.
Por lo tanto, solo las variables que desee compartir deben aparecer en su archivo .h, y todas deben declararse con 'extern' como la primera palabra en la declaración.
Las variables que solo se utilizan dentro del archivo .c correspondiente deben no declararse en el archivo .h.
Las declaraciones de funciones no necesitan un extern.

Por lo tanto, para tu ejemplo de serial.h, lo que deberías tener es algo como:

//serial.h

void serialInit();
void serialSend();
void serialReceive();

/*
* variables which are exposed to other modules in your code
*/
extern char rxData = 0;  

/* These variables are not exposed and only used inside serial.c
*  They're only here as an example and should be deleted from this .h file entirely
*  int i,j=0;   
*/

Tenga en cuenta que no declarar una variable en un archivo .h en realidad no impide que otro módulo de código acceda a él si "lo sabe".
La forma de evitar que otros módulos accedan a variables 'privadas' es declararlos como 'estáticos' en su archivo .c.
Esto hace que la variable siga siendo "global" dentro de ese archivo, pero inaccesible desde el exterior.

Cuando declara funciones en un archivo .h, puede declararlas como lo ha hecho sin parámetros especificados, simplemente usando (), si sus funciones no tienen parámetros.
Prefiero definir explícitamente los parámetros que espera cada función, por ejemplo:

void serialSend(void *buf, int len);  

o

void serialSend(void);  

si tu función realmente no toma ningún parámetro.

Esto le permite al compilador comprobar que cuando llamas a esta función está pasando el tipo correcto & número de parámetros.
El solo uso de () significa que se le permite llamar a la función con tantos parámetros del tipo que desee, aunque no tome ninguno.

    
respondido por el brhans

Lea otras preguntas en las etiquetas