Вы находитесь на странице: 1из 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

Interna 256 bytes (128+128)


Memoria de datos
-escritura/lectura
-Variables Externa Hasta 64 Kbytes

Interna 4 Kbytes de ROM


Memoria de programa
-slo lectura.
Externa Hasta 64 Kbytes
-Cdigo de programa:
libreras, funciones y constantes.

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

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

Memoria de datos -EEPROM (2048 bytes)

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 FFH
Direcc. Direcc.
Indirecto Directo
128 bytes SFR
Especificador
128 bytes
idata
7FH 7FH
Direcc. Indirecto Direcc.
(Hasta 256 bytes) Especificador
Directo
& data
Indirecto Direcc. Directo
128 bytes Accesos rpidos
00H

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)

2
Especificadores de memoria
de datos externa y de programa

Memoria de datos externa (acceso ms lento)


Especificador xdata
Hasta 64 Kbytes

Memoria de datos externa paginada


Especificador pdata
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)

3
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)

4
Constantes, variables
y tipos de datos

C51 soporta 4 nuevos tipos de datos.


Tipo de datos Bits Bytes Rango de valores

signed char 8 1 -128 a +127


unsigned char 8 1 0 a 255
enum 16 2 -32768 a +32768
signed short 16 2 -32768 a +32768
unsigned short 16 2 0 a 65535
signed int 16 2 -32768 a +32768
unsigned int 16 2 0 a 65535
signed long 32 4 -2147483648 a 2147483647
unsigned long 32 4 0 a 4294967295
float 32 4 1.175494E-38 a 3.402823E+38
bit 1 0a1
sbit 1 0a1
sfr 8 1 0 a 255
sfr16 16 2 0 a 65535
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)

5
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)

6
Estructuras

datos relacionados
Estructuras
igual o distinto tipo
Ejemplo:
Situacin en memoria
struct coordenadas{
unsigned char punto[10]; punto 10 bytes
unsigned int x; x 2 bytes
unsigned int y; y 2 bytes
}; /*define la estructura coordenadas*/
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)

7
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> void main ()


struct TDatos {
{ Datos.bit0 = 0;
unsigned char bit0:1; Datos.bit1 = 1;
unsigned char bit1:1; Datos.bit2 = 1;
unsigned char bit2:1; Datos.bit3 = 0;
Datos2.bit0 = 0;
unsigned char bit3:1; Datos.bit4 = 1;
Datos2.bit1 = 1;
unsigned char bit4:1; Datos.bit5 = 1; Datos2.bit2 = 1;
unsigned char bit5:1; Datos.bit6 = 1;
Datos2.bit3 = 0;
unsigned char bit6:1; Datos.bit7 = 0; Datos2.bit4 = 1;
unsigned char bit7:1; Datos2.bit5 = 1;
}; Datos2.bit6 = 1;
struct TDatos Datos; Datos2.bit7 = 0;
bdata struct TDatos Datos2;
while (1);
}

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

8
Estructuras

; SOURCE LINE # 21 ; SOURCE LINE # 25


Ejemplo: MOV A,Datos MOV A,#001H
ANL A,#0FEH SWAP A
MOV Datos,A MOV B,A
void main () ; SOURCE LINE # 22 MOV A,Datos
{ MOV A,#001H
RL A
ANL A,#0EFH
ORL A,B
Datos.bit0 = 0; MOV B,A MOV Datos,A
MOV A,Datos ; SOURCE LINE # 26
Datos.bit1 = 1; ANL A,#0FDH MOV A,#001H ; SOURCE LINE # 28
Datos.bit2 = 1; ORL A,B SWAP A CLR A
MOV Datos,A RL A SWAP A
Datos.bit3 = 0; ; SOURCE LINE # 23 MOV B,A RL A
RL A
Datos.bit4 = 1; MOV A,#001H
RL A
MOV A,Datos
ANL A,#0DFH RL A
Datos.bit5 = 1; RL A ORL A,B MOV B,A
MOV B,A MOV Datos,A MOV A,Datos
Datos.bit6 = 1; MOV A,Datos ; SOURCE LINE # 27 ANL A,#07FH
Datos.bit7 = 0; ANL A,#0FBH MOV A,#001H ORL A,B
ORL A,B SWAP A MOV Datos,A
MOV Datos,A RL A
; SOURCE LINE # 24 RL A
CLR A MOV B,A
RL A MOV A,Datos
RL A ANL A,#0BFH
RL A ORL A,B
MOV B,A MOV Datos,A
MOV A,Datos
ANL A,#0F7H
ORL A,B
MOV Datos,A

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

Estructuras

Ejemplo:

; SOURCE LINE # 31
Datos2.bit0 = 0; CLR Datos2.0
; SOURCE LINE # 32
Datos2.bit1 = 1; SETB Datos2.1
Datos2.bit2 = 1; SETB
; SOURCE LINE # 33
Datos2.2
Datos2.bit3 = 0; ; SOURCE LINE # 34
CLR Datos2.3
Datos2.bit4 = 1; ; SOURCE LINE # 35
Datos2.bit5 = 1; SETB Datos2.4
; SOURCE LINE # 36
Datos2.bit6 = 1; SETB Datos2.5
Datos2.bit7 = 0; SETB
; SOURCE LINE # 37
Datos2.6
; SOURCE LINE # 38
CLR Datos2.7
while (1); ?WHILE1:
} ; SOURCE LINE # 41
SJMP ?WHILE1

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

9
Uniones
datos relacionados
Uniones
igual o distinto tipo
Los datos se superponen en la memoria, no se guardan correlativos

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

& Tiene sentido cuando los datos se tratan en distinto instante de tiempo
Ejemplo: union Ttemporizador{
unsigned int word;
struct {
unsigned char hi;
unsigned char low;
} bytes;
};
union Ttemporizador new_count; 1 byte char hi
new_count.bytes.hi = TH1; int word 2 bytes
new_count.bytes.low = TL1; 1 byte char lo
old_count = new_count.word;
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
x_ptr
4A

4B
4A xxxxxxxx
49

data xdata

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
memoria + Hi dir. Lo dir.

1 byte 1 byte 1 byte


Especificadores de memoria:
Tipo de memoria idata xdata pdata data/bdata code
Valor 1 2 3 4 5
+ lento
& Cdigo con punteros genrico
- 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.


& Para evitar problemas de longitud en los punteros:
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
temp [1] *(temp+1)
. . . *(temp+n)
int temp [20] . . . Permite acceder
. . . a los elementos del array
. .
temp [19] *(temp+19)

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

& La variable puntero puede servir de ndice y permite acceder


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]
i=0.
char *nombres[]=
{Jose, *nombres[0] Jose
Julio, *nombres[1] Julio
Antonio, *nombres[2] Antonio
Ana
}; *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, *ptr
tiempo
int retardo,
char patron retardo
};
struct medida x, *ptr; patron
ptr =&x;

& 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; El bucle se repite mientras la condicin sea cierta
P2=0x0C;
}

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)
cierta (0)sentencia1
sentencia1;
Ifelse evala la expresin test
else falsa (=0)sentencia2
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) verdadero
{ Sentencias
int n, factorial=1;
for(n=6;n!=1;n--) factorial*=n;
Expresin_rep.
printf (el factorial de 6 es %d \n,factorial);
}

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 otro
switch (num) Num?
{
case 1: num=2
sentencia_1;
break; sentencia_1 sentencia_2 otras_sent
case 2:
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

Nombre
Declaracin (prototipado)
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

#pragma small Vbles i,j,k de main en RAM interna

void main (void)


{
int i=10, j=20, k;
k= xfunc(i, j); Argumentos x,y en memoria xdata
}

int xfunc(int x, int y) large using 2 Banco de registros 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)


char/ptr int/ptr ptr
argumento long/float genrico
(1 byte) (2 bytes)
1 R7 R6,R7 R4-R7 R1-R3

2 R5 R4,R5 R4-R7 R1-R3

3 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 Registro

char (1 byte) R4
int (2 bytes) R4,R5

ptr genrico (3 bytes) 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) La directiva NOREGPARAMS
void main (void) activa el paso a travs de memoria
{
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)
{ REGPARAMS
int z; activa el paso a travs de registros
z=x*y;
return(z-x-y);
}
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

int xfunc (int x, int y) large reentrant Pila con x, y, z en xdata


{
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 0
Timer 0 1
Externa 1 2
Timer 1 3
P. Serie 4
Timer 2 5
PCA 6
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


{
Define el banco de reg de
TH1=-100;
TL1=-100;
la funcin (el 1).
ET1=1;
if (dtime=256) P1=1; Ahorro de tiempo
dtime++;
}
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; EXTERN x,y;


int num(int){ EXTERN int num (int)
...}

Universidad de Alcal. Escuela Politcnica


Sistemas Electrnicos Digitales II (I. T. Telecomunicacin)

21

Вам также может понравиться