1. Arquitectura y mapa de memoria del C167

Anuncio
Arquitectura y mapa de memoria del 80C167
Cesáreo Fernández Martínez
Álvaro Sánchez Miralles
Introducción
• Microcontrolador (Embedded Processor) de 16 bits
– ALU y Registros de 16 bits
• Diseñado para tareas de control industrial
– Robusto frente al ruido electromagnético
• Rango direccionamiento: 16 Mbytes (memoria)
• Con memoria RAM interna
– Ciertas versiones disponen también de ROM interna
• Con muchos dispositivos integrados en el chip
–
–
–
–
–
Controladores de comunicaciones serie
Puertos paralelo
Temporizadores (timers)
Convertidor analógico/digital (A/D)
Moduladores PWM (electrónica de potencia).
Título Presentación - 2
“Modelo de programador” del 167
Memoria
CPU
FF FFFF
Registros
00 0001
00 0000
00 FE00
R7
R15
PC
R6
R14
PSW
R5
R13
SP
R4
R12
R3
R11
R2
R10
R1
R9
R0
R8
(SFR’s)
(GPR’s)
00 FE02
I/O (SFR’s)
00 FE0X
Título Presentación - 3
Memoria
• Organizada en “celdas” de 1 BYTE (8 bits).
– ¿Cuál es el valor máximo que se puede almacenar en una celda?
• Cada byte tiene su DIRECCIÓN
– Dada en 24 bits (16 Mbytes)
– Cuando se habla de direcciones en clase siempre por defecto
están en hexadecimal y con 24 bits. A veces se obvian los ceros a
la izquierda.
• Ejemplo: 00 05FF se suele escribir 5FF
• Se accede a la memoria usando la dirección
– Lectura/escritura (datos/direcciones: 1’s y 0’s)
dato = READ (dirección)
WRITE(dato, dirección)
• Registros (CPU): Posiciones de memoria de acceso rápido
• I/O. En el 167 el acceso a puertos es similar al acceso a memoria
Título Presentación - 4
Primer ejemplo
• Suma de dos datos en ASS 167
Suma (0x100)+(0x102) en (0x104)
MOV
MOV
ADD
MOV
R0,0x100
R0,0x102
R1,R0
0x104,R1
; READ
; READ
;WRITE
• Para llenar R0 hacen falta dos bytes! (2 bytes por
dato)
– En direcciones consecutivas de memoria (0x100/0x101)
– Parte baja del dato (en R0) en dirección par
Título Presentación - 5
Programas en C y Ensamblador
• Primer ejemplo: bucle “for”
• En lenguaje C
for (i=1; i <=N; i++)
j += 1;
• En lenguaje ensamblador
Dirección inicial
del programa
– N = 5; j en 00FA00 H
500
502
504
506
508
50C
50E
510
Dirección de
memoria
E0
E0
48
AD
04
08
0D
10
11
05
05
F1 00 FA
01
FA
MOV
MOV
CMP
JMPR
ADD
ADD
JMPR
R0,#1
R1,#1
R0,#5
cc_sgt,0x510
0xfa00,R1
R0,#1
cc_uc,0x504
;
;
;
;
;
;
;
r0 (i)
auxiliar
if i>N
then goto 512H
j += 1
i += 1
salto sin condición
Codificación de
la instrucción
Título Presentación - 6
Notas
• En Ensamblador más largo que en C
• Línea ensamblador = operación elemental
– “mov” de un dato de memoria-registro (registromemoria)
– Suma dos datos
– Compara dos datos
– Saltos (con y sin condición)
• Las instrucciones se almacenan en memoria en formato
BINARIO (1’s y 0’s)
– Las instrucciones ocupan 2 ó 4 bytes
• Las instrucciones se almacenan en posiciones de memoria
CONSECUTIVAS. Se ejecutan en orden
– Salvo el los saltos
• La DIRECCIÓN (de memoria) de la próxima instrucción a
ejecutar se almacena en el PC (Contador de Programa)
Título Presentación - 7
Cómo se ejecuta un programa?
• Dos pasos:
– Captura de la instrucción (Instruction Fetch, usando el
PC)
– Ejecución (usando la ALU)
• Fetch: Trae la instrucción de memoria, incrementa PC
– CPU = MEM(PC); PC++;
• Execute: La ALU realiza la operación (suma, resta, etc.)
Título Presentación - 8
Programa ensamblador
• Traduce las instrucciones de “pnemónico” a
binario
• Por ejemplo, la instrucción
MOV
R0,#1
• Se convierte en (Codificación de instrucciones)
E0 10
• Tipos de ensambladores
– De línea: No soporta etiquetas (reside en el monitor de la
tarjeta)
– De PC: Soporta etiquetas (reside en el PC)
Título Presentación - 9
Ejemplo con etiquetas (ensamblador en PC)
• Las etiquetas facilitan la programación en ASS
Etiquetas (op)
bucle:
En PC
MOV
MOV
CMP
JMPR
ADD
ADD
JMPS
R0,#1
R1,#1
R0,#5
cc_sgt,fin
0xfa00H,R1
R0,#1
bucle
;
;
;
;
;
;
;
r0 (i)
auxiliar
if i>N
then goto ´fin’
j += 1
i += 1
=
jmpr cc_uc,
fin:
Instrucción
Operandos
Comentarios (opcional)
En línea
500
502
504
506
508
50C
50E
510
MOV
MOV
CMP
JMPR
ADD
ADD
JMPR
R0,#1
R1,#1
R0,#5
cc_sgt,0x510
0xfa00,R1
R0,#1
cc_uc,0x504
;
;
;
;
r0 (i)
auxiliar
if i>N
then goto 512H
; j += 1
; i += 1
; salto sin condición
Título Presentación - 10
Instrucciones y operandos (resumen)
• Operaciones
–
–
–
–
–
Transferencia: mov
Aritméticas: add, sub, cmp, neg, mul, div
Lógicas: and, or, not
Desplazamientos: shr, shl
Saltos: jmpr cc_uc (cc_eq, cc_ne, cc_ugt, cc_sgt, cc_ule, ...)
• Números
– Decimal 14
– Hexadecimal
• 0xE
• 0E H (0 por delante si empiezan por letra)
– Binario 00001110 B
Título Presentación - 11
Instrucción MOV
• Directo a registro
– mov
r0,r1
; R0 <- R1
• Inmediato
– mov
r0,#3
; R0 <- 3
(no olvidar # !)
• directo a memoria
– mov
r0,0fa00H
; R0 <- Mem[fa00 H]
• Indirecto (“normal”, post-incremento, pre-decremento)
– mov
r0,[r1]
; R0 <- Mem[R1] (R1 Puntero)
– mov
r0,[r1+]
; R0 <- Mem[R1], R1 <- R1 + 2
– mov
r0,[-r1]
; R1 <- R1 - 2, R0 <- Mem[R1]
– mov
r0,[r1+#4]
; R0 <- Mem[R1+#4]
• A nivel de byte
– movb
rl0,#3
; R0 <- 3
– movb
rh0,[r1+]
; R0 <- Mem[R1], R1 <- R1 + 1
Título Presentación - 12
Tipos de instrucciones
• Aritméticas
– Add, Sub, Neg, Cmp, Mul
• add r0,r1
; R0 <- R0 + R1
• Saltos
– JMPR va precedido de CMP (compara), de forma que
después de comparar se realiza el salto según una condición.
CMP
JMPR
....
R0,R1
cc_ugt,next
;si R0 > R1
next:
– JMPR: Con condición, sin condición (unconditional)
•
•
•
•
•
•
•
Jmpr cc_eq, dir (equal, salta si igual)
Jmpr cc_uc, dir (unconditional, salta siempre)
Jmpr cc_ne, dir (not equal, salta si no igual)
Jmpr cc_ugt, dir (unsigned greater than)
Jmpr cc_sgt, dir (signed greater than)
Jmpr cc_ule, dir (unsigned less or equal)
...
Título Presentación - 13
Más ejemplos
• if ( )
– Alto nivel
if (a == b)
a = 0;
– Ensamblador
MOV
CMP
JMPR
MOV
MOV
R0,a
R0,b
cc_ne,next
R0,#0
a,R0
next:
Título Presentación - 14
Otro ejemplo
• while ( )
– Alto nivel
i = 0;
while (i<10) {
a[i] = i; i += 1;
}
– Ensamblador
otro:
MOV
MOV
MOV
CMP
JMPR
MOV
ADD
ADD
JMPR
R0,#0
R1,#1
R2,#0fa00h
R0,#10
cc_sge,next
[R2],R0
R0,R1
R2,#2
cc_uc, otro
next:
Título Presentación - 15
Mapa de memoria del 80C167
Mapa de memoria del 80C167
• Segmentada, en código. Paginada en datos.
FF FFFF
Página 3
(RAM Interna)
FFFF
C000
255
Segmentos
de 64 kB
16 Mb
Página 2
8000
Página 1
(RAM ext)
4000
S1 64Kb
01 0000
00 0000
S0 64Kb
16 Kb
Página 0
(RAM ext)
0000
Hay versiones con
ROM interna
Título Presentación - 17
Página 3: RAM interna + SFR’s
• Los registros de control de los periféricos están en P3.
Reciben el nombre de Special Function Registers
(SFRs).
FFFF
SFRs acceso bit a bit
FF00
SFR’s
SFRs
FE00
Acceso bit a bit
FD00
GPRs
FC00
RAM
¿Cuántos registros
caben?
STACK
F600
• Los General Purpose Registers (GPRs) son los registros
R0 a R15
Título Presentación - 18
GPRs: General Purpose Registers
• Registros de propósito general (R0 a R15)
• Son de 16 bits
– Los 8 primeros registros (R0 a R7) se pueden acceder a
nivel de byte (8 bits). En este caso reciben los nombres:
• RL0 y RH0 (para R0)
– Los 4 primeros registros (R0 a R3) pueden almacenar
direcciones (punteros)
• Ubicados en la zona (0xFC00 H a 0xFD00 H)
• Se puede “reubicar” el banco de registros (los 16)
en esta zona de memoria actuando sobre el
registro (SFR):
– CP (Contex Pointer) (SFR)
– CP inicial = 0xFC00
Título Presentación - 19
CP: Contex Pointer
Direcci
ón
Si CP = FC00, ¿Qué vale 'a'?
...
MOV
MOV
...
CP,#0FC00 H
a, R0
Si CP = FC04, ¿Qué vale 'a'?
...
MOV
MOV
...
CP,#0FC04 H
a, R0
...
Dato
... ...
FC08
4400
R4
FC06
FF00
R3
FC04
FC04
R2
FC02
A050
R1
FC00
1034
R0
Direcci
ón
Dato ...
R4
...
...
R3
FC08
4400
R2
FC06
FF00
R1
FC04
FC04
R0
FC02
A050
FC00
1034
Título Presentación - 20
SFRs: Special Function Registers
• PSW (Processor Status Word). Contiene los flags, ó
códigos de condición (para instrucciones de salto.
P.e. “jmpr cc_eq,dir”)
–
–
–
–
N: Negative
C: Carry (acarreo)
V: Overflow (números con signo)
Z: Zero
• SP (Stack Pointer)
– Apunta a la zona de Stack (0xF600 a 0xFC00, crece hacia
abajo).
• Otros: Control de periféricos (p.e. Las luces en
0xFFC0)
Título Presentación - 21
PC: Program Counter
• Contador de programa (PC). 24 bits para el C167
– IP: Instruction Pointer (16 bits, apunta dentro del segmento)
– CSP: Code Segment Pointer (8 bits, apunta al segmento en uso)
8 bits
Si PC = 01 0000
FF FFFF
CSP indica
el segmento
en uso de los
255 posibles
Segmentos
S1 64Kb
01 0000
00 0000
S0 64Kb
CSP
IP
01
0000
IP indica la zona
del segmento
en uso de las
64k posibles
16 bits
Título Presentación - 22
DPPs: Data Page Pointer Registers
• Acceso a memoria
MOV
R0, 0x100 ; R0 <- Mem(100)
– ¿Y si el dato está fuera del primer segmento? La dirección del
dato tiene más de 16bits. Por ejemplo: R0 <- Mem(0x0A7000)
• Solución: DPPs 10 bits. Hay 4: DPP0, DPP1, DPP2 y
DPP3.
DPP0 10bits
0000 1010 01 11 0000 0000 0000
Segmento seleccionado
00 11 0000 0000 0000
Número de DPP
seleccionado
MOV
MOV
DPP0, #0x29
R0, 0x3000
MOV
MOV
DPP2, #0x29
R0, 0xB000
Página seleccionada
DPP2 10bits
0000 1010 01 11 0000 0000 0000
10 11 0000 0000 0000
Título Presentación - 23
Descargar