InitPuertos();
InitUART();
InitSPI();
InitPWM();
InitTimer();mensa(),ponme(),skri(),sajesal(),ponsea(),recogmateria(),protMASTER(),protSLAVE()+-------+-------+
| var1 | var2 |
+-------+-------+
| var3 |
+-------+-------+
| var10 | var11 | mStr
+-------+-------+
| var12 | |
+-------+-------+
| var10 | var11 | mStr2
+-------+-------+
| var12 | |
+-------+-------+
| nrec |
+-------+-------+((81 / 3) * 3 * 3)getchUSART() - 1las llaves las comento con un
// inicio de..
// fin de..
uso bastantes banderas (flag), muchas banderas, arrays de definiciones de banderas, declaro un int8 y luego declaro cada bit como una bandera, yo lo veo como una forma de organizar el montón de banderas en la medida que van creciendo.
si el código se hace muy extenso, procuro exprimir los códigos que sean repetitivos y envolverlos en funciones, procuro usar variables GLOBALES y muy pocas locales.
las funciones van para un archivo, la declaraciones de las funciones para otro archivo, las interrupciones para otro archivo, las declaraciones de variables globales y constantes para otro archivo, al final tengo un montón de includes al inicio del archivo principal (al que suelo nombrar con el nombre del proyecto)
ah! y nunca hago eso de dibujar diagramas de flujo, no me agradan :?
la verdad no sé si mi forma de escribir códigos para micros sea un insulto para los estándares que usan los profesionales, pero para lo que yo hago me basta. :mrgreen:
iniciatiVa!!!!!
A mí lo que más me interesa de las buenas prácticas y nunca me senté a leer es como dividir los programas en varios .c/.h y dentro de eso usar variables locales y globales. El uso de extern para una variable, etc. Muchas veces me surje dudas de qué cosas van en el .h y que cosas no. Para proyectos grandes (me encuentro programando uno "mediano") es fundamental la división y no siempre lo tengo claro.
si el código se hace muy extenso, procuro exprimir los códigos que sean repetitivos y envolverlos en funciones, procuro usar variables GLOBALES y muy pocas locales.
Si creo que el while es malo abusar y no entiendo esto ya lo probe varias veces
do{ }while(!Input(PIN_C0)) Es todo un fracaso si lo que quiero es que sea instantaneo Siempre se retarda Y no lo entiendo ¿porque si dentro de do{ } no hay nada?
do{ }while(!Input(PIN_C0)) Es todo un fracaso si lo que quiero es que sea instantaneo Siempre se retarda Y no lo entiendo ¿porque si dentro de do{ } no hay nada?
Hacer esto:
xxx
xxx
Reviso condicion, se cumple ir a "Hacer esto", sino continuoSegun un obsoleto compilador DIV 2 Las variables locales las recoge antes que las globales, ¿pasa lo mismo en CCS? Y aunque fuese a si merece hacer esto
- ¿Declarar el nombre de las variables en los prototipos o no ?.
- No creer que todas las variables en distintas plataformas son iguales. Tal ves entre 64/32 bits
- Flotantes y sus limites de representacion.
Casi todos sabemos que NO se debe comparar los mismos en un "es igual a". O por ponerlo en un ejemplo:Código: C
float a = 3.0f; float b = 7.0f; float c = a / b; if ( c == a/b )
En el que Diferencia lo unico que hace es tomar el mayor de esa forma siempre el resultado es positivo.
Lo que encontre dando vueltas por internet es que esto puede variar. Como por ejemplo con GCC y sin optimizacion puede que esto falle y con optimizacion el compilador sea tan inteligente de que al estar tan cerca, realmente deba entrar al if. Pero es depender si uno tiene ganas o no, entonces ¿Como podemos comprar si 2 flotantes son iguales? Lo que hariamos tal ves hariamos algo asi:Código: C
Pero ¿que valor deberiamos poner a epsilon ? Para esto C trae en sus librerias las minima granularidad obtenida por la operacion de cada tipo, es decirn tenemos una para floats, una para double, y una para long double ( que nadie va a usar para microcontroladores xD )
Esto esta en float.h y son puras definiciones. Siemrpe uno pensara, y bueno copio y pego esa definicion a mi archivo. Eso esta MAL. Por que tambien depende de la plataforma que se use, Ejemplos:
dsPIC:Código: C
#define FLT_EPSILON 1.19209290e-07
PIC32:Código: C
#define FLT_EPSILON 3.05176e-05
PIC16/18:Código: C
#define FLT_EPSILON 3.05176e-05
Y mas que nada por supuesto, esto si estamos trantado de ver hasta el ultimo lugar que realmente sean iguales. Pero casi siempre nuestros float depende de variables externas y nunca vamos a tratar con igualdades, sino que con limites usando < ,> ,<= ,>= .
El tema de flotantes es LARGO, bastante LARGO.. especialmente en operaciones el cual uno pierde bits al hacerlo de una u otra forma
- Bajo todo motivo Desconfia de lo que viene del exterior.
... tal ves le pase que su terminal en ves de enviar "\r" solo envie "\n\r"
- Usar los errores devuelto por las funciones.
Sigamos con el ejemplo anterior, Bueno entonces supongamos que esta ves me aseguro, modifico gets() o creo mi propia funcion que solamente reciba los caracteres que le digo y/o hasta que encuentre una "\r". pero esta ves un caracter fallo y en ves de recibir un 2, recibi una letra, algo asi "1S34\r".
Mi programa va a creer que recibio un 0, cuando no fue asi. atoi() me va a devolver 0 al no poder convertirlo en un int. Esto deberia tener un if que revise y actue acorde.
Tambien podria haber realizado a mi gets() modificado que me devuelva un error en caso de no cumplirse el limiteCódigo: C
char buffer[6]; char buffer2[3]; void func(void){ int valor, temp; temp = getsModificado(buffer,5); if(temp = 0) { // Error, se llego a 5 valores y no hubo una \r } if ( valor == 0) { // Error, el valor devuelto no posee unicamente numeros. } //uso valor }
- No especificar limites cuando se inicializa un string.Código: C
char texto[] = "C se encargara de esto";
- Flotantes y sus limites de representacion.
Esto no se soluciona con los tipos genéricos uint8_t, int8_t, uint16_t, etc, etc?
Esto lo vi en un apunte de teoría de filtros, creo. No sé si era un moving average o alguno de esos, donde el error de representacion del float se hacía muy evidente despues de dejar al filtor funcionando unas horas... mostraban que a veces se obtiene mejor resultado con int's teniendo cuidad que con floats siendo descuidados... Si lo encuentro lo pongo como ejemplo.
Por que retorna esos valores?, busque por internet y no encontre respuesta, o no supe buscar xD
static void (* const puntero[])(void)
puntero[] puntero es un array
const constante
* de punteros
(void) a funciones con parametros void
void y que devuelven void8 bytes.. una plataforma de 64 bits ? o es que tal ves sean 32 y tenga algo mas ?
http://embeddedgurus.com/stack-overflow/2008/06/efficient-c-tips-1-choosing-the-correct-integer-size/