Esercizio Esame

7
Esercizio Esame Un processore PD32 è interfacciato a due periferiche di input A e B, e ad un DMAC il quale puo’ gestire trasferimento di dati da B verso la memoria. A e B lavorano a 8 bit. Il processore acquisisce 2048 dati da B tramite il DMAC il quale li memorizza in un buffer di 2048 byte ad indirizzo ABCDh. Al termine dell’acquisizione, il DMAC avverte il processore tramite una interruzione, il cui servizio e’ il seguente: il processore acquisisce 2048 dati da A tramite la tecnica delle interruzioni e verifica, per ciascuno di essi, l’uguaglianza con il corrispondente dato precedentemente acquisito da B. Se almeno uno dei dati non soddisfa l’uguaglianza, il processore deve porre ad 1 il valore di un byte ad indirizzo 0BBBh. Progettare l’interfaccia tra il DMAC ed il PD32. Progettare inoltre il software per attivare DMAC ed A, e per gestirne le interruzioni. Si ipotizzi che un buffer di 6 byte sia disponibile ad indirizzo 000Ah per

description

Esercizio Esame. - PowerPoint PPT Presentation

Transcript of Esercizio Esame

Page 1: Esercizio Esame

Esercizio Esame

Un processore PD32 è interfacciato a due periferiche di input A e B, e ad un DMAC il quale puo’ gestire trasferimento di dati da B verso la memoria. A e B lavorano a 8 bit. Il processore acquisisce 2048 dati da B tramite il DMAC il quale li memorizza in un buffer di 2048 byte ad indirizzo ABCDh. Al termine dell’acquisizione, il DMAC avverte il processore tramite una interruzione, il cui servizio e’ il seguente: il processore acquisisce 2048 dati da A tramite la tecnica delle interruzioni e verifica, per ciascuno di essi, l’uguaglianza con il corrispondente dato precedentemente acquisito da B. Se almeno uno dei dati non soddisfa l’uguaglianza, il processore deve porre ad 1 il valore di un byte ad indirizzo 0BBBh. Progettare l’interfaccia tra il DMAC ed il PD32. Progettare inoltre il software per attivare DMAC ed A, e per gestirne le interruzioni. Si ipotizzi che un buffer di 6 byte sia disponibile ad indirizzo 000Ah per la programmazione e la gestione dell’input dalla periferica A e che nessun altro buffer di memoria possa essere utilizzato. Si ipotizzi inoltre che i servizi di interruzione di DMAC ed A siano non interrompibili.

Page 2: Esercizio Esame

Logica dell’interfaccia del DMAC per le interruzioni

I/O ABI/O DBI/O CB

Decoder

SELECT

START

STARTD O.C.

IRQ

SCO DMAC

R Q

S Q

STATUS

STARTDEV

COMPLETE

CLEAR

IVN

CPU

IACKIN

IACKOUT

IRQ

Page 3: Esercizio Esame

PD32 DBCB

I/O

DB

I/O

CBI/

O A

BMEMORIA

SE

LE

CT

I/O WR CAR

INC

WCI/O WR

SCODMAC

DECR

TC

MBRF/F

Q

O.C.

MBR

MBGSCO

DEV_BDATO PRONTO

NEXT DATO

REGREG

MR

D

8 bit

8 bit

STATUSF/F

ABIR

Q

LD

Page 4: Esercizio Esame

I/O ABI/O DBI/O CB

Dec

SELECT

START

IRQ

SCO

R Q

S Q

STATUS

STARTDEV

COMPLETE

CLEAR

IVN

CPU

IACKIN

IACKOUT

IRQ

IORD

REGOR

Interfaccia DEV_A

SCA

Page 5: Esercizio Esame

org 400h ;INIZIO PROGRAMMA

dev_a equ 0h ; indirizzo device Adev_b equ 1h ; indirizzo device Bdmac equ 2h ; indirizzo dmacCAR equ 3h ; indirizzo dmacWC equ 4h ; indirizzo dmacrisultato equ 0BBBh ; indirizzo byte riservato all’uscitabuffer_lavoro equ 000Ah ; indirizzo 6 byte riservato alla logica del programma

codejsr initseti ; abilita PD32 ad accettare interruzioni

main: ;...jmp main

init:outl #2048, WCoutl #ABCDh, CARstart dmacret

Page 6: Esercizio Esame

;DRIVER DMACdriver 0, 600h

push r0 ; salva contenuto dei registri sporcati nella routineclear dmac ;elimino la causa dell’interruzione sul dmacmovl #ABCDh, buffer_lavoromovl #buffer_lavoro, r0addl #4, r0movw #0, (r0)start dev_apop r0rti

Page 7: Esercizio Esame

;DRIVER dev_A driver 1, 700h

push r0, r1, r2, r3 ; salva contenuto dei registri sporcati nella routineinb dev_A, r0 ;acquisisco il dato dalla periferica dev_Amovl 000Ah, r1 ;acquisisco l’indirizzo corrente per il controllocmpb (r1), ro ;r0- valore corrispondente in memoriaJNZ set_flag

aggiorna:addl #4, r1movl r1, 000Ah ;aggiorno l’indirizzo che punterà al prossimo dato da controllaremovl #000Ah, r2addl #4, r2movw (r2), r3 ;sposto in r3 il valore del contatoreaddw #1,r3 ;aggiorno il contatorecmpw #2048, r3jz interrompi_esecuzionestart dev_Ajmp fine

set_flag:movb #1, 0BBBhjmp aggiorna

interrompi_esecuzione:clear dev_A

fine:RTI