C Para Sistemas Embebidos

33
C Para Sistemas C Para Sistemas Embebidos Embebidos Básico del C Básico del C

description

Configuracion de sistemas embebidos

Transcript of C Para Sistemas Embebidos

Page 1: C Para Sistemas Embebidos

C Para Sistemas C Para Sistemas EmbebidosEmbebidos

Básico del CBásico del C

Page 2: C Para Sistemas Embebidos

Antes de Escribir el Antes de Escribir el Código CCódigo C

Se comienza con una lista de entradas y Se comienza con una lista de entradas y salidas. Se especifica el rango de valores salidas. Se especifica el rango de valores y su significado.y su significado.

Se hace una lista de las estructuras de Se hace una lista de las estructuras de datos requeridos. Las estructuras de datos requeridos. Las estructuras de datos son utilizadas para salvar datos son utilizadas para salvar información. Si el dato tiene que ser información. Si el dato tiene que ser permanente, entonces son localizados en permanente, entonces son localizados en un espacio global. Si el software cambiará un espacio global. Si el software cambiará su valor entonces se localizará en el RAM.su valor entonces se localizará en el RAM.

Page 3: C Para Sistemas Embebidos

Antes de Escribir el Antes de Escribir el Código CCódigo C

Seguidamente se desarrolla el algoritmo Seguidamente se desarrolla el algoritmo del software, el cual es una secuencia del software, el cual es una secuencia de operaciones que queremos que se de operaciones que queremos que se ejecute. Diagrama de flujo y ejecute. Diagrama de flujo y seudocódigo son dos formatos seudocódigo son dos formatos descriptivo común. No existe regla descriptivo común. No existe regla formal para el seudo-código, debido a formal para el seudo-código, debido a que es una escritura corta para que es una escritura corta para describir que hacer y cuando hacerlo.describir que hacer y cuando hacerlo.

La última etapa es el “debbuging”La última etapa es el “debbuging”

Page 4: C Para Sistemas Embebidos

Estructura de Estructura de Codificación CCodificación C

Un programa en C básicamente Un programa en C básicamente tiene el siguiente formato:tiene el siguiente formato: Comando del PreprocesadorComando del Preprocesador Definiciones de TipoDefiniciones de Tipo Prototipos de funciónPrototipos de función VariablesVariables FuncionesFunciones

Debemos tener una función main()

Cada línea de comando debe

terminar en punto y coma

(;)

Page 5: C Para Sistemas Embebidos

Directivas del Directivas del PreprocesadorPreprocesador Las directivas del preprocesador comienzan con Las directivas del preprocesador comienzan con

## en la primera columna. en la primera columna.Directiva Descripción

#include Permite añadir código fuente escrito en un archivo al archivo que actualmente se está escribiendo

#define Se utiliza para asociar identificadores con una secuencia de caracteres, éstos pueden ser una palabra reservada, una constante, una sentencia o una expresión.

#undef Remueve una variable o definición de función

#line Se utiliza principalmente para controlar el nombre del archivo y el número de líneas que se visualiza siempre que se emite un mensaje de error por el compilador.

#error Está asociada a la compilación condicional. En caso de que se cumpla una condición se escribe un mensaje: #error texto

#pragma Previene la ejecución automática de cierta verificación de error y de rutinas de cobertura que no son necesarias cuando el programa ha sido perfeccionado.

Page 6: C Para Sistemas Embebidos

Directivas del Directivas del PreprocesadorPreprocesador

Compilación CondicionalCompilación Condicional

Directiva Descripción

#if Una posibilidad, condición, o estipulación

#ifdef permite una sección de un programa ser compilada sólo si el macro que es especificado como el parámetro ha sido definido, no importa su valor

#ifndef Sólo es compilado si la identificación especificada no ha sido definida anteriormente

#elif Para especificar alguna condición para ser encontrada en el orden para que la porción de código que lo rodean sea compilado

#else

#endif

Page 7: C Para Sistemas Embebidos

Declaraciones y Declaraciones y DefinicionesDefiniciones

Una declaración de una función especifica su Una declaración de una función especifica su nombre, sus parámetros de entrada y sus nombre, sus parámetros de entrada y sus parámetros de salida. Otro nombre para una parámetros de salida. Otro nombre para una declaración de función es “prototype”. Una declaración de función es “prototype”. Una declaración de estructura de dato especifica su declaración de estructura de dato especifica su tipo y forma.tipo y forma.

Una definición de función genera código objeto. Una definición de función genera código objeto. Una definición de estructura de dato reserva Una definición de estructura de dato reserva espacio en memoria para él. La parte confusa es espacio en memoria para él. La parte confusa es que la definición repetirá las especificaciones de que la definición repetirá las especificaciones de la declaración. Podemos declarar algo sin la declaración. Podemos declarar algo sin definirlo, pero no podemos definirlo sin definirlo, pero no podemos definirlo sin declararlo.declararlo.

Page 8: C Para Sistemas Embebidos

Funciones en CFunciones en C

Una función es una secuencia de Una función es una secuencia de operaciones que pueden ser invocados operaciones que pueden ser invocados desde otros lugares dentro del software.desde otros lugares dentro del software.

Una declaración de función tiene dos Una declaración de función tiene dos partes: un declarador y un cuerpo. El partes: un declarador y un cuerpo. El declarador da el nombre de la función y declarador da el nombre de la función y los nombres de los argumentos los nombres de los argumentos transferidos a estas. El nombre del transferidos a estas. El nombre del argumento solo se usa dentro de la argumento solo se usa dentro de la función.función.

Page 9: C Para Sistemas Embebidos

Funciones en CFunciones en C

Una función tiene la formaUna función tiene la forma

Page 10: C Para Sistemas Embebidos

Funciones en CFunciones en C

Los paréntesis son necesarios Los paréntesis son necesarios incluso cuando no hay argumentos. incluso cuando no hay argumentos. Cuando no hay parámetros un “void” Cuando no hay parámetros un “void” o nada puede ser especificado.o nada puede ser especificado.

El cuerpo de la función consiste de El cuerpo de la función consiste de declaraciones que hacen el trabajo. declaraciones que hacen el trabajo. Normalmente el cuerpo es un Normalmente el cuerpo es un compendio de declaraciones entre compendio de declaraciones entre un par de { }.un par de { }.

Page 11: C Para Sistemas Embebidos

C Para Sistemas C Para Sistemas EmbebidosEmbebidosVariablesVariables

El El tipotipo de una variable determina de una variable determina qué clases de valores puede tomar. qué clases de valores puede tomar. Es decir, seleccionando un tipo para Es decir, seleccionando un tipo para una variable es tan cercano a la una variable es tan cercano a la manera (maneras) como estaremos manera (maneras) como estaremos utilizando esa variable.utilizando esa variable.

Page 12: C Para Sistemas Embebidos

Seleccionando un TipoSeleccionando un Tipo

Hay varias implicaciones que recordar:Hay varias implicaciones que recordar: El “set de valores” es finito. El tipo int de C El “set de valores” es finito. El tipo int de C

no puede representar todos los enteros; su no puede representar todos los enteros; su tipo float no puede representar todos los tipo float no puede representar todos los números de punto-flotante.números de punto-flotante.

Al declarar una nueva variable y escoger un Al declarar una nueva variable y escoger un tipo para ello, usted tiene que tener tipo para ello, usted tiene que tener presente los valores y las operaciones que presente los valores y las operaciones que usted estará necesitando.usted estará necesitando.

Page 13: C Para Sistemas Embebidos

Tipos Básicos de Data en Tipos Básicos de Data en CC

Hay sólo unas pocas clases básicas de datos en C:

Page 14: C Para Sistemas Embebidos

Tipos de Datos en Tipos de Datos en CodeWarriorCodeWarriorEl estándar de ANSI no define precisamente el tamaño de

sus tipos nativos, pero CodeWarrior lo hace...

Page 15: C Para Sistemas Embebidos

Hechos de los Tipos de Hechos de los Tipos de DatoDato

Los ahorros más grandes en el tamaño de código y tiempo Los ahorros más grandes en el tamaño de código y tiempo de ejecución pueden ser hechos escogiendo, para las de ejecución pueden ser hechos escogiendo, para las variables, los tipos de datos apropiados.variables, los tipos de datos apropiados.

Los datos internos naturales para un MCU de 8 bits es de Los datos internos naturales para un MCU de 8 bits es de 8 bits (un byte), mientras que el tipo de dato preferido de 8 bits (un byte), mientras que el tipo de dato preferido de C es "int".C es "int".

Las máquinas de 8 bits pueden procesar los tipos de datos Las máquinas de 8 bits pueden procesar los tipos de datos de 8 bits más eficientemente que los tipos de 16-bit.de 8 bits más eficientemente que los tipos de 16-bit.

"Int" y los tipos de datos más grande sólo deben ser "Int" y los tipos de datos más grande sólo deben ser utilizados por requerimiento del tamaño de datos a utilizados por requerimiento del tamaño de datos a representar.representar.

Doble precisión y las operaciones de punto flotantes son Doble precisión y las operaciones de punto flotantes son particularmente ineficaces y debe ser evitado particularmente ineficaces y debe ser evitado dondequiera la eficiencia es importante.dondequiera la eficiencia es importante.

Page 16: C Para Sistemas Embebidos

Selección del Tipo de Selección del Tipo de DatosDatos

Hay Hay 3 Reglas 3 Reglas para la Selección del Tipo para la Selección del Tipo de Datos en MCUs de 8 bits:de Datos en MCUs de 8 bits: Utilice el tipo más Utilice el tipo más pequeñopequeño posible para posible para

realizar el trabajo.realizar el trabajo. Utilice el tipo “Utilice el tipo “unsignedunsigned” si es posible.” si es posible. El uso de “El uso de “castscasts” dentro de expresiones ” dentro de expresiones

para reducir los tipos de datos al mínimo para reducir los tipos de datos al mínimo necesario.necesario.

Utilice “Utilice “typedefstypedefs” para tener un tamaño ” para tener un tamaño fijo.fijo.

Page 17: C Para Sistemas Embebidos

Palabras ClavesPalabras Claves

Page 18: C Para Sistemas Embebidos

Operadores en COperadores en C

Page 19: C Para Sistemas Embebidos

¿Cómo se Definen los ¿Cómo se Definen los Registros Internos?Registros Internos?

Existen varias formas de definir un Existen varias formas de definir un registro:registro: #define PortB *(volatile unsigned #define PortB *(volatile unsigned

char*)0x0001;char*)0x0001; VolatileVolatile indica que el valor de la variable puede indica que el valor de la variable puede

cambiar sin intervención del programa en C.cambiar sin intervención del programa en C. (volatile unsigned char*)(volatile unsigned char*)0x0001 indica que es un 0x0001 indica que es un

puntero a unsigned char.puntero a unsigned char. *(volatile unsigned char*)*(volatile unsigned char*)0x0001 es el contenido 0x0001 es el contenido

de la posición donde apunta el puntero 0x0001, de la posición donde apunta el puntero 0x0001, es decir, es el contenido de la dirección 0x0001.es decir, es el contenido de la dirección 0x0001.

Page 20: C Para Sistemas Embebidos

¿Cómo se Definen los ¿Cómo se Definen los Registros Internos?Registros Internos?

Volatile unsigned char PortB@0x0001;Volatile unsigned char PortB@0x0001; Definición utilizando una extensión del Definición utilizando una extensión del

compilador.compilador. Se pierde portabilidad.Se pierde portabilidad.

Otra formaOtra forma #define BYTE_REG*(Volatile unsigned #define BYTE_REG*(Volatile unsigned

char*)char*) #define PortB BYTE_REG 0x0001;#define PortB BYTE_REG 0x0001; #define DDRB BYTE_REG 0x0005;#define DDRB BYTE_REG 0x0005;

Page 21: C Para Sistemas Embebidos

¿Cómo se Definen los ¿Cómo se Definen los Registros Internos?Registros Internos?

Se pueden definir registros de 8bits Se pueden definir registros de 8bits y 16bitsy 16bits #define T1CNTH*(volatile unsigned #define T1CNTH*(volatile unsigned

char*)0x0021;char*)0x0021; #define T1CNTL*(volatile unsigned #define T1CNTL*(volatile unsigned

char*)0x0022;char*)0x0022; #define T1CNT*(volatile unsigned #define T1CNT*(volatile unsigned

int*)0x0021;int*)0x0021;

Page 22: C Para Sistemas Embebidos

¿Cómo se Definen los ¿Cómo se Definen los Registros Internos?Registros Internos?

Es muy útil definir los registros como Es muy útil definir los registros como unionesuniones

Volatile union{Volatile union{

struc{struc{

unsigned char_PB0:1;unsigned char_PB0:1;

unsigned char_PB1:1;unsigned char_PB1:1;

unsigned char_PB7:1;unsigned char_PB7:1;

} PortB_BITS;} PortB_BITS;

Unsigned char PortB_BYTE;Unsigned char PortB_BYTE;

} PortB_@0x0001;} PortB_@0x0001;

Page 23: C Para Sistemas Embebidos

¿Cómo se Definen los ¿Cómo se Definen los Registros Internos?Registros Internos?

#define PortB PortB_.PortB_BYTE#define PortB PortB_.PortB_BYTE #define PB0 PortB_.PortB_BITS._PB0#define PB0 PortB_.PortB_BITS._PB0 #define Led_0 PortB_.PortB_BITS._PB0#define Led_0 PortB_.PortB_BITS._PB0

Ejemplo de Asignación:Ejemplo de Asignación:

PortB = 0xAA;PortB = 0xAA;

Led_0 = 0;Led_0 = 0;

Page 24: C Para Sistemas Embebidos

¿Cómo se Define una ¿Cómo se Define una Función de Interrupción?Función de Interrupción? Cada fuente de interrupción tiene Cada fuente de interrupción tiene

asociado un vector de interrupción.asociado un vector de interrupción. Las rutinas de interrupción son Las rutinas de interrupción son

llamadas por el hardware y nunca por llamadas por el hardware y nunca por otro función.otro función.

Las interrupciones siempre son:Las interrupciones siempre son:

Interrupt N void ISR_nombre(void){….}Interrupt N void ISR_nombre(void){….}

Page 25: C Para Sistemas Embebidos

¿Cómo se Define una ¿Cómo se Define una Función de Interrupción?Función de Interrupción?

No devuelven valoresNo devuelven valores No aceptan parámetrosNo aceptan parámetros

La definición depende del La definición depende del compiladorcompilador

Ejemplo:Ejemplo:

Interrupt 17 void ISR_TBM(void){….}Interrupt 17 void ISR_TBM(void){….}

Page 26: C Para Sistemas Embebidos

Beneficio del C en Beneficio del C en Sistemas EmbebidosSistemas Embebidos

No serás abrumado por detallesNo serás abrumado por detalles Aprenderás lo básico de la portabilidadAprenderás lo básico de la portabilidad

El costo de modificar el código del lenguaje El costo de modificar el código del lenguaje ensamblador que haga que un programa escrito ensamblador que haga que un programa escrito para un microcontrolador corra en un para un microcontrolador corra en un microcontrolador diferente podrá quitarle microcontrolador diferente podrá quitarle cualquier incentivo para hacer el cambio.cualquier incentivo para hacer el cambio.

Reducir costo a través de técnicas de Reducir costo a través de técnicas de programación tradicional.programación tradicional.

Pasar más tiempo en el diseño de algoritmo Pasar más tiempo en el diseño de algoritmo y menos tiempo en la implementacióny menos tiempo en la implementación

Page 27: C Para Sistemas Embebidos

Accesando Registros de Accesando Registros de la CPUla CPU

Los registros en la CPU no están Los registros en la CPU no están mapeados en la memoria.mapeados en la memoria.

El juego de instrucciones contiene un El juego de instrucciones contiene un subjuego por el cual permite la subjuego por el cual permite la modificación de todos ellos.modificación de todos ellos.

C no provee una herramienta directa C no provee una herramienta directa para acceder los registros de la CPU.para acceder los registros de la CPU.

El compilador de C permite la utilización El compilador de C permite la utilización de instrucciones en ensamblado entre el de instrucciones en ensamblado entre el código C.código C.

Page 28: C Para Sistemas Embebidos

Operaciones Lógicas con Operaciones Lógicas con BitsBits

MáscarasMáscaras MáscaraMáscara• Se utiliza para indicar los bits que se Se utiliza para indicar los bits que se

quieren poner a uno o a cero en una quieren poner a uno o a cero en una variable o puerto.variable o puerto.

• Ejemplo: máscara para modificar los Ejemplo: máscara para modificar los bits 2 y 6 de un bytebits 2 y 6 de un byte

––En binario: 0b01000100En binario: 0b01000100

––En hexadecimal: 0x44En hexadecimal: 0x44

Page 29: C Para Sistemas Embebidos

Operaciones Lógicas con Operaciones Lógicas con BitsBits

MáscarasMáscaras Para poner bits a uno sin modificar el Para poner bits a uno sin modificar el

restoresto

variable |= 0b01000100;variable |= 0b01000100;••Se hace una OR bit a bit: variable = variable| Se hace una OR bit a bit: variable = variable| 0b01000100;0b01000100;

Para poner bits a cero sin modificar el Para poner bits a cero sin modificar el restoresto

variable &= variable &= 0b01000100; 0b01000100;••Se hace una AND bit a bit con el complemento a Se hace una AND bit a bit con el complemento a uno de la máscarauno de la máscara

••variable = variable & (variable = variable & ( 0b01000100); 0b01000100);

Page 30: C Para Sistemas Embebidos

Operaciones Lógicas con Operaciones Lógicas con BitsBits

MáscarasMáscaras Para cambiar bits sin modificar el Para cambiar bits sin modificar el

restoresto

variable ^= 0b01000100;variable ^= 0b01000100;••Se hace una XOR bit a bit con la máscaraSe hace una XOR bit a bit con la máscara

••variable = variable^ 0b01000100;variable = variable^ 0b01000100;

Page 31: C Para Sistemas Embebidos

Operaciones Lógicas con Operaciones Lógicas con BitsBits

MáscarasMáscaras Desplazamiento de bits en una variableDesplazamiento de bits en una variable

••Siempre se introducen cerosSiempre se introducen ceros

––Si dato = 0b00000010Si dato = 0b00000010

––dato << 3 es 0b00010000 desplazando tres a dato << 3 es 0b00010000 desplazando tres a la izquierdala izquierda

••Si se quiere modificar la variable hay que asignarlaSi se quiere modificar la variable hay que asignarla

––dato <<=3; o lo que es lo mismo dato = dato <<=3; o lo que es lo mismo dato = dato<<3;dato<<3;

••Lo mismo para desplazamiento a la derecha con >>Lo mismo para desplazamiento a la derecha con >>

Page 32: C Para Sistemas Embebidos

Operaciones Lógicas con Operaciones Lógicas con BitsBits

MáscarasMáscaras Comprobación si los bits indicados Comprobación si los bits indicados

en la máscara son unosen la máscara son unos

if(dato & 0b01000100) {..}if(dato & 0b01000100) {..}––Entra en el if cuando alguno de los bits indicados Entra en el if cuando alguno de los bits indicados

en la máscara son unos en datoen la máscara son unos en dato

if(dato & (1<<3)) {..}if(dato & (1<<3)) {..}––Entra en el if cuando el bit3 de dato es Entra en el if cuando el bit3 de dato es

uno. 0b00001000uno. 0b00001000

Page 33: C Para Sistemas Embebidos

Operaciones Lógicas con Operaciones Lógicas con BitsBits

MáscarasMáscaras Comprobación si los bits indicados Comprobación si los bits indicados

en la máscara son cerosen la máscara son ceros

if(if((dato | ((dato | ( 0b01000100))) {..} 0b01000100))) {..}––Entra en el if cuando alguno de los bits indicados Entra en el if cuando alguno de los bits indicados

en la máscara son ceros en datoen la máscara son ceros en dato

if(!(dato & (1<<3))) {..}if(!(dato & (1<<3))) {..}––Entra en el if cuando el bit 3 de dato es Entra en el if cuando el bit 3 de dato es

cero.cero.