Escolar Documentos
Profissional Documentos
Cultura Documentos
Arquitetura de
Processadores
Digitais
Prova 03
Sumrio
DMA .............................................................................................................................................. 2
DMA........................................................................................................................................... 4
ADC + DAC + DMA + 8253 ......................................................................................................... 4
PROVA TREINO ............................................................................................................................. 8
Consideraes gerais: ......................................................................................................... 10
Circuito interface: ............................................................................................................... 11
Rotina void dma_adc (void) ............................................................................................... 12
Rotina rmediap (void)......................................................................................................... 14
Rotina int_eoc (void) .......................................................................................................... 15
Rotina interrupt int_serial (void) ....................................................................................... 16
Rotina interrupt int_paralela (void)................................................................................... 17
Rotina interrupt paralela (void) ......................................................................................... 18
Rotina main (void) .............................................................................................................. 19
Completo ............................................................................................................................. 21
INTERRUPO............................................................................................................................. 25
INTERUPO ........................................................................................................................... 32
INTERRUPO SERIAL ............................................................................................................. 34
INTERRUPO PARALELO........................................................................................................ 36
LABORATRIO ............................................................................................................................ 39
Interrupo.............................................................................................................................. 39
Serial ........................................................................................................................................ 41
Linguagem C ................................................................................................................................ 44
Comandos................................................................................................................................ 44
Switch Case.............................................................................................................................. 44
Farmalloc ................................................................................................................................. 45
DMA
DMA
#include <dos.h>
#include <stdio.h>
void main(void){
long end20, off, seg;
char far *pt;
pt = farmalloc(2*10k);
seg = FP_SEG(pt);
off = FP_OFF(pt);
end20 = seg<<4 + off;
if((end20&0xF0000)!=((end20+10k)&0xF0000))
end20 = end20+10k;
outportb(0x0B,0x45);//modo
outportb(0x0C,0);//FFAB
outportb(3,10k-1);//LSB QTD
outportb(3,(10k-1)>>8);//MSB QTD
outportb(2,end20);//endereo
outportb(2,end20>>8);//endereo
outportb(0x83,end20>>16);//endereo
outportb(0x0A,1);//apaga mscara
while((inportb(8)&2)==0);
outportb(0x0A,5);//ativa mscara
}
while((inportb(8)&2)==0){ //para ver quantas converses foram feitas
x = inportb(3);
x = (x<<8)+inportb(3);
printf("%d/n",(10k-1)-x);
}
= 36h
vet12 = getvect(0x0C);
setvect(0x0D,rot_eoc);
setvect(0x0C,rot_ser);
hab = inportb(0x21);
outportb(0x21,hab&0xCF);
// programao do dma
pt1 = far malloc(16);
seg = FP_SEG(pt1);
off = FP_OFFF(pt1);
adr20 = (seg<<4)+off;
if((adr20>>16) != ((adr20+8)>>16))//verifica a fronteira de pgina
adr20 = adr20+8;
adrda = (FP_SEG(pt2)<<4)+FP_OFF(pt2);
outportb(0x0C,0);
outportb(3,7);// 8 bits
outportb(3,0);//------outportb(2,adr20);//-------------+
outportb(2,adr20>>8);// endereo +
outportb(0x83,adr20>>16);//------+
outportb(7,0);//-----------------+
outportb(7,0);
outportb(6,adrda);// canal3 +
outportb(6,adrda>>8);
outportb(6,adrda>>16);//---------+
outportb(0x0B,0x55);// modo
outportb(0x0B,0x5B);//----outportb(0x0A,1);// habilitaes
outportb(0x0A,3);//-------------}
void interrupt rot_eoc(void){
sum = 0;
for(i=0;i<8;i++)
sum += pt1[i];
media = sum/8;
outportb(CS0+ncanal,0);
outportb(0x20,0x20);
outportb(TxB,media);}
void interrupt rot_ser(void){
ncanal = inportb(RxB);
outportb(0x20,0x20);}
PROVA TREINO
Consideraes gerais:
#include <conio.h>
#include <dos.h>
#define TxB 0x3F8
#define RxB 0x3F8
#define DLL 0x3F8
#define DLM 0x3F9
DLM
#define LCR 0x3FB
#define IER 0X3F9
10
Circuito interface:
Fig. 1: Interface 1
Fig. 2: Interface 2
11
12
13
14
15
16
17
18
19
20
Completo
#include <conio.h>
#include <dos.h>
#define TxB 0x3F8
#define RxB 0x3F8
#define DLL 0x3F8
#define DLM 0x3F9
DLM
#define LCR 0x3FB
#define IER 0X3F9
21
void rmediap(void){
posio = inportb(3);
if (posio = 0){
i=6
}
else if(posio = 1){
i=5
}
else if(posio = 2){
i=4
}
else if(posio = 3){
i=3
}
else if(posio = 4){
i=2
}
else if(posio = 5){
i=1
}
else if(posio = 6){
i=0
}
else if(posio = 7){
i=7
}
for(j=0,j++,j<8){
soma = soma + peso[j]*buffer[i];
i = (i-1)&7;
}
*media = (soma + 4)>>3;
}
void interrupt int_eoc(void){
int i,posio,soma = 0;
rmediap();
outportb(CS1,0);
outportb(0X20,0X20);
}
void interrupt int_serial(void){
c = inportb(RxB);
if(c>=0x30 & c<=0x37){
outportb(CS0,(c - 0x30));
}
if(c == 's'){
outportb(0xA,5);
outportb(0xA,6);
}
if(c == 'r'){
22
outportb(0xA,1);
outportb(0xA,2);
}
outportb(0x20,0x20);
}
void interrupt int_paralela(void){
canal = (inportb(0x379)>>3)&7;
outportb(CS0+canal,0);
outportb(0x20,0x20);
}
void paralela (int dado){
outportb(0X378,dado);
outportb(0X37A,1);
//STRB
while(inportb(0X37A)&2 == 0); // ACK
}
int main{
long seg,off,adr20;
int hab,pesos[8] = {64,32,16,8,4,2,1,1};
char c;
//interrupes
vet12 = getvect(12);
vet13 = getvect(13);
vet15 = getvect(15);
setvect(12,int_serial);
setvect(13,int_eoc);
setvect(15,int_paralela);
hab = inportb(0x21);
outportb(0x21,hab&0x4F);
//serial
outportb (LCR, 7);
bits
outportb(IER, 1);
dado disponvel
outportb(LCR, 0x87);
outportb (DLL, 12);
outportb (DLM, 0);
outportb (LCR, 7);
bits
//DMA
dma_adc();
dma_dac();
while(!kbhit){
*media = (soma + 64)>>7;
outportb(TxB,dado);
paralela(dado);
}
23
outportb(0xA,5);
outportb(0xA,6);
setvect(12,vet12);
setvect(13,vet13);
setvect(15,vet15);
}
24
INTERRUPO
25
26
27
28
29
30
31
INTERUPO
/* Modulo 3 - Aula 1 - 10 de novembro de 2009
INTERRUPES*/
/*
clk
eoc
32
media=i=0;
vetor2 = getvect(0xA); /* A = 13, endereo que atende ao IRQ2*/
vetor5 = getvect(0xD); /* guarda vetores antigos*/
setvect(0xA,Rot_IRQ2); //novos vetores
setvect(0xD,Rot_IRQ5); //novos vetores
antigo = inportb(0x21); //21H = endereo da Palavra de Controle de Operao
OCW1
outportb(0x21,antigo&0xDB);//hab IRQ2 e IRQ5 > XX0X X0XX > mscara 1101 1011
(DBH)
while(!kbhit()){
if(band){
printf("[%d] media = %d \n", aux, media);
band = 0;
}
}
outportb(0x21,antigo|0x24);//desabilta int
setvect(0xA,vetor2);//restaura vetor 2
setvect(0xD,vetor5);//restaura vetor 5
printf("Acabou!");
}
void interrupt Rot_IRQ2(void){
outportb(CS1,0);//start
outportb(CS3,media);//DAC <- media
inportb(CS2);//apaga o pedido de IRQ2
outportb(0x20,0x20);//EOI
}
void interrupt Rot_IRQ5(void){
int x, j;
x = inport(CS0);//ler AD
outportb(CS2,0);//apaga pedido de IRQ5
outportb(0x20,0x20);//EOI
//calcular mdia
vetor[i++] = x;
i &= 7; //mascara os 3 bits
media = 0;
for(j=0;j<8;j++)
media += vetor[j];
media = (media+4)>>3; //divide por 8 com arredondamento
cont++;
if(band==0){
aux = cont;
band = 1;
}
}
33
INTERRUPO SERIAL
/* Aula 2 - Interrupo Serial - 17 de novembro de 2009
LCR - modo
LSR - status
IER - enable interruption
IIR - identify interruption
MCR - controle modem
MSR - status modem
DTR
DSRR
CTS
*/
#include <dos.h>
#include <stdio.h>
void interrupt *(ant4)(void);
int flag, dado, velho, erros, x, z;
int mestre(void){
//inicializao
int n = 115200/9600;
outportb(LCR,0x80); //progamar DLAB = 1
outportb(DLL,n); //lsb do baud rate
outportb(DLM,n>>8); //msb do baud rate
outportb(LCR,7); // 8 bits, sem paridade, 2 stops
outportb(IER,1); //hab interrupo
outportb(MCR,8); // out2 = 1
ant4 = getvect(0x0C);
setvect(0x0C,rot_ser);
velho = inport(0x21);
outportb(0x21,velho&0xEF);
//fim da inicializao
flag = erros = x = 0;
while(!kbhit()){
outportb(TxB,x);
while(!flag);
flag = 0;
z = x^dado;
if(z) erros++;
x++;
printf("erros = %d",erros);
}
outportb(0x21,velho|0x10);
setvect(0x0C,ant4);
34
}
void interrupt rot_ser(void){
dado = inportb(RxB);
flag = 1;
outportb(0x20,0x20);//EOI
}
//==================================================
void interrupt *(ant4)(void);
void rep(void){
//inicializao
int n = 115200/9600;
outportb(LCR,0x80); //progamar DLAB = 1
outportb(DLL,n); //lsb do baud rate
outportb(DLM,n>>8); //msb do baud rate
outportb(LCR,7); // 8 bits, sem paridade, 2 stops
outportb(IER,1); //hab interrupo
outportb(MCR,8); // out2 = 1
ant4 = getvect(0x0C);
setvect(0x0C,rot_ser);
velho = inport(0x21);
outportb(0x21,velho&0xEF);
//fim da inicializao
}
void interrupt rot_ser(void){
int z;
z = inportb(RxB);
outportb(TxB,z);
outportb(0x20,0x20);
}
35
INTERRUPO PARALELO
/* aula 3 - interrupo paralela
AD
DA
REG 378H
7
D7
6
D6
5
D5
4
D4
3
WR
2
OE
1
START
0
ALE
REG 379H
7*
D7
6
EOC (IRQ7)
5
D6
4
D5
3
D4
REG 37AH
3*
D3
D3
2
D2/A2 D2
1*
D1/A1 D1
0*
D0/A0 D0
Mdia mvel 8 no DAC
Teclado - novo canal
Teclado - Tecla 'f' - FIM
IRQ4 Serial - TX(mm8), RX(novo canal), br9600, 8bits, 2 stops
*/
#include <dos.h>
#include <stdio.h>
void interrupt *(vet4)(void);
void interrupt *(vet7)(void);//declarar os vetores q guardaro os valores antigos dos vetores
de interrupo
int vetor[8], i, canal_n, flag, media;
void mm8(void){ int j, taxa, antigo, c;
//zerar variveis
canal_ad(0);
for(j=0;j<7;j++)
vetor[j] = 0;
i = media = 0;
//programar porta serial
taxa = 115200/9600;
outportb(LCR,0x80);
outportb(DLL,taxa);
outportb(DLM,taxa>>8);
outportb(LCR,7);
outport(IER,1);
36
outportb(MCR,8);
outportb(0x37A,0x10);//habilita IRQ7
outportb(0x378,0);
//guarda os vetores antigos
vet4 = getvect(12);
vet7 = getvect(15);
setvect(12,rot_ser);
setvect(15,rot_eoc);
antigo = inportb(0x21);
outportb(0x21,antigo&0x6F);
//lao principal
c = 0;
while(c != 'f'){
if(kbhit()){
c = getch();
if(c >= 0 && c <= 7){
canal_n = c;
flag = 1;
}
}
printf("media = %d \n",media);
}
outportb(0x21, antigo|9);
setvect(12,vect4);
setvect(15,vect7);
}
void canal_ad(int canal){
int x;
outportb(0x37A,(canal&7)^3);//manda o canal
outportb(0x378,1);
outportb(0x378,0);//flanco de descida do ALE
}//tem um erro!
void interrupt rot_ser(void){
int x;
x = inportb(RxB);
if(x >= 0 && x <= 7){
canal_n = x;
flag = 1;
}
outportb(0x20,0x20);//EOI
}
void interrupt rot_eoc(void){
int x, y, z;
//DAC
outportb(0x37A,0x10|media^0x0B);
outportb(0x378,media&0xF0);
37
//flanco de subida do WR
outportb(0x378,(media&0xF0)||8);
outportb(0x378,media&0xF0);
//manda pelo serial
outportb(TxB,media);
//ler ADC
outportb(0x37A,0x10|4);//programa como entrada
outportb(0x378,4);
x = inportb(0x379)^0x80;
y = inportb(0x37A)^0x0B;
x = (x&0x80)+(x&0x38)<<1;//arruma o byte
vetor[i++] = x+y;
i=&7;
soma = 0;
for(j=0;j<8;j++)
soma+=vetor[j];
media = (soma+4)>>3;
if(flag){
flag=0;
canal_ad(canal_n);//trocar canal
}
outportb(0x20,0x20);//EOI
}
38
LABORATRIO
Interrupo
//---------------------------------------------------------------------------------------// UNIVERSIDADE DE BRASILIA
// ARQUITETURA DE PROCESSADORES DIGITAIS
// 1/2016
//---------------------------------------------------------------------------------------// Daniela Aguiar de Carvalho Freitas
// Renato da Silva Paes
//---------------------------------------------------------------------------------------// Experimento 9
// versao 5
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#define
#define
#define
#define
#define
#define
#define
#define
TXB
RXB
DLL
DLM
LCR
LSR
IER
MCR
0x3F8
0x3F8
0x3F8
0x3F9
0x3FB
0x3FD
0x3F9
0x3FC
// corrigido
39
SERIAL_TXB();
}
/**/
if (flag == 1){
SERIAL_RXB();
}
}//fim while
printf("ESC foi pressionado.\n");
outportb(0x21,habilita|0x10); /*Bit 4 volta a ser 0*/
setvect(12, vet12);
}// fim main
void SERIAL_TXB (void){
caracter_Tx = getch();
outportb(TXB, caracter_Tx);
if (caracter_Tx = esc)
fim=1;
}// fim serial recebe
void SERIAL_RXB(void){
flag = 0;
printf("%c",caracter_Rx);
if (caracter_Rx = esc)
fim=1;
}
void interrupt serial_RX(void){
caracter_Rx = inportb(RXB);
flag = 1;
outportb(0x20,0x20);
}
void INICIALIZA_SERIAL (void){
/*Habilita acesso ao divisor - 10000000*/
outportb(LCR, 0x80); /*DLAB = 1 autoriza o acesso*/
/*Atualizao dos divisores*/
outportb(DLM, 0);/*menos significativo*/
outportb(DLL, 12); /*mais significativo*/
/*habilita recepcao e transmissao e programa de paridade e bit de parada*/
outportb(LCR, 7); /*8 bits, 2 stops e sem paridade*/
}// fim inicializa serial
void INICIALIZA_INTERRUPCAO_SERIAL (void){
outportb(MCR,9); /*pedido de INT do 8250 seja conectado ? IRQ*/
outportb(IER,1); /*habilita INT por dado dispon?vel*/
}
40
Serial
//---------------------------------------------------------------------------------------// UNIVERSIDADE DE BRASILIA
// ARQUITETURA DE PROCESSADORES DIGITAIS
// 1/2016
//---------------------------------------------------------------------------------------// Daniela Aguiar de Carvalho Freitas
// Renato Paes
//---------------------------------------------------------------------------------------// Experimento 8
// versao 3
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#define
#define
#define
#define
#define
#define
TXB
RXB
DLL
DLM
LCR
LSR
0x3F8
0x3F8
0x3F8
0x3F9
0x3Fb
0x3FD
41
42
default:
printf("...\n");
}// fim switch case
}// fim das mensagens
43
Linguagem C
Comandos
Switch Case
switch (varivel)
{
case constante1:
Instrues;
break;
44
case constante2:
Instrues;
break;
default
Instrues;
}
Farmalloc
#include<alloc.h>
void *farmalloc (unsigned long nbytes);
45
IO
if(inportb(LSR)&1)==1){canal_ad =inport(RXB)}
void serial(void){
//inicializao prepara_serial
int n = 115200/9600;
SERIAL
Transceiver
outportb(LCR,0x80);
Latch
Transmiter
ou receiver
TEMPORIZADOR
40h
41h
42h
43h
PREPARA 8253/8254
N = 2E6/taxa
outportb(CS0+6,0x36);
outportb(CS0,N); /*Carga byte LSB*/
outportb(CS0,N>>8); /*Carga byte LSB*/
46
PARALELA
Para PC se conectar com impressoras paralelas. Composta por 3
registradores.
Pode ser usada como entrada ou sada. 3 modos de operao SPP, EPP,
ECP. Endereos consagrados: 378H, 278H ou 3BCH.
CONCEITOS
Relao entre o tamanho do cache e o desempenho do processador: quanto
maior o tamanho do cache, maior vai ser o nmero de dados que o processador
no precisar trabalhar com a memria DRAM, mais lenta. Porm, se o tamanho
do cache for igual ao da memria principal, o motivo pela qual ela foi
implementada ter sido em vo pois ela gasta mais potncia prejudicando o
desempenho do processador. Ou seja, existe um limite para o aumento de
desempenho e, portanto, no linear a relao.
Um processador que usa pipeline com grande nmero de estgios precisa de
um bom preditor de desvios: Porque se errar o prognstico, ocorre um desvio
desnecessrio, perde-se tudo que havia no pipeline tendo, assim, que esperar
uma nova instruo levando um tempo que poderia ter sido usado para fazer
vrias, a quantidade de estgios , instrues.
Porque existe grande relao entre um processador RISC e seu compliador: O
compilador fica a cargo de organizar o conjunto de instrues RISC, que ocorrem
em paralelo, para que o mundo externo perceba-as como sequnciais. A
complexidade do programa foi transferida para o compilador.
Porque os fabricantes de processadores no levam de uma vez o relgio de seus
processadores para 10GHz: Porque o tempo de acesso das memrias e
perifricos ainda no to rpido por limitaes fsicas (corrente de fuga,
dissipao de calor, interferncia eletromagntica, reflexo pelas linhas, retardo
introduzido pelos Cis).
47
48