You are on page 1of 21

Laboratorio de

Sistemas Electrnicos Digitales II

Iniciacin a la programacin
en C del microcontrolador 8051

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Organizacin de la memoria
en el 8051

Memoria de datos
-escritura/lectura
-Variables

Interna

256 bytes (128+128)

Externa

Hasta 64 Kbytes

Interna
Memoria de programa
-slo lectura.
Externa
-Cdigo de programa:
libreras, funciones y constantes.

4 Kbytes de ROM
Hasta 64 Kbytes

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Organizacin de la memoria
en el T89C51RD2
- 256 bytes (128 + 128)
Interna

-XRAM (1024 bytes)


-EEPROM (2048 bytes)

Memoria de datos
Externa

- Hasta 64 Kbytes

Interna

- FLASH (64 Kbytes)

Memoria de programa
Externa - Hasta 64 Kbytes
Tipo y regin de memoria

6 tipos de especificadores en C51

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Especificadores de
memoria de datos interna
Memoria de datos interna de acceso directo y/o indirecto
FFH
Direcc.
Indirecto
128 bytes

Especificador

idata
Direcc. Indirecto
(Hasta 256 bytes)

FFH

7FH

00H

Direcc.
Directo
SFR
128 bytes

Direcc.
Directo
&
Indirecto
128 bytes

7FH
Especificador

data
Direcc. Directo
Accesos rpidos

Especificador bdata Direcc. directo de 16 bytes (128 bits) (20H-2FH)


direccionables bit a bit para vbles de carcter y enteras.
Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Especificadores de memoria
de datos externa y de programa
Especificador xdata

Memoria de datos externa (acceso ms lento)


Hasta 64 Kbytes

Especificador pdata

Memoria de datos externa paginada


Primeros 256 bytes (pgina 0) a travs del puerto 0.

Especificador code

Memoria de programa (64 Kbytes)


Slo lectura

Ejemplos:
1) char data x, y; /*vbles x, y residen en memoria interna, acceso directo (rapidez) */
2) unsigned int xdata buffer[100]; /* array buffer situado en memoria externa */
3) unsigned char code parametros[]={0x10, 0x20, 0x40, 080}; /*constantes
almacenadas en la memoria de programa (ROM)*/
Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Especificadores de
almacenamiento.
En general
data

Vbles que requieren uso rpido y frecuente

idata Estructuras y arrays cortos.

El cdigo generado es ms corto

xdata Si el tiempo de ejecucin no es crtico.


Arrays y estructuras de gran tamao.

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Modelos de memoria
Especifica el tipo de memoria utilizada por defecto para variables
y argumentos de funciones no declaradas explcitamente.
small Empleado por defecto. Vbles y datos residen en memoria
de datos interna (=data). Es el ms rpido.
compact Vbles y datos residen en una pgina de memoria
de datos externa (=pdata). Velocidad intermedia.
large Vbles y datos residen en la memoria de datos externa (=xdata).
El ms lento y genera cdigo ms largo.

Se declara como parmetro del compilador o con la directiva #pragma


Ejemplo:
#pragma COMPACT ; /* memoria definida por defecto para todo el programa */
Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Modelos de memoria
Las variables internas de una funcin se pueden forzar
a residir en un rea de memoria
Ejemplo:
int func (int x, int y) large
{
x=10;
y=20;
printf (la suma es %d \n, x+y);
return (x-y+5);
}
Sita las vbles locales de func en la memoria externa.

&

Puede interesar definir el tipo de memoria para una funcin


segn su utilidad.
Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Constantes, variables
y tipos de datos
C51 soporta 4 nuevos tipos de datos.
Tipo de datos

Bits

Bytes

Rango de valores

signed char
unsigned char
enum
signed short
unsigned short
signed int
unsigned int
signed long
unsigned long
float
bit
sbit
sfr
sfr16

8
8
16
16
16
16
16
32
32
32
1
1
8
16

1
1
2
2
2
2
2
4
4
4

-128 a +127
0 a 255
-32768 a +32768
-32768 a +32768
0 a 65535
-32768 a +32768
0 a 65535
-2147483648 a 2147483647
0 a 4294967295
1.175494E-38 a 3.402823E+38
0a1
0a1
0 a 255
0 a 65535

1
2

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Nuevos tipos de datos del C51


bit datos de un solo bit. Se almacenan en la memoria interna
de direccionamiento bit a bit (20H-2FH). Mx. 128 vbles tipo bit.
No se pueden declarar ni punteros ni arrays de bits.
sbit permite acceder a bits individuales de una vble. tipo bdata
y registros de funcin especial (SFR) direccionables bit a bit
(con direccin divisible entre 8).

Ejemplos:
1) bit flag1=0, semaforo; /*define vbles flag y semaforo de tipo bit e inicializa flag1=0*/
2) char bdata valor;
sbit valor_3=valor^3; /* valor en rea direccionable bit a bit; valor_3 = cuarto bit de valor*/
3) unsigned int bdata numero;
sbit num_8=numero^8;
sbit num_0=numero^0;
numero=0x0100; /* num_0 valdr 1 y num_8 valdr 0 */
4) sbit at 0xAF EA; /* establece EA como vble. tipo bit cuya dir es la 0xAF de mem. interna*/
Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Nuevos tipos de datos del C51 (II)


sfr declara un tipo de variable de la zona SFR de la CPU,
indicando nombre y direccin.
sfr16 declara un tipo de variable de la zona SFR de 16 bits,
indicando nombre y direccin .
*En este caso, el orden del LSB y MSB es al contrario.

Ejemplos:
Todos los registros SFR estn definidos en el archivo reg51.h
1) sfr at 0x80 P0 ;
sfr P0 = 0x80; /* dos formas de definir el puerto 0 */
2) sbit P0_7 = P0^7; /* bit 7 del puerto 0 (empezando por el 0)*/
3) sfr16 DPTR = 0x82; /* SFR de 16 bits */
4) P0_7=1; /* pone el bit 7 del puerto 0 a uno */
5) TCON=0x40; /*SFR TCON a 40h*/
Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Arrays, estructuras y uniones


Son agrupaciones de datos
Arrays Agrupan datos de un mismo tipo.
Ejemplo:
int xdata temp[20]; /*define un array de 20 datos de tipo int, que se almacenan en la RAM
externa. Los datos se referencian del 0 al 19 */
unsigned char code tabla_orden[]=
{primero,
segundo,
tercero}; /* define los datos de tipo char que se almacenan
en la memoria de programa */

&

Si el tamao del array es grande conviene inicializarlo en el rea xdata


Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Estructuras
Estructuras

datos relacionados
igual o distinto tipo

Ejemplo:

Situacin en memoria

struct coordenadas{
unsigned char punto[10];
unsigned int x;
unsigned int y;
}; /*define la estructura coordenadas*/

punto
x
y

10 bytes
2 bytes
2 bytes
14 bytes

& Un estructura con este tipo de datos se declara del modo:


struct coordenadas coor_robot;

& Y se inicializa del modo:


struct coordenadas coor_robot={R2D2, 10, 5};
Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Estructuras
Los miembros de la estructura se acceden mediante el operador .

Ejemplo:
.
.
struct coordenadas coor_robot={R2D2, 10, 5};
printf (El robot %s tiene como coordenadas %d , %d \n,
coor_robot.punto, coor_robot.x, coor_robot.y);
Lo que dar como resultado:
El robot R2D2 tiene como coordenadas 10, 5

&

Slo se pueden poner elementos de tipo bit si la estructura se


encuentra en bdata

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Estructuras
El especificador bdata permite forzar a una estructura a residir en el
rea de memoria direccionable bit a bit

Ejemplo:
bdata struct Tswithches {
unsigned char sw1;
unsigned char sw2;
} swithches;
sbit sw_read1 = switches.sw1 ^ 0;
sbit sw_read2 = switches.sw2 ^ 4;

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Estructuras
Ejemplo:
#include <reg51.h>
struct TDatos
{
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
};
struct TDatos Datos;
bdata struct TDatos Datos2;

void main ()
{
Datos.bit0 = 0;
Datos.bit1 = 1;
Datos.bit2 = 1;
Datos.bit3 = 0;
Datos.bit4 = 1;
Datos.bit5 = 1;
Datos.bit6 = 1;
Datos.bit7 = 0;

Datos2.bit0 = 0;
Datos2.bit1 = 1;
Datos2.bit2 = 1;
Datos2.bit3 = 0;
Datos2.bit4 = 1;
Datos2.bit5 = 1;
Datos2.bit6 = 1;
Datos2.bit7 = 0;
while (1);
}

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Estructuras
Ejemplo:
void main ()
{
Datos.bit0 = 0;
Datos.bit1 = 1;
Datos.bit2 = 1;
Datos.bit3 = 0;
Datos.bit4 = 1;
Datos.bit5 = 1;
Datos.bit6 = 1;
Datos.bit7 = 0;

; SOURCE LINE # 21
MOV A,Datos
ANL A,#0FEH
MOV Datos,A
; SOURCE LINE # 22
MOV A,#001H
RL
A
MOV B,A
MOV A,Datos
ANL A,#0FDH
ORL A,B
MOV Datos,A
; SOURCE LINE # 23
MOV A,#001H
RL
A
RL
A
MOV B,A
MOV A,Datos
ANL A,#0FBH
ORL A,B
MOV Datos,A
; SOURCE LINE # 24
CLR A
RL
A
RL
A
RL
A
MOV B,A
MOV A,Datos
ANL A,#0F7H
ORL A,B
MOV Datos,A

; SOURCE LINE # 25
MOV A,#001H
SWAP A
MOV B,A
MOV A,Datos
ANL A,#0EFH
ORL A,B
MOV Datos,A
; SOURCE LINE # 26
MOV A,#001H
SWAP A
RL
A
MOV B,A
MOV A,Datos
ANL A,#0DFH
ORL A,B
MOV Datos,A
; SOURCE LINE # 27
MOV A,#001H
SWAP A
RL
A
RL
A
MOV B,A
MOV A,Datos
ANL A,#0BFH
ORL A,B
MOV Datos,A

; SOURCE LINE # 28
CLR A
SWAP A
RL
A
RL
A
RL
A
MOV B,A
MOV A,Datos
ANL A,#07FH
ORL A,B
MOV Datos,A

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Estructuras
Ejemplo:
Datos2.bit0 = 0;
Datos2.bit1 = 1;
Datos2.bit2 = 1;
Datos2.bit3 = 0;
Datos2.bit4 = 1;
Datos2.bit5 = 1;
Datos2.bit6 = 1;
Datos2.bit7 = 0;
while (1);
}

CLR
SETB
SETB
CLR
SETB
SETB
SETB
CLR
?WHILE1:
SJMP

; SOURCE LINE # 31
Datos2.0
; SOURCE LINE # 32
Datos2.1
; SOURCE LINE # 33
Datos2.2
; SOURCE LINE # 34
Datos2.3
; SOURCE LINE # 35
Datos2.4
; SOURCE LINE # 36
Datos2.5
; SOURCE LINE # 37
Datos2.6
; SOURCE LINE # 38
Datos2.7
; SOURCE LINE # 41
?WHILE1

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Uniones
Uniones

datos relacionados
igual o distinto tipo

Los datos se superponen en la memoria, no se guardan correlativos

&
& Tiene sentido cuando los datos se tratan en distinto instante de tiempo

El compilador reserva en memoria espacio para el miembro que ms ocupa

union Ttemporizador{
unsigned int word;
struct {
unsigned char hi;
unsigned char low;
} bytes;
};
union Ttemporizador new_count;
1 byte
new_count.bytes.hi = TH1;
new_count.bytes.low = TL1;
1 byte
old_count = new_count.word;

Ejemplo:

char hi
int word 2 bytes
char lo

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Punteros
Guardan las direcciones de otras variables (direccionamiento indirecto)

& Utilidad: indexacin, direccionamiento y movimiento de datos


Operador de indireccin: *
& Operadores: Operador de direccin: &
& Se definen segn el tipo de dato al que sealan y son de tipo unsigned int
Ejemplo
void main(void)
{
char x, *px;
/* declara vble x y puntero px tipo carcter*/
px=&x;
/* puntero px apuntando a la direccin que contiene x*/
x='m'; /* valor de la variable x= 'm' */
printf ("px apunta a la direccin %p, que contiene %c \n", px, *px);
}
Resultado : px apunta a la direccin I:000B, que contiene m
Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

10

Punteros tipo en C51


En general, se declaran segn la sintaxis:
dato_tipo mem_tipo_d * [mem_tipo_ptr] ptr_nombre [ = direccin];
dato_tipo: Tipo de dato a ser apuntado: char, int, float, ...
mem_tipo_d: Especificador de memoria. Define el espacio de memoria donde
estn los datos apuntados. (code, data, idata, pdata, o xdata).
mem_tipo_ptr: Especificador de memoria (opcional) donde reside el puntero.
(code, data, idata, pdata, o xdata). Si no se define, es el que exista por defecto.
ptr_nombre: Nombre asignado a la variable puntero.
direccin: Opcionalmente, constituye el valor de direccin con el que se inicializa.
data [0x00 , 0x7F];idata [0x00 , 0xFF];
xdata [0x0000 , 0xFFFF]; pdata [0x00 , 0xFF];
code [0x0000 , 0xFFFF]
Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Punteros en C51
En C51 existen dos tipos de punteros:
1) Punteros tipo: en ellos se declara el tipo de memoria a la que apuntan.
2) Punteros genricos: el tipo de memoria a la que apuntan se define
durante la compilacin.
Ejemplo puntero tipo
unsigned char data * xdata x_ptr;
,declara x_ptr como puntero almacenado en memoria xdata,
para apuntar datos almacenados en memoria data de tipo carcter.

& La memoria que ocupa por un puntero tipo depende del dato al que apunte:
punteros a idata, data, bdata, y pdata 1 byte
punteros a code y xdata 2 bytes
Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

11

Punteros en C51
Ejemplo:
unsigned char data * xdata x_ptr;
dato
Tipo de memoria donde reside el puntero
4
4A
4B
4A

x_ptr

xxxxxxxx

49

xdata

data

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Punteros genricos en C51


No tienen declarado explcitamente el tipo de memoria al que apuntan
Ejemplos puntero genrico
unsigned char * x_ptr;
unsigned int * data y_ptr;

& Un puntero genrico necesita 3 bytes para almacenarse:


Especificador
Hi dir.
Lo dir.
+
memoria
1 byte
Especificadores de memoria:
Tipo de memoria idata
Valor
1

&

xdata
2

1 byte
pdata
3

1 byte

data/bdata
4

Cdigo con punteros genrico

code
5

+ lento
- eficiente

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

12

Conversin de punteros
Algunas funciones requieren punteros genricos como argumento:
Ej: printf, sprintf, gets

& Si no se declara en el prototipopuntero argumento de la funcin genrico.


evitar problemas de longitud en los punteros:
& Para
usar prototipos de las funciones y ficheros include
Ejemplo de conversin de punteros
int *ptr1; /* puntero genrico (3 bytes) */
int xdata *ptr2; /* puntero xdata (2 bytes) */
int idata *ptr3; /* puntero idata (1 byte) */
void pconv(void)
{
ptr1 = ptr2; // xdata * a genrico *
ptr3 = ptr1; // genrico * a idata *
}
Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Punteros a arrays
El nombre de un array es un puntero fijo
temp [0]
temp [1]
.
int temp [20]
.
.
.
temp [19]

&

.
.
.

*temp
*(temp+1)
.
.
.
.
*(temp+19)

*(temp+n)
Permite acceder
a los elementos del array

&temp[n] es la direccin del elemento n+1 del array

puede servir de ndice y permite acceder


& La variable puntero
a los elementos del array.
char *parray={el sol, el mar y la tierra} char parray[]={el sol, el mar y la tierra}

& Arrays bidimensionales: *(*(temp+n)+m) equivale a temp[n][m]


Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

13

Arrays de punteros
Permiten apuntar a diferentes elementos de un grupo de datos
Ejemplo:

*(nombres+i)[n]

char *nombres[]=
{Jose,
Julio,
Antonio,
Ana
};

i=0.
*nombres[0]

Jose

*nombres[1]

Julio

*nombres[2]

Antonio

*nombres[3]

Ana

& Las cadenas agrupadas de esta forma ocupan menos memoria


Aplicacin: Acceso rpido a mensajes para ser mostrados por un display
Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Punteros a estructuras y uniones


Permiten acceder a cualquier elemento de la estructura o union
Ejemplo:
struct medida {
int tiempo,
int retardo,
char patron
};
struct medida x, *ptr;
ptr =&x;

tiempo

*ptr

retardo
patron

& El acceso a los miembros se realiza con el operador >


ptr >retardo=30;
ptr >patron=0x40;
Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

14

Sentencias de control (I)


Permiten que un grupo de sentencias se ejecute de modo selectivo

& Se usan para controlar el flujo del programa


Sentencias while y dowhile
While monitoriza el cumplimiento de una condicin
Ejemplo:
while (P1&0x20)
{
x=P1;
P1=0x00;
P2=0x0C;
}

El bucle se repite mientras la condicin sea cierta

dowhile asegura que el bucle se realiza al menos una vez


Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Sentencias de control (II)


Sentencias ifelse
Sintaxis:
if (test)
sentencia1;
else
sentencia2;

cierta (0)sentencia1
Ifelse evala la expresin test

falsa (=0)sentencia2

& else se puede combinar con if para generar secuencias anidadas


Ejemplo
if (var==10)
printf(La variable es 10");
else if (var==20)
printf(La variable es 20);
else
printf(La variable no es ni 10 ni 20);
Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

15

Sentencias de control (III)


Sentencia for
Sintaxis:
for (expresin_inicio; expresin_test; expresin_rep)
{
sentencias de C;
}

Expresin_inicio
falso

test

Ejemplo
void main (void)
{
int n, factorial=1;
for(n=6;n!=1;n--) factorial*=n;
printf (el factorial de 6 es %d \n,factorial);
}

verdadero
Sentencias
Expresin_rep.

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Sentencias de control (IV)


Sentencias switch, case, break y default
Sintaxis:

num=1

switch (num)
{
case 1:

Num?

otro

num=2
sentencia_1;
break;

case 2:

sentencia_1

sentencia_2

otras_sent

sentencia_2;
break;
default:
otras_sentencias
}

& Permiten desviar el flujo del programa en funcin de una vble.


continue provoca el salto hasta el final del bloque en curso.
Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

16

Funciones
Permiten una programacin estructurada.
Realizan tareas especficas y pueden comunicarse entre ellas
a travs de parmetros y resultados.
Despus de su ejecucin el control se devuelve al mdulo que la
llam, para continuar su ejecucin a partir del mismo punto

Declaracin (prototipado)

&

Nombre
Argumentos
Datos que devuelve
Tipo de memoria utilizada

Emplear memoria tipo small es ms rpido, pero tiene poco tamao


Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Funciones (II)
Formato de declaracin de una funcin en C51
return_tipo nombre_func(arg) [mem_tipo] [reentrant] [interrupt] [using]
return_tipo: Tipo del valor retornado por la funcin. Si no se especifica, se asume por
defecto el tipo int.
nombre_func: Nombre de la funcin.
args: Es la lista de argumentos de la funcin.
mem_tipo: Especificacin explcita del modelo de memoria (small, compact,o large)
reentrant: Indica que la funcin es recursiva o reentrante.
interrupt: Indica que se trata de una funcin de interrupcin.
using: Especifica el banco de registros utilizado por la funcin (0-3) (ej. Using 2)
Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

17

Funciones (III)
Ejemplo
Vbles i,j,k de main en RAM interna

#pragma small
void main (void)
{
int i=10, j=20, k;
k= xfunc(i, j);
}

Argumentos x,y en memoria xdata


Banco de registros 2

int xfunc(int x, int y) large using 2


{
int z;
z=x*y;
return(z-x-y);
}

& El banco (0-3) de registros (R0-R7) se puede elegir mediante REGISTERBANK


Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Funciones (IV)
Paso de parmetros a una funcin
Debido al pequeo tamao de la pila (128 bytes)
el paso de parmetros se realiza de dos modos:

1) Paso a travs de registros (por defecto)

&3 parm mx. Los dems se pasan a travs de memoria (especificada en f)


argumento

char/ptr
(1 byte)

int/ptr
(2 bytes)

long/float

ptr
genrico

R7

R6,R7

R4-R7

R1-R3

R5

R4,R5

R4-R7

R1-R3

R3

R2,R3

R1-R3

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

18

Funciones (V)
Tambin se pueden retornar los valores la funcin a travs de registros
Tipo de dato
char (1 byte)

R4

int (2 bytes)

R4,R5

ptr genrico (3 bytes)

&

Registro

R0,R2,R3

float (4 bytes)

R4-R7

double (6 bytes)

R2-R7

long double (7 bytes)

R1-R7

El paso de parmetros y resultados a travs de registros es el ms rpido

&

No permite el paso de argumentos tipo bit y est limitado a 3.


Universidad de Alcal. Escuela Politcnica
Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Funciones (VI)
2) Paso de parmetros a travs de memoria
#pragma NOREGPARMS
extern int bfunc(float, int, char)
void main (void)
{
int i=10, j=20, n, k;
float x=3.1416;
char ch=65;
n=bfunc(x, i, ch);
k=xfunc(i, j);
printf (%d, %d , n, k);
}
#pragma REGPARMS
int xfunc(int x, int y)
{
int z;
z=x*y;
return(z-x-y);
}

La directiva NOREGPARAMS
activa el paso a travs de memoria

REGPARAMS
activa el paso a travs de registros

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

19

Funciones (VI)
Funciones reetrantes
Se declaran mediante la directiva reentrant
Puede ser llamada simultneamente por otras funciones
o recursivamente por ella misma
Sus vbles locales y parmetros se almacenan en una pila
ubicada segn el modelo de memoria de la funcin
No reciben parmetros a travs de registros (REGPARAMS)
Ejemplo

Pila con x, y, z en xdata

int xfunc (int x, int y) large reentrant


{
int z;
z=x*y;
return(z-x-y);
}

& Peligro de overflow en modelo small

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Funciones (VII)
Funciones de interrupcin
Suspenden el programa principal para su ejecucin ante
una peticin externa (hardware, puerto serie) o interna (timers)
Se declaran mediante la directiva interrupt n. siendo, n el
nmero de identificacin de la interrupcin:
Interrupcin

Nmero

Externa 0

Timer 0

Externa 1

Timer 1

P. Serie

Timer 2

PCA

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

20

Funciones (VII)
Funciones de interrupcin
Cuando se llama a una rutina de interrupcin la CPU:
1.-Salva ACC,B, DPH, DPL, y PSW en la pila si es necesario
2.-Salva los registros de trabajo a utilizar por la func. de interrupcin en la pila
3.-Ejecuta la func. de interrupcin
4.-Restaura todos los registros guardados en la pila
5.-Ejecuta la instruccin RETI
Interrupcin Timer 1

Ejemplo
void tiempo (void) interrupt 3 using 1
{
TH1=-100;
TL1=-100;
ET1=1;
if (dtime=256) P1=1;
dtime++;
}

Define el banco de reg de


la funcin (el 1).
Ahorro de tiempo

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Programas y mdulos
Un programa consta de varios mdulos.
Estos se desarrollan por separado y pueden ser almacenados
como archivos de programa individuales.
Pueden tener parte en C y parte en ensamblador
La directiva PUBLIC declara una vble accesible por otros mdulos
La directiva EXTERN declara una vble definida en otro mdulo
mod_1.c

mod_2.c

PUBLIC x,y;
int num(int){
...}

EXTERN x,y;
EXTERN int num (int)

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

21