8 Programacion en C Para Sistemas Embebidos

70
Programación en “C” para Sistemas Embebidos Aplicado sobre la Plataforma de diseño Codewarrior Cátedra de Circuitos Digitales y Microprocesadores Curso 2012 12/11/2012 1 Cátedra de CDM Facultad de Ingiería UNLP

description

Presentacion para programacion en C para dispositivos embebidos.

Transcript of 8 Programacion en C Para Sistemas Embebidos

Page 1: 8 Programacion en C Para Sistemas Embebidos

Programación en “C” para Sistemas Embebidos

Aplicado sobre la Plataforma de diseño Codewarrior

Cátedra de Circuitos Digitales y Microprocesadores – Curso 2012

12/11/2012 1Cátedra de CDM – Facultad de Ingiería

UNLP

Page 2: 8 Programacion en C Para Sistemas Embebidos

Programación en “C” para Sistemas Embebidos

• Segunda parte de Introducción a C

• Programación Eficiente para sistemas Embebidos

• Descripción de codewarrior

• Interrupciones aplicadas sobre Codewarrior

• Inclusión de funciones en C y en Assembler

• Ejemplos

12/11/2012 2Cátedra de CDM – Facultad de Ingiería

UNLP

Page 3: 8 Programacion en C Para Sistemas Embebidos

Segunda parte de Introducción a C

Typedef, funciones recursivas, Gestion Dinámica de memoria

12/11/2012 3Cátedra de CDM – Facultad de Ingiería

UNLP

Page 4: 8 Programacion en C Para Sistemas Embebidos

Segunda parte de Introducción a CTypedef

• sirve para la creación de nuevos nombres de tipos de datos

• El usuario puede definir tipos de variables propios no incorporados en el lenguaje

• Se definen a partir de tipos de datos existentes

12/11/2012 4Cátedra de CDM – Facultad de Ingiería

UNLP

Page 5: 8 Programacion en C Para Sistemas Embebidos

Segunda parte de Introducción a CTypedef

#define MAX_NOM 30#define MAX_ALUMNOS 400struct s_alumno { // se define la estructura s_alumnochar nombre[MAX_NOM];short edad;};typedef struct s_alumno ALUMNO; // ALUMNO es un nuevo tipo de variabletypedef struct s_alumno *ALUMNOPTR;struct clase {ALUMNO alumnos[MAX_ALUMNOS];char nom_profesor[MAX_NOM];};typedef struct clase CLASE;typedef struct clase *CLASEPTR;//se crearon cuatro palabras reservadas para tipos; alumno, alumpoptr, clase,

claseptr

12/11/2012 5Cátedra de CDM – Facultad de Ingiería

UNLP

Page 6: 8 Programacion en C Para Sistemas Embebidos

Segunda parte de Introducción a CFunciones Recursivas

La recursividad es la posibilidad de que una función se llame a sí misma, bien directa o indirectamente.

La función factorial, escrita de forma recursiva, sería como sigue:unsigned long factorial(unsigned long numero)

{

if ( numero == 1 || numero == 0 )

return 1;

else

return numero*factorial(numero-1);

}

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP6

Page 7: 8 Programacion en C Para Sistemas Embebidos

Segunda parte de Introducción a CGestión Dinámica de Memoria

• la reserva o asignación de memoria para vectoresy matrices se hace de forma automática con ladeclaración de dichas variables

• Es muy útil el poder reservar más o menosmemoria en tiempo de ejecución, A esto se llamareserva o gestión dinámica de memoria

• Existen 2 funciones que reservan memoria en tiempo de ejecución, malloc() y calloc(), y sus declaraciones están en la librería stdlib.h

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP7

Page 8: 8 Programacion en C Para Sistemas Embebidos

Segunda parte de Introducción a CGestión Dinámica de Memoria

• La función malloc() busca en la memoria el espacio requerido, lo reserva y devuelve un puntero al primer elemento de la zona reservada.

• La función calloc() necesita dos argumentos: el nº de celdas de memoria deseadas y el tamaño en bytes de cada celda. se devuelve un puntero a la primera celda de memoria.

• Existe también una función llamada free() que deja libre la memoria reservada por malloc() o calloc() y que ya no se va a utilizar.

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP8

Page 9: 8 Programacion en C Para Sistemas Embebidos

Segunda parte de Introducción a CGestión Dinámica de Memoria

producto de matriz por vector {y}=[a]{x}

// declaracionesdouble **a, *x, *y;void prod(int , double **, double *, double *);...// reserva de memoria para la matriz aa = calloc(N, sizeof(double *));for (i=0; i<N; i++)a[i]=calloc(N, sizeof(double));...// reserva de memoria para los vectores x e yx = calloc(N, sizeof(double);y = calloc(N, sizeof(double);...prod(N, a, x, y);...// definicion de la funcion prod()void prod(int N, double **mat, double *x, double *y){...}

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP9

Page 10: 8 Programacion en C Para Sistemas Embebidos

Segunda parte de Introducción a CGestión Dinámica de Memoria

Matriz definida como vectores de punteros

// declaracionesdouble **a, *x, *y;void prod(int , double **, double *, double *);...// reserva de memoria para el vector de punteros a[]a = calloc(N, sizeof(double *));// reserva de memoria para toda la matriz a[][]a[0] = calloc(N*N, sizeof(double));// asignación de valor para los elementos del vector de punteros a[]for (i=1; i<N; i++)a[i] = a[i-1]+N;// el resto del programa sería idéntico...

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP10

Page 11: 8 Programacion en C Para Sistemas Embebidos

Referencias

• [1] Javier Garcia de La Fuente, José Ignacio Rodriguez Garrido, “Aprenda Lenguaje C como si estuviera Primero”, Universidad de Navarra, 1998

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP11

Page 12: 8 Programacion en C Para Sistemas Embebidos

Programación C Eficiente para Sistemas Embebidos

Aspectos a tener en cuenta al realizar un programa en C orientado a Microcontroladores de 8 bits

12/11/2012 12Cátedra de CDM – Facultad de Ingiería

UNLP

Page 13: 8 Programacion en C Para Sistemas Embebidos

Programación C EficienteTipos de Datos

• Los tipos de datos “int” y “long int” deben ser usados,solo donde se requiere, por el tamaño de datos a serrepresentado

• Las operaciones de doble precisión y punto flotanteson ineficientes y deben ser evitadas donde laeficiencia es importante

• para el tipo ‘char el signo debe ser definidoexplícitamente: ‘unsigned char’ o ‘signed char’

• Es buena práctica crear definiciones de tipos paraestos tipos de datos en un encabezado de archivo quese incluye en todos los otros archivos.

12/11/2012 13Cátedra de CDM – Facultad de Ingiería

UNLP

Page 14: 8 Programacion en C Para Sistemas Embebidos

Programación C EficienteTipos de Datos

Se pueden crear definiciones de datos como sigue:

typedef unsigned char UINT8;

typedef signed char SINT8;

typedef unsigned int UINT16;

typedef int SINT16;

typedef unsigned long int UINT32;

typedef long int SINT32;

12/11/2012 14Cátedra de CDM – Facultad de Ingiería

UNLP

Page 15: 8 Programacion en C Para Sistemas Embebidos

Programación C EficienteVariables Locales Vs Variables Globales

• Las variables globales son accesibles por cualquier parte delprograma y son almacenadas permanentemente en RAM

• Las variables locales son accesibles sólo por la función dentrode la cual son declaradas y son almacenadas en la pila.

• Para acceder a las variables locales el compilador puede usarel modo de direccionamiento del puntero de pila.

• La memoria ocupada por una variable global no puede serreusada por cualquier otra variable

• El uso de variables globales generalmente no resultasignificativamente más eficiente en código que las variableslocales.

• Los datos variables globales podrían ser corrompidos si unaparte de la variable proviene de un valor y el resto de lavariable proviene de otro valor.

12/11/2012 15Cátedra de CDM – Facultad de Ingiería

UNLP

Page 16: 8 Programacion en C Para Sistemas Embebidos

Programación C EficienteVariables de Página Directa

• La parte inferior de la página directa siempre contienelos registros I/O y de control

• la parte superior de la página directa siempre contieneRAM.

• Algunas instrucciones altamente eficientes sólosurtirán efecto con operandos de la página directa.

• Ej: BSET, BCLR, BRSET y BRCLR.• Muchos I/O y registros de control están ubicados en la

página directa y ellos deberán estar declarados comosigue.#define PortA (*((volatile UINT8 *)(0x0000)))#define PortB (*((volatile UINT8 *)(0x0001)))

12/11/2012 16Cátedra de CDM – Facultad de Ingiería

UNLP

Page 17: 8 Programacion en C Para Sistemas Embebidos

Programación C EficienteBucles

• Si un bucle debe ser ejecutado menos de 255 veces, seusa 'unsigned char'

• Si el bucle debe ser ejecutado más que 255 veces, se usa'unsigned int‘

• Es más eficiente el contador para decrementar ycomparar con cero que para incrementar y comparar conun valor distinto de cero

• Esta optimización no es efectiva si el bucle debe serejecutado con el bucle contador igual a cero, comocuando el bucle contador se usa para indexar un arreglode elementos y se debe acceder al primer elemento.

• Cuando un bucle se ejecuta un número fijo de veces yaquel número es pequeño, se recomienda no usar bucle.

12/11/2012 17Cátedra de CDM – Facultad de Ingiería

UNLP

Page 18: 8 Programacion en C Para Sistemas Embebidos

Programación C EficienteEstructuras de Datos

• En C es fácil crear estructuras de datos complejas, por ejemploun arreglo de estructuras, donde cada estructura contiene unnúmero de tipos de datos diferentes.

• Esto producirá código complejo y lento en un microcontroladorde 8 bits que tiene un número limitado de registros de CPU parausar por indexado.

• Cada nivel de referencia resultará en una multiplicación delnúmero de elementos por el tamaño del elemento, con elresultado probablemente puesto encima de la pila en orden,para hacer el siguiente cálculo.

• Las estructuras deberán ser evitadas donde sea posible y lasestructuras de datos mantenerse simples.

• Si las estructuras son inevitables, entonces no deberán hacersepasar como un argumento de función.

12/11/2012 18Cátedra de CDM – Facultad de Ingiería

UNLP

Page 19: 8 Programacion en C Para Sistemas Embebidos

Programación C EficienteEjemplos

Los siguientes ejemplos están basados en las siguientes definiciones de tipos:

typedef unsigned char UINT8;

typedef signed char SINT8;

typedef unsigned int UINT16;

typedef int SINT16;

12/11/2012 19Cátedra de CDM – Facultad de Ingiería

UNLP

Page 20: 8 Programacion en C Para Sistemas Embebidos

Programación C EficienteEjemplo de Paginado directo

Código C Código Ensamblador Bytes Ciclos

#define PORTA (*((volatile UINT8 *)(0x0000)))#define CMCR0 (*((volatile UINT8 *)(0x0500)))

voidregister1(void){CMCR0 &= ~0x01; /* clr bit1 */PORTA |= 0x03; /* set b1,2 */PORTA &= ~0x02; /* clr bit2 */}

LDHX #0x0500LDA ,XAND #0xFESTA ,XLDA 0x00ORA #0x03STA 0x00BSET 0,0x00RTS

312122221

322232344

12/11/2012 20Cátedra de CDM – Facultad de Ingiería

UNLP

Page 21: 8 Programacion en C Para Sistemas Embebidos

Programación C EficienteEjemplo - uso inapropiado de índice i

Código C Código Ensamblador

Código Ensamblador

Bytes Bytes Ciclos Ciclos

UINT8 buffer[4];

voiddatacopy1(UINT8 * dataPtr){int i;for (i = 0; i < 4; i++){buffer[i] = dataPtr[i];}}

PSHAPSHXAIS #-2TSXCLR 1,XCLR ,XTSXLDA 3,XADD 1,XPSHALDA ,XADC 2,XPSHAPULHPULXLDA ,XTSX

LDX ,XPSHXLDX 3,SPPULHSTA buffer,XTSXINC 1,XBNE *1INC ,XLDA ,XPSHALDX 1,XPULHCPHX #0x0004BLT *-39AIS #4RTS

11212112211211111

11313122111213221

22223223322322222

22424243322323324

12/11/2012 21Cátedra de CDM – Facultad de Ingiería

UNLP

Page 22: 8 Programacion en C Para Sistemas Embebidos

Programación C EficienteEjemplo - uso apropiado de índice i

Código C Código Ensamblador

Código Ensamblador

Bytes Bytes Ciclos Ciclos

UINT8 buffer[4];

voiddatacopy2(UINT8 * dataPtr){UINT8 i;for (i = 0; i < 4; i++){buffer[i] = dataPtr[i];}}//103 ciclos menos//17 bytes menos

PSHAPSHXPSHHTSXCLR ,XLDA ,XADD 2,XPSHACLRAADC 1,XPSHAPULHPULX

LDX ,XTXATSXLDX ,XCLRHSTA buffer,XTSXINC ,XLDA ,XCMP #0x04BCS *-25AIS #3RTS

1111112112111

1111131112221

2222223213222

2122142322324

12/11/2012 22Cátedra de CDM – Facultad de Ingiería

UNLP

Page 23: 8 Programacion en C Para Sistemas Embebidos

Programación C EficienteEjemplo – copia de datos sin bucle

Código C Código Ensamblador Bytes Ciclos

UINT8 buffer[4];

voiddatacopy3(UINT8 * dataPtr){buffer[0] = dataPtr[0];buffer[1] = dataPtr[1];buffer[2] = dataPtr[2];buffer[3] = dataPtr[3];}//10 bytes menos de ROM //144 ciclos menos de CPU

PSHXPULHTAXLDA ,XSTA bufferLDA 1,XSTA buffer:0x1LDA 2,XSTA buffer:0x2LDA 3,XSTA buffer:0x3RTS

111132323231

221243434344

12/11/2012 23Cátedra de CDM – Facultad de Ingiería

UNLP

Page 24: 8 Programacion en C Para Sistemas Embebidos

Programación C EficienteEjemplo –bucle con decremento

Código C Código Ensamblador Bytes Ciclos

Void

loop1(void)

{

UINT8 i;

for(i=4; i!=0; i--)

{

/* code */

}

}

//2 bytes menos de ROM por iteración//9 ciclos de CPU por iteración

PSHH

LDA #0x04

TSX

STA ,X

TSX

DBNZ ,X,*-offset

PULH

RTS

1

2

1

1

1

2

1

1

2

2

2

2

2

4

2

4

12/11/2012 24Cátedra de CDM – Facultad de Ingiería

UNLP

Page 25: 8 Programacion en C Para Sistemas Embebidos

Programación C EficienteReferencias

[1] Stuart Robb, “Creating Efficient C Code for theMC68HC08”, Nota de Aplicación, East Kilbride, Scotland, 2000.

*2+ “Embedded C Development tools, ” http://www.imagecraft.com, 1994.

*3+Reference Manual: “Software ICCHCxx”, ImageCraftCreations Inc.,2000.

*4+ “Ing. Gabriel Dubatti”, http://www.ingdubatti.com.ar, 2007

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP25

Page 26: 8 Programacion en C Para Sistemas Embebidos

Programación en C Estructurada

Portabilidad del código

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP26

Page 27: 8 Programacion en C Para Sistemas Embebidos

Ventajas de programar en C

Posee las ventajas del diseño "Top-Down":

- Enfoque orientado a la problemática (No es necesario que el desarrollador conozca el funcionamiento interno del sistema).

- Tiempos de desarrollo reducidos.

- Se simplifica la detección de errores.

- Facilita el seguimiento del desarrollo

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP27

Page 28: 8 Programacion en C Para Sistemas Embebidos

Objetivos de la Programación en C

• Fácil de entender

• Fácil de depurar

• Fácil de verificar

• Fácil de mantener

Regla de Oro: “Escribe software para otros como te gustaría que lo escriban para vos.”

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP28

Page 29: 8 Programacion en C Para Sistemas Embebidos

Diseño de Código Reusable

• Código Documentado

• Abstracción

• Modularidad

• Software en capas

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP29

Page 30: 8 Programacion en C Para Sistemas Embebidos

Código documentado

• Comentar el código sirve para entender programas escritos con mucha anterioridad

• Sirve para que otro pueda modificar nuestro código

• Existen software que en base al código te realizan comentarios automáticamente.

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP30

Page 31: 8 Programacion en C Para Sistemas Embebidos

Código documentado

En el Mantenimiento de software se requiere:

• Corrección de errores,

• Nuevas características,

• Optimizaciones de velocidad de ejecución o uso de memoria,

• Migración hacia otro hardware,

• Adaptación a distintas situaciones.

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP31

Page 32: 8 Programacion en C Para Sistemas Embebidos

Código Documentado• Error Común:• X = X + 4; /* sumo 4 a X */• Flag = 0; /* pongo flag en cero */

Comentar cada línea del programa impide leer lafunción real que cumple el código

• X = X + 4; /* Se suman 4 (mV) para corregir el offset del transductor */

• Flag = 0; /* Significa que no se presiono ninguna tecla*/

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP32

Page 33: 8 Programacion en C Para Sistemas Embebidos

Niveles de Abstracción

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP33

Page 34: 8 Programacion en C Para Sistemas Embebidos

MODULARIDAD

• Razones:

• Abstracción funcional: Permite reutilizar módulosde software desde múltiples lugares

• Abstracción en complejidad: Dividir un sistemacomplejo en componentes pequeños y simples.

• Portabilidad: Permite programar un mismocódigo em diferentes plataformas de HW .

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP34

Page 35: 8 Programacion en C Para Sistemas Embebidos

Programación en capas o niveles

Reglas:• Un módulo puede hacer una llamada a otro modulo en la

misma capa

• Un módulo puede llamar a un módulo de una capa inferiorsolo utilizando la API

• Un módulo no puede acceder directamente a ningunafunción o variable en otra capa (sin utilizar la API)

• Un módulo no puede llamar a una rutina de mayor nivel.

Nora: API (application program interface)

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP35

Page 36: 8 Programacion en C Para Sistemas Embebidos

Programación en capas o niveles

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP36

Page 37: 8 Programacion en C Para Sistemas Embebidos

Descripción del software codewarrior

Herramienta de programación en C, Simulación y Debugger para sistemas

Embebidos de la Firma Freescale

12/11/2012 37Cátedra de CDM – Facultad de Ingiería

UNLP

Page 38: 8 Programacion en C Para Sistemas Embebidos

Codewarrior

Características

• Entorno de desarrollo integrado

• Destinado a Controladores de señales digitalesde Freescale

• Programación en C o Assembler

12/11/2012 38Cátedra de CDM – Facultad de Ingiería

UNLP

Page 39: 8 Programacion en C Para Sistemas Embebidos

CodewarriorVentana de inicio

•Crear proyecto

•Abrir un proyecto existente

•Ejecutar ejemplos

•Usar el IDE

12/11/2012 39Cátedra de CDM – Facultad de Ingiería

UNLP

Page 40: 8 Programacion en C Para Sistemas Embebidos

Codewarrior – Dialogo de EntradaLa opción FILE->STARTUP DIALOG permite al usuario seleccionar, el tipo de proyecto, el dispositivo, el nombre y su ubicación.12/11/2012 40

Cátedra de CDM – Facultad de Ingiería UNLP

Page 41: 8 Programacion en C Para Sistemas Embebidos

CodewarriorNuevo Proyecto

12/11/2012 41Cátedra de CDM – Facultad de Ingiería

UNLP

Page 42: 8 Programacion en C Para Sistemas Embebidos

CodewarriorLenguaje de Programación

El IDE de CWsoporta tres tiposde lenguajes:Assembly, C y C++también es posiblehacer la mezcla deellos en el mismoproyecto

La opción de C++ está habilitada en la versión

profesional

12/11/2012 42Cátedra de CDM – Facultad de Ingiería

UNLP

Page 43: 8 Programacion en C Para Sistemas Embebidos

CodewarriorCreación de un Proyecto

12/11/2012 43Cátedra de CDM – Facultad de Ingiería

UNLP

Page 44: 8 Programacion en C Para Sistemas Embebidos

CodewarriorVentana de Proyecto

12/11/2012 44Cátedra de CDM – Facultad de Ingiería

UNLP

Page 45: 8 Programacion en C Para Sistemas Embebidos

Codewarrior – Ventana de Proyecto

La ventana de proyecto contiene una lista de archivos pertenecientes al proyecto.

MCUinit.c es un archivo automáticamente generado por el IDE y contiene toda la secuencia de inicialización de la CPU

12/11/2012 45Cátedra de CDM – Facultad de Ingiería

UNLP

Page 46: 8 Programacion en C Para Sistemas Embebidos

CodewarriorVentana de Proyecto

12/11/2012 46Cátedra de CDM – Facultad de Ingiería

UNLP

Page 47: 8 Programacion en C Para Sistemas Embebidos

CodewarriorAgregar Archivos Fuente

Los archivos fuentede un proyecto sedeben agregar en lacarpeta sources

12/11/2012 47Cátedra de CDM – Facultad de Ingiería

UNLP

Page 48: 8 Programacion en C Para Sistemas Embebidos

CodewarriorInicialización del Dispositivo

12/11/2012 48Cátedra de CDM – Facultad de Ingiería

UNLP

Page 49: 8 Programacion en C Para Sistemas Embebidos

CodewarriorInicialización del Dispositivo

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP49

Page 50: 8 Programacion en C Para Sistemas Embebidos

CodewarriorInicialización del Dispositivo

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP50

Page 51: 8 Programacion en C Para Sistemas Embebidos

CodewarriorInicialización del Dispositivo

12/11/2012 51Cátedra de CDM – Facultad de Ingiería

UNLP

Page 52: 8 Programacion en C Para Sistemas Embebidos

CodewarriorCódigo Inicial de un Proyecto

12/11/2012 52Cátedra de CDM – Facultad de Ingiería

UNLP

Page 53: 8 Programacion en C Para Sistemas Embebidos

CodewarriorProyecto compilado

12/11/2012 53Cátedra de CDM – Facultad de Ingiería

UNLP

Page 54: 8 Programacion en C Para Sistemas Embebidos

CodewarriorDepurado de Proyecto

Para depurar unaaplicación lo quetenemos que haceres apretar el iconode depurado en laventana deproyecto.

Esta ventana solo seabrirá si no hayerrores

12/11/2012 54Cátedra de CDM – Facultad de Ingiería

UNLP

Page 55: 8 Programacion en C Para Sistemas Embebidos

CodewarriorReferencias

*1+ “Ing. Gabriel Dubatti”, http://www.ingdubatti.com.ar, 2007

*2+ User Guide: “PROCESSOR EXPERT FOR MOTOROLA HC(S)08 FAMILY” Codewarrior V 1.4 may,2004

[3] CodeWarrior™ Development Studio IDE 5.5 User’s Guide, Metrowerks corporation, 2003

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP55

Page 56: 8 Programacion en C Para Sistemas Embebidos

Definición de interrupciones aplicadas sobre codewarrior

Forma rápida de habilitarlas

12/11/2012 56Cátedra de CDM – Facultad de Ingiería

UNLP

Page 57: 8 Programacion en C Para Sistemas Embebidos

Interrupciones en C

El empleo de ISR (Interrupt Service Routine, oRutina de Servicio de Interrupciones) es habitualen los programas con micros. Pueden emplearsepara responder a una interrupción externa, unainterrupción del timer o del conversor A/D.

Codewarrior provee dos mecanismos para escribirISRs:

• Usando la directiva #pragma TRAP_PROC y elarchivo de parametros del Linker

• Usando la instrucción interrupt

12/11/2012 57Cátedra de CDM – Facultad de Ingiería

UNLP

Page 58: 8 Programacion en C Para Sistemas Embebidos

Interrupciones en CLa instrucción interrupt

• Es una instrucción especial de codewarrior

• Debe usarse como si fuera un calificador de tipopero seguida de un número que especifica laentrada en la tabla de vectores de interrupción

12/11/2012 58Cátedra de CDM – Facultad de Ingiería

UNLP

Page 59: 8 Programacion en C Para Sistemas Embebidos

Interrupciones en CLa instrucción interrupt

Ejemplo:

interrupt 17 void Mi_ISR();

//Instala Mi_ISR en la entrada 17

//de la tabla de vectores,

//correspondiente al Timebase Module.

//Con esta modificación, el

//código de ejemplo quedaría

//de la siguiente forma:

#define TBON 2

#define TACK 8 //Ack del TBCR

#define ENABLE_INT {asm cli;}

#define DISABLE_INT {asm sei;}

interrupt 17 void Mi_ISR(void) { TBCR |= TACK; // Acknowledge IntPTA ^= 0x80; }//***************************// void main (void) { CONFIG1 = 1; //Parar COP DDRA = 0xFF; //PTA todo salida TBCR = 0x04; //Timebase divide por 8192 ENABLE_INT //Habilitar interrupciones TBCR |= TBON; //Prender el Timebasewhile (1) { //Hacer nada } }

12/11/2012 59Cátedra de CDM – Facultad de Ingiería

UNLP

Page 60: 8 Programacion en C Para Sistemas Embebidos

Interrupciones en CReferencias

Referencias

• MC68HC908GP32 Technical Data (Motorola)

• Motorola HC08 Compiler (Metrowerks)

• Manual Smart Linker (Metrowerks)

12/11/2012 60Cátedra de CDM – Facultad de Ingiería

UNLP

Page 61: 8 Programacion en C Para Sistemas Embebidos

Inclusión de funciones en “C” y en Assembler

Inclusión de instrucciones, variables y funciones en Assembler sobre código C.

Inclusión de Variables en C sobre código Assembler

12/11/2012 61Cátedra de CDM – Facultad de Ingiería

UNLP

Page 62: 8 Programacion en C Para Sistemas Embebidos

Inclusión de Subrutinas en Assembler sobre un Programa en C

Se pretende mostrar de que manera el Software Codewarrior permite agregar

subrutinas e instrucciones en AssemblerSobre un programa en C

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP62

Page 63: 8 Programacion en C Para Sistemas Embebidos

Inclusión de Subrutinas en Assembleren un Programa en C

Acceso de Variables Assembler desde un Archivo C

Las Variables en Assembler se deben exportar usando la directiva XDEF para ser Visibles desde otros Módulos. Se recomienda usar un archivo Header por cada archivo en assembler.

Ejemplo:XDEF ASMData, ASMConst

Datasec: SECTIONASMData: DS.W 1 ; definición de una variableConstSec: SECTIONASMConst: DC.W $44A6 ;definición de una constante

12/11/2012 63Cátedra de CDM – Facultad de Ingiería

UNLP

Page 64: 8 Programacion en C Para Sistemas Embebidos

Inclusión de Subrutinas en Assembleren un Programa en C

Acceso de Variables Assembler desde un Archivo C

La declaración externa de una variable o constante se hacer en el Archivo Header como se muestra a continuación:

/*declaración externa de una variable*/Extern int ASMData;/*declaración externa de una constante*/Extern const int ASMConst;

Las Variables o constantes se podrán usar mediante sus nombres:

ASMData = ASMConst + 3;

12/11/2012 64Cátedra de CDM – Facultad de Ingiería

UNLP

Page 65: 8 Programacion en C Para Sistemas Embebidos

Inclusión de Subrutinas en Assembleren un Programa en C

Acceso de rutinas en Assembler desde un Archivo CUna Función mixasm.asm en assembler se puede llamar desde un

archivo en C. Archivo Assembler:

XREF CDataXDEF AddVarXDEF ASMData

DataSec: SECTIONASMData: DS.B 1CodeSec: SECTIONAddVar:

ADD CData ; suma Cdata al acumuladorSTA ASMData ; guarda el resultado en ASMDataRTS

12/11/2012 65Cátedra de CDM – Facultad de Ingiería

UNLP

Page 66: 8 Programacion en C Para Sistemas Embebidos

Inclusión de Subrutinas en Assembleren un Programa en C

Acceso de rutinas en Assembler desde un Archivo C

La interfaz al archivo con la rutina en Assembler se hace desde un Archivo mixasm.h como sigue:

/*mixasm.h*/

#ifndef _MIXASM_H_

#define _MIXASM_H_

Void AddVar(unsigned char value);

//Funcion que suma el valor del parametro a Cdata

// y almacena el resultado en ASMData

/*Variable que recibe el resultado de AddVar */

Extern char ASMData;

#endif /* _MIXASM_H_ */

12/11/2012 66Cátedra de CDM – Facultad de Ingiería

UNLP

Page 67: 8 Programacion en C Para Sistemas Embebidos

Inclusión de Subrutinas en Assembleren un Programa en C

Acceso de rutinas en Assembler desde un Archivo C

A continuación se muestra como un archivo C “mixc.c” llama a la función en Assembler AddVar().

Static int error =0;Const unsigned char Cdata = 12;#include “mixasm.h”

Void main (void) {AddVar(10);

if(ASMData != Cdata +10) {error=1; }

else {error=0;

}For(;;); // el for se ejecuta siempre}

12/11/2012 67Cátedra de CDM – Facultad de Ingiería

UNLP

Page 68: 8 Programacion en C Para Sistemas Embebidos

Inclusión de Variables en C desde un Archivo en Assembler

Muchas Veces es necesario utilizar una variable definida en C en un

archivo Asembler

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP68

Page 69: 8 Programacion en C Para Sistemas Embebidos

Inclusión de Variables en C desde un Archivo en Assembler

Acceso de Variables C desde un Archivo Assembler

Las Variables en C se debe definir como sigue:Unsigned int CData; /*definición de una variable*/Unsigned const int Cconst; /*definición de una constante*/

La declaración externa de la variable o constante se debe agregar en un archivo separado, para luego incluirlo en el archivo Assembler, o en el archivo Assembler directamente:

XREF Cdata; declaración externa de una variableXREF CConst; declaración externa de una constante

Luego se puede acceder a las variables o constantes usando sus nombres:

LDA Cconst;………………LDA CData

12/11/2012 69Cátedra de CDM – Facultad de Ingiería

UNLP

Page 70: 8 Programacion en C Para Sistemas Embebidos

Referencias

[1] CodeWarrior™ Development Studio IDE 5.5 User’s Guide, Metrowerks corporation, 2003

12/11/2012Cátedra de CDM – Facultad de Ingiería

UNLP70