Está en la página 1de 70

Progra a ió e C para “iste as

Embebidos
Aplicado sobre la Plataforma de diseño Codewarrior

Cátedra de Circuitos Digitales y


Microprocesadores – Curso 2012

Cátedra de CDM – Facultad de Ingiería


12/11/2012 1
UNLP
Progra a ió e C para “iste as
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

Cátedra de CDM – Facultad de Ingiería


12/11/2012 2
UNLP
Segunda parte de Introducción a C

Typedef, funciones recursivas,


Gestion Dinámica de memoria

Cátedra de CDM – Facultad de Ingiería


12/11/2012 3
UNLP
Segunda parte de Introducción a C
Typedef
• 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

Cátedra de CDM – Facultad de Ingiería


12/11/2012 4
UNLP
Segunda parte de Introducción a C
Typedef
#define MAX_NOM 30
#define MAX_ALUMNOS 400
struct s_alumno { // se define la estructura s_alumno
char nombre[MAX_NOM];
short edad;
};
typedef struct s_alumno ALUMNO; // ALUMNO es un nuevo tipo de variable
typedef 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
Cátedra de CDM – Facultad de Ingiería
12/11/2012 5
UNLP
Segunda parte de Introducción a C
Funciones 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);
}
Cátedra de CDM – Facultad de Ingiería
12/11/2012 6
UNLP
Segunda parte de Introducción a C
Gestión Dinámica de Memoria
• la reserva o asignación de memoria para vectores
y matrices se hace de forma automática con la
declaración de dichas variables
• Es muy útil el poder reservar más o menos
memoria en tiempo de ejecución, A esto se llama
reserva 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
Cátedra de CDM – Facultad de Ingiería
12/11/2012 7
UNLP
Segunda parte de Introducción a C
Gestió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.
Cátedra de CDM – Facultad de Ingiería
12/11/2012 8
UNLP
Segunda parte de Introducción a C
Gestión Dinámica de Memoria
producto de matriz por vector {y}=[a]{x}
// declaraciones
double **a, *x, *y;
void prod(int , double **, double *, double *);
...
// reserva de memoria para la matriz a
a = calloc(N, sizeof(double *));
for (i=0; i<N; i++)
a[i]=calloc(N, sizeof(double));
...
// reserva de memoria para los vectores x e y
x = 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)
{...}
Cátedra de CDM – Facultad de Ingiería
12/11/2012 9
UNLP
Segunda parte de Introducción a C
Gestión Dinámica de Memoria
Matriz definida como vectores de punteros

// declaraciones
double **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
...

Cátedra de CDM – Facultad de Ingiería


12/11/2012 10
UNLP
Referencias
• [1] Javier Garcia de La Fuente, José Ignacio
‘odriguez Garrido, Apre da Le guaje C o o
si estu iera Pri ero , U i ersidad de Na arra,
1998

Cátedra de CDM – Facultad de Ingiería


12/11/2012 11
UNLP
Programación C Eficiente para
Sistemas Embebidos

Aspectos a tener en cuenta al realizar


un programa en C orientado a
Microcontroladores de 8 bits

Cátedra de CDM – Facultad de Ingiería


12/11/2012 12
UNLP
Programación C Eficiente
Tipos de Datos
• Los tipos de datos int y long int deben ser usados,
solo donde se requiere, por el tamaño de datos a ser
representado
• Las operaciones de doble precisión y punto flotante
son ineficientes y deben ser evitadas donde la
eficiencia es importante
• para el tipo ‘char el signo debe ser definido
explícitamente: unsigned char o signed char
• Es buena práctica crear definiciones de tipos para
estos tipos de datos en un encabezado de archivo que
se incluye en todos los otros archivos.
Cátedra de CDM – Facultad de Ingiería
12/11/2012 13
UNLP
Programación C Eficiente
Tipos 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;
Cátedra de CDM – Facultad de Ingiería
12/11/2012 14
UNLP
Programación C Eficiente
Variables Locales Vs Variables Globales
• Las variables globales son accesibles por cualquier parte del
programa y son almacenadas permanentemente en RAM
• Las variables locales son accesibles sólo por la función dentro
de la cual son declaradas y son almacenadas en la pila.
• Para acceder a las variables locales el compilador puede usar
el modo de direccionamiento del puntero de pila.
• La memoria ocupada por una variable global no puede ser
reusada por cualquier otra variable
• El uso de variables globales generalmente no resulta
significativamente más eficiente en código que las variables
locales.
• Los datos variables globales podrían ser corrompidos si una
parte de la variable proviene de un valor y el resto de la
variable proviene de otro valor.
Cátedra de CDM – Facultad de Ingiería
12/11/2012 15
UNLP
Programación C Eficiente
Variables de Página Directa
• La parte inferior de la página directa siempre contiene
los registros I/O y de control
• la parte superior de la página directa siempre contiene
RAM.
• Algunas instrucciones altamente eficientes sólo
surtirá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 como
sigue.
#define PortA (*((volatile UINT8 *)(0x0000)))
#define PortB (*((volatile UINT8 *)(0x0001)))
Cátedra de CDM – Facultad de Ingiería
12/11/2012 16
UNLP
Programación C Eficiente
Bucles
• Si un bucle debe ser ejecutado menos de 255 veces, se
usa '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 y
comparar con cero que para incrementar y comparar con
un valor distinto de cero
• Esta optimización no es efectiva si el bucle debe ser
ejecutado con el bucle contador igual a cero, como
cuando el bucle contador se usa para indexar un arreglo
de elementos y se debe acceder al primer elemento.
• Cuando un bucle se ejecuta un número fijo de veces y
aquel número es pequeño, se recomienda no usar bucle.
Cátedra de CDM – Facultad de Ingiería
12/11/2012 17
UNLP
Programación C Eficiente
Estructuras de Datos
• En C es fácil crear estructuras de datos complejas, por ejemplo
un arreglo de estructuras, donde cada estructura contiene un
número de tipos de datos diferentes.
• Esto producirá código complejo y lento en un microcontrolador
de 8 bits que tiene un número limitado de registros de CPU para
usar por indexado.
• Cada nivel de referencia resultará en una multiplicación del
número de elementos por el tamaño del elemento, con el
resultado probablemente puesto encima de la pila en orden,
para hacer el siguiente cálculo.
• Las estructuras deberán ser evitadas donde sea posible y las
estructuras de datos mantenerse simples.
• Si las estructuras son inevitables, entonces no deberán hacerse
pasar como un argumento de función.
Cátedra de CDM – Facultad de Ingiería
12/11/2012 18
UNLP
Programación C Eficiente
Ejemplos
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;

Cátedra de CDM – Facultad de Ingiería


12/11/2012 19
UNLP
Programación C Eficiente
Ejemplo de Paginado directo
Código C Código Ensamblador Bytes Ciclos
#define PORTA (*((volatile UINT8
*)(0x0000)))
#define CMCR0 (*((volatile UINT8
*)(0x0500)))
LDHX #0x0500 3 3
void LDA ,X 1 2
register1(void) AND #0xFE 2 2
{ STA ,X 1 2
CMCR0 &= ~0x01; /* clr bit1 */ LDA 0x00 2 3
PORTA |= 0x03; /* set b1,2 */ ORA #0x03 2 2
PORTA &= ~0x02; /* clr bit2 */ STA 0x00 2 3
} BSET 0,0x00 2 4
RTS 1 4

Cátedra de CDM – Facultad de Ingiería


12/11/2012 20
UNLP
Programación C Eficiente
Ejemplo - uso inapropiado de índice i
Código C Código Código Bytes Bytes Ciclos Ciclos
Ensamblador Ensamblador

UINT8 buffer[4]; PSHA LDX ,X 1 1 2 2


PSHX PSHX 1 1 2 2
void AIS #-2 LDX 3,SP 2 3 2 4
datacopy1(UINT8 * TSX PULH 1 1 2 2
dataPtr) CLR 1,X STA buffer,X 2 3 3 4
{ CLR ,X TSX 1 1 2 2
int i; TSX INC 1,X 1 2 2 4
for (i = 0; i < 4; i++) LDA 3,X BNE *1 2 2 3 3
{ ADD 1,X INC ,X 2 1 3 3
buffer[i] = dataPtr[i]; PSHA LDA ,X 1 1 2 2
} LDA ,X PSHA 1 1 2 2
} ADC 2,X LDX 1,X 2 2 3 3
PSHA PULH 1 1 2 2
PULH CPHX 1 3 2 3
PULX #0x0004 1 2 2 3
12/11/2012 ,X de CDM –BLT
LDACátedra Facultad
*-39de Ingiería 1 2 2 2 21
UNLP
TSX AIS #4 1 1 2 4
Programación C Eficiente
Ejemplo - uso apropiado de índice i
Código C Código Código Bytes Bytes Ciclos Ciclos
Ensamblador Ensamblador
UINT8 buffer[4]; PSHA LDX ,X 1 1 2 2
PSHX TXA 1 1 2 1
void PSHH TSX 1 1 2 2
datacopy2(UINT8 * TSX LDX ,X 1 1 2 2
dataPtr) CLR ,X CLRH 1 1 2 1
{ LDA ,X STA buffer,X 1 3 2 4
UINT8 i; ADD 2,X TSX 2 1 3 2
for (i = 0; i < 4; i++) PSHA INC ,X 1 1 2 3
{ CLRA LDA ,X 1 1 1 2
buffer[i] = dataPtr[i]; ADC 1,X CMP #0x04 2 2 3 2
} PSHA BCS *-25 1 2 2 3
} PULH AIS #3 1 2 2 2
//103 ciclos menos PULX RTS 1 1 2 4
//17 bytes menos
Cátedra de CDM – Facultad de Ingiería
12/11/2012 22
UNLP
Programación C Eficiente
Ejemplo – copia de datos sin bucle
Código C Código Ensamblador Bytes Ciclos
UINT8 buffer[4];

void
datacopy3(UINT8 * dataPtr) PSHX 1 2
{ PULH 1 2
buffer[0] = dataPtr[0]; TAX 1 1
buffer[1] = dataPtr[1]; LDA ,X 1 2
buffer[2] = dataPtr[2]; STA buffer 3 4
buffer[3] = dataPtr[3]; LDA 1,X 2 3
} STA buffer:0x1 3 4
//10 bytes menos de ROM LDA 2,X 2 3
//144 ciclos menos de CPU STA buffer:0x2 3 4
LDA 3,X 2 3
STA buffer:0x3 3 4
RTS 1 4
Cátedra de CDM – Facultad de Ingiería
12/11/2012 23
UNLP
Programación C Eficiente
Ejemplo –bucle con decremento
Código C Código Ensamblador Bytes Ciclos
Void
loop1(void) PSHH 1 2
{ LDA #0x04 2 2
UINT8 i; TSX 1 2
for(i=4; i!=0; i--) STA ,X 1 2
{ TSX 1 2
/* code */ DBNZ ,X,*-offset 2 4
} PULH 1 2
} RTS 1 4

//2 bytes menos de ROM por iteración


//9 ciclos de CPU por iteración

Cátedra de CDM – Facultad de Ingiería


12/11/2012 24
UNLP
Programación C Eficiente
Referencias
[1] Stuart Robb, Creating Efficient C Code for the
MC68HC08 , Nota de Aplicación, East Kilbride,
Scotland, 2000.
E edded C De elop e t tools,
http://www.imagecraft.com, 1994.
‘efere e Ma ual: “oft are ICCHCxx , ImageCraft
Creations Inc.,2000.
I g. Ga riel Dubatti ,
http://www.ingdubatti.com.ar, 2007
Cátedra de CDM – Facultad de Ingiería
12/11/2012 25
UNLP
Programación en C Estructurada

Portabilidad del código

Cátedra de CDM – Facultad de Ingiería


12/11/2012 26
UNLP
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

Cátedra de CDM – Facultad de Ingiería


12/11/2012 27
UNLP
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: Es i e soft a e pa a ot os


o o te gusta ía ue lo es i a pa a os.

Cátedra de CDM – Facultad de Ingiería


12/11/2012 28
UNLP
Diseño de Código Reusable
• Código Documentado
• Abstracción
• Modularidad
• Software en capas

Cátedra de CDM – Facultad de Ingiería


12/11/2012 29
UNLP
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.

Cátedra de CDM – Facultad de Ingiería


12/11/2012 30
UNLP
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.

Cátedra de CDM – Facultad de Ingiería


12/11/2012 31
UNLP
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 la


funció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*/
Cátedra de CDM – Facultad de Ingiería
12/11/2012 32
UNLP
Niveles de Abstracción

Cátedra de CDM – Facultad de Ingiería


12/11/2012 33
UNLP
MODULARIDAD
• Razones:
• Abstracción funcional: Permite reutilizar módulos
de software desde múltiples lugares
• Abstracción en complejidad: Dividir un sistema
complejo en componentes pequeños y simples.
• Portabilidad: Permite programar un mismo
código em diferentes plataformas de HW .

Cátedra de CDM – Facultad de Ingiería


12/11/2012 34
UNLP
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 inferior
solo utilizando la API
• Un módulo no puede acceder directamente a ninguna
funció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)


Cátedra de CDM – Facultad de Ingiería
12/11/2012 35
UNLP
Programación en capas o niveles

Cátedra de CDM – Facultad de Ingiería


12/11/2012 36
UNLP
Descripción del software
codewarrior
Herramienta de programación en C,
Simulación y Debugger para sistemas
Embebidos de la Firma Freescale

Cátedra de CDM – Facultad de Ingiería


12/11/2012 37
UNLP
Codewarrior
Características
• Entorno de desarrollo integrado
• Destinado a Controladores de señales digitales
de Freescale
• Programación en C o Assembler

Cátedra de CDM – Facultad de Ingiería


12/11/2012 38
UNLP
Codewarrior
Ventana de inicio
•Crear proyecto
•Abrir un proyecto
existente
•Ejecutar ejemplos
•Usar el IDE

Cátedra de CDM – Facultad de Ingiería


12/11/2012 39
UNLP
Codewarrior – Dialogo de Entrada
La opción FILE->STARTUP DIALOG permite al usuario
seleccionar, el tipo de proyecto, el dispositivo, el
Cátedra de CDM – Facultad de Ingiería
12/11/2012 40
nombre y su ubicación. UNLP
Codewarrior
Nuevo Proyecto

Cátedra de CDM – Facultad de Ingiería


12/11/2012 41
UNLP
Codewarrior
Lenguaje de Programación
El IDE de CW
soporta tres tipos
de lenguajes:
Assembly, C y C++
también es posible
hacer la mezcla de
ellos en el mismo La opción de C++ está
proyecto habilitada en la versión
profesional

Cátedra de CDM – Facultad de Ingiería


12/11/2012 42
UNLP
Codewarrior
Creación de un Proyecto

Cátedra de CDM – Facultad de Ingiería


12/11/2012 43
UNLP
Codewarrior
Ventana de Proyecto

Cátedra de CDM – Facultad de Ingiería


12/11/2012 44
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
Cátedra de CDM – Facultad de Ingiería toda la secuencia de
12/11/2012 45
UNLP
inicialización de la CPU
Codewarrior
Ventana de Proyecto

Cátedra de CDM – Facultad de Ingiería


12/11/2012 46
UNLP
Codewarrior
Agregar Archivos Fuente
Los archivos fuente
de un proyecto se
deben agregar en la
carpeta sources

Cátedra de CDM – Facultad de Ingiería


12/11/2012 47
UNLP
Codewarrior
Inicialización del Dispositivo

Cátedra de CDM – Facultad de Ingiería


12/11/2012 48
UNLP
Codewarrior
Inicialización del Dispositivo

Cátedra de CDM – Facultad de Ingiería


12/11/2012 49
UNLP
Codewarrior
Inicialización del Dispositivo

Cátedra de CDM – Facultad de Ingiería


12/11/2012 50
UNLP
Codewarrior
Inicialización del Dispositivo

Cátedra de CDM – Facultad de Ingiería


12/11/2012 51
UNLP
Codewarrior
Código Inicial de un Proyecto

Cátedra de CDM – Facultad de Ingiería


12/11/2012 52
UNLP
Codewarrior
Proyecto compilado

Cátedra de CDM – Facultad de Ingiería


12/11/2012 53
UNLP
Codewarrior
Depurado de Proyecto
Para depurar una
aplicación lo que
tenemos que hacer
es apretar el icono
de depurado en la
ventana de
proyecto.

Esta ventana solo se


abrirá si no hay
errores

Cátedra de CDM – Facultad de Ingiería


12/11/2012 54
UNLP
Codewarrior
Referencias
I g. Ga riel Du atti ,
http://www.ingdubatti.com.ar, 2007
User Guide: P‘OCE““O‘ EXPE‘T FO‘
MOTO‘OLA HC “ 8 FAMILY Code arrior V
1.4 may,2004
[3] CodeWarrior™ De elop e t “tudio IDE .
User s Guide, Metro erks orporatio ,

Cátedra de CDM – Facultad de Ingiería


12/11/2012 55
UNLP
Definición de interrupciones
aplicadas sobre codewarrior
Forma rápida de habilitarlas

Cátedra de CDM – Facultad de Ingiería


12/11/2012 56
UNLP
Interrupciones en C
El empleo de ISR (Interrupt Service Routine, o
Rutina de Servicio de Interrupciones) es habitual
en los programas con micros. Pueden emplearse
para responder a una interrupción externa, una
interrupción del timer o del conversor A/D.
Codewarrior provee dos mecanismos para escribir
ISRs:
• Usando la directiva #pragma TRAP_PROC y el
archivo de parametros del Linker
• Usando la instrucción interrupt
Cátedra de CDM – Facultad de Ingiería
12/11/2012 57
UNLP
Interrupciones en C
La instrucción interrupt

• Es una instrucción especial de codewarrior


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

Cátedra de CDM – Facultad de Ingiería


12/11/2012 58
UNLP
Interrupciones en C
La instrucción interrupt
Ejemplo: interrupt 17 void Mi_ISR(void)
{
TBCR |= TACK; // Acknowledge Int
interrupt 17 void Mi_ISR();
PTA ^= 0x80;
//Instala Mi_ISR en la entrada 17 }
//de la tabla de vectores, //***************************//
//correspondiente al Timebase Module. void main (void)
//Con esta modificación, el {
CONFIG1 = 1; //Parar COP
//código de ejemplo quedaría
DDRA = 0xFF; //PTA todo salida
//de la siguiente forma: TBCR = 0x04; //Timebase divide por 8192
#define TBON 2 ENABLE_INT //Habilitar interrupciones
#define TACK 8 //Ack del TBCR TBCR |= TBON; //Prender el Timebase
#define ENABLE_INT {asm cli;} while (1) { //Hacer nada
}
#define DISABLE_INT {asm sei;}
}
Cátedra de CDM – Facultad de Ingiería
12/11/2012 59
UNLP
Interrupciones en C
Referencias
Referencias

• MC68HC908GP32 Technical Data (Motorola)


• Motorola HC08 Compiler (Metrowerks)
• Manual Smart Linker (Metrowerks)

Cátedra de CDM – Facultad de Ingiería


12/11/2012 60
UNLP
I lusió de fu io es e 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

Cátedra de CDM – Facultad de Ingiería


12/11/2012 61
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 Assembler
Sobre un programa en C

Cátedra de CDM – Facultad de Ingiería


12/11/2012 62
UNLP
Inclusión de Subrutinas en Assembler
en 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: SECTION
ASMData: DS.W 1 ; definición de una variable
ConstSec: SECTION
ASMConst: DC.W $44A6 ;definición de una constante
Cátedra de CDM – Facultad de Ingiería
12/11/2012 63
UNLP
Inclusión de Subrutinas en Assembler
en 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;
Cátedra de CDM – Facultad de Ingiería
12/11/2012 64
UNLP
Inclusión de Subrutinas en Assembler
en un Programa en C
Acceso de rutinas en Assembler desde un Archivo C
Una Función mixasm.asm en assembler se puede llamar desde un
archivo en C.
Archivo Assembler:
XREF CData
XDEF AddVar
XDEF ASMData
DataSec: SECTION
ASMData: DS.B 1
CodeSec: SECTION
AddVar:
ADD CData ; suma Cdata al acumulador
STA ASMData ; guarda el resultado en ASMData
RTS Cátedra de CDM – Facultad de Ingiería
12/11/2012 65
UNLP
Inclusión de Subrutinas en Assembler
en 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_ */
Cátedra de CDM – Facultad de Ingiería
12/11/2012 66
UNLP
Inclusión de Subrutinas en Assembler
en un Programa en C
Acceso de rutinas en Assembler desde un Archivo C
A o ti ua ió se uest a o o u a hi o C mixc.c lla a a la fu ió e
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
}
Cátedra de CDM – Facultad de Ingiería
12/11/2012 67
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

Cátedra de CDM – Facultad de Ingiería


12/11/2012 68
UNLP
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 variable
XREF CConst; declaración externa de una constante

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

LDA Cconst;
………………
LDA CData

Cátedra de CDM – Facultad de Ingiería


12/11/2012 69
UNLP
Referencias
[1] CodeWarrior™ De elop e t “tudio IDE .
User s Guide, Metro erks orporatio ,

Cátedra de CDM – Facultad de Ingiería


12/11/2012 70
UNLP

También podría gustarte