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