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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Programación en C Estructurada
Portabilidad del código
12/11/2012Cátedra de CDM – Facultad de Ingiería
UNLP26
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
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
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
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
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
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
Niveles de Abstracción
12/11/2012Cátedra de CDM – Facultad de Ingiería
UNLP33
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
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
Programación en capas o niveles
12/11/2012Cátedra de CDM – Facultad de Ingiería
UNLP36
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
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
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
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
CodewarriorNuevo Proyecto
12/11/2012 41Cátedra de CDM – Facultad de Ingiería
UNLP
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
CodewarriorCreación de un Proyecto
12/11/2012 43Cátedra de CDM – Facultad de Ingiería
UNLP
CodewarriorVentana de Proyecto
12/11/2012 44Cátedra de CDM – Facultad de Ingiería
UNLP
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
CodewarriorVentana de Proyecto
12/11/2012 46Cátedra de CDM – Facultad de Ingiería
UNLP
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
CodewarriorInicialización del Dispositivo
12/11/2012 48Cátedra de CDM – Facultad de Ingiería
UNLP
CodewarriorInicialización del Dispositivo
12/11/2012Cátedra de CDM – Facultad de Ingiería
UNLP49
CodewarriorInicialización del Dispositivo
12/11/2012Cátedra de CDM – Facultad de Ingiería
UNLP50
CodewarriorInicialización del Dispositivo
12/11/2012 51Cátedra de CDM – Facultad de Ingiería
UNLP
CodewarriorCódigo Inicial de un Proyecto
12/11/2012 52Cátedra de CDM – Facultad de Ingiería
UNLP
CodewarriorProyecto compilado
12/11/2012 53Cátedra de CDM – Facultad de Ingiería
UNLP
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
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
Definición de interrupciones aplicadas sobre codewarrior
Forma rápida de habilitarlas
12/11/2012 56Cátedra de CDM – Facultad de Ingiería
UNLP
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
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
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
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
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
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
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
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
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
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
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
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
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
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