ProgIng - Programación en Ingeniería
Loading...
Searching...
No Matches
Ejemplo002.c File Reference

Codificador de prioridad de interrupción para 4 dispositivos (D1..D4). More...

#include <stdio.h>
Include dependency graph for Ejemplo002.c:

Go to the source code of this file.

Functions

int main (int argc, char *argv[])
 Punto de entrada. Implementa el codificador de prioridad 4→3 bits.

Detailed Description

Codificador de prioridad de interrupción para 4 dispositivos (D1..D4).

Se reciben 4 solicitudes de interrupción (una por dispositivo). La prioridad se asigna de manera que el dispositivo con número más bajo tiene mayor prioridad: D1 > D2 > D3 > D4.

La salida es el número del dispositivo seleccionado codificado en binario (3 bits):

  • Ninguno -> 0 (000)
  • D1 -> 1 (001)
  • D2 -> 2 (010)
  • D3 -> 3 (011)
  • D4 -> 4 (100)
Entrada
Cuatro enteros (0/1) en este orden:
D4 D3 D2 D1
Salida
Un renglón con:
  • el valor decimal seleccionado (0..4)
  • y los bits de salida (b2 b1 b0) solo como depuración.
Precondiciones
Las entradas deben ser booleanas (0 o 1) para que el comportamiento sea el esperado.
Complejidad
Tiempo: O(1). Memoria: O(1).

Definition in file Ejemplo002.c.

Function Documentation

◆ main()

int main ( int argc,
char * argv[] )

Punto de entrada. Implementa el codificador de prioridad 4→3 bits.

Parameters
argcCantidad de argumentos de línea de comandos (no se usa).
argvArgumentos de línea de comandos (no se usa).
Returns
0 si finaliza correctamente; 1 si falla la lectura.

Definition at line 43 of file Ejemplo002.c.

44{
45 (void)argc;
46 (void)argv;
47
48 /* Entradas: solicitud de interrupción por dispositivo (0/1). */
49 int D4, D3, D2, D1;
50
51 /* Bits de salida: b2 b1 b0 (representan 0..4). */
52 int b2, b1, b0;
53
54 /* Salida decimal equivalente a (b2 b1 b0). */
55 int salida;
56
57 /* Se leen las entradas en el orden: D4 D3 D2 D1. */
58 if (scanf("%d %d %d %d", &D4, &D3, &D2, &D1) != 4) {
59 printf("Error: se esperaban 4 valores (D4 D3 D2 D1).\n");
60 return 1;
61 }
62
63 /*
64 Lógica de prioridad (D1 mayor prioridad):
65
66 Para “habilitar” un dispositivo de menor prioridad, se exige que NO haya
67 dispositivos de mayor prioridad activos.
68
69 b2 debe ser 1 solo cuando gana D4 (100):
70 b2 = D4 · ¬D3 · ¬D2 · ¬D1
71 */
72 b2 = D4 && (!D3) && (!D2) && (!D1);
73
74 /*
75 b1 es 1 cuando la salida es 2 (010) o 3 (011):
76 - Para 3: D3 · ¬D2 · ¬D1
77 - Para 2: D2 · ¬D1
78 => b1 = (D3 · ¬D2 · ¬D1) + (D2 · ¬D1)
79 */
80 b1 = (D3 && (!D2) && (!D1)) || (D2 && (!D1));
81
82 /*
83 b0 es 1 cuando la salida es 1 (001) o 3 (011):
84 - Para 1: D1
85 - Para 3: D3 · ¬D2 · ¬D1
86 => b0 = D1 + (D3 · ¬D2 · ¬D1)
87 */
88 b0 = (D1) || (D3 && (!D2) && (!D1));
89
90 /* Convertir (b2 b1 b0) a decimal: salida = b2*4 + b1*2 + b0. */
91 salida = (b2 << 2) | (b1 << 1) | b0;
92
93 printf("Salida = %d (%1d %1d %1d)\n", salida, b2, b1, b0);
94 return 0;
95}