Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
nelle arti e nei mestieri. La scienza emerge nel contatto con le cose, dipende
dall’evidenza dei sensi, e, per quanto sembri allontanarsi da essi, sempre ad essi deve
tornare” [Farrington, 1949]
Tecniche di input/output 2
Memoria Memoria
istruzioni CPU dati
BUS BUS
ISTRUZIONI DATI
Driver
Periferica
Driver
Periferica
ESEMPIO DI MICROCOMPUTER
(architettura Harward) Driver
Periferica
Driver
Periferica
ASINCRONE RESET
NON MASCHERABILI
NMI
ESTERNE TIMERS, EVENT COUNTERS
(external interrupt)
MASCHERABILI
INPUT/OUTPUT PERIPHERALS
Arma la periferica
Attiva l’evento da servire Periferica pronta
Abilita le interrupt
CPU Memoria
BUS
IntReq
IntAck
Vettore 1
Vettore 2
Vettore 3
Vettore 4
Vcc
CPU
Memoria
BUS
Vettore i
Programmazione
Registri PIC
IntReq
Programmable Interrupt Controller
IntAck
IntAck1
IntAck2
IntAck3
IntAck4
IntReq1
IntReq2
IntReq3
IntReq4
Periferica Periferica Periferica Periferica
1 2 3 4
Indirizzo vettore
………………….. …………………..
in tabella
IND_BASE + 4*j ISR #j Start Address
+
………………….. …………………..
OFFSET vettore j
Supponendo
4 indirizzi di IND_BASE + 4*N ISR #N Start Address B ISR#jStart Address
* memoria
a 32 bit
…………………..
Vettore periferica N° j ISR #j Start Inizio della routine di
Address servizio dell’interrupt j
Dal BUS
DATI ………………….
Architettura dei sistemi embedded
30/09/2012 Giulio Vitale 14
La gestione delle eccezioni nel Cortex M
Da Da
External Interrupt #1 Periferica #1
17 - 254 a Programmabile a
External Interrupt #238 Periferica #238
Bit 7 - 6 - 5
Bit 15 - 14 - 13
SysPRI1
Bit 23 - 22 - 21
Reg.
Reg.
SysPRI2 Bit 31 - 30 - 29
Bit 7 - 6 - 5
SysPRI3
Bit 23 - 22 - 21
Reg.
Bit 31 - 30 - 29
Bit 7 - 6 - 5
Reg. PRI0
Bit 15 - 14 - 13
Bit 23 - 22 - 21
Bit 31 - 30 - 29
Bit 7 - 6 - 5
Reg. PRI1
Bit 15 - 14 - 13
Bit 23 - 22 - 21
Bit 31 - 30 - 29
Bit 7 - 6 - 5
Reg. PRI2
Bit 15 - 14 - 13
Bit 23 - 22 - 21
Bit 31 - 30 - 29
Bit 7 - 6 - 5
Reg. PRI3
Bit 15 - 14 - 13
Bit 23 - 22 - 21
Bit 31 - 30 - 29
Bit 7 - 6 - 5
Reg. PRI4
Bit 15 - 14 - 13
Bit 23 - 22 - 21
Bit 31 - 30 - 29
Bit 7 - 6 - 5
Reg. PRI5
Bit 15 - 14 - 13
Bit 23 - 22 - 21
Bit 31 - 30 - 29
Bit 7 - 6 - 5
Reg. PRI6
Bit 15 - 14 - 13
Bit 23 - 22 - 21
Bit 31 - 30 - 29
Bit 7 - 6 - 5
Reg. PRI7
Bit 15 - 14 - 13
Bit 23 - 22 - 21
Bit 31 - 30 - 29
30/09/2012 Architettura dei sistemi embedded 25
Esempio di posizione dei vettori per il micro Stellaris LM3S1968
Interrupt esterne 32 - 43
Bit 7 - 6 - 5
Reg. PRI8
Bit 15 - 14 - 13
Bit 23 - 22 - 21
Bit 31 - 30 - 29
Bit 7 - 6 - 5
Reg. PRI9
Bit 15 - 14 - 13
Bit 23 - 22 - 21
Nel NVIC dei micro Stellaris sono presenti undici registri, PRI0
– PRI10 per la definizione delle priorità, ognuno diviso in
quattro campi da otto bit cadauno, utilizzati per assegnare il
livello ad ognuna delle eccezioni comprese tra il numero 0 al
numero 43, corrispondenti ai vettori dal numero16 al numero 59
Ogni campo utilizza solo i tre bit più significativi per assegnare
un livello di priorità compreso da 1 a 7, dove:
1 è la priorità maggiore e 7 la minore
31 30 29 23 22 21 15 14 13 7 6 5
31 30 29 23 22 21 15 14 13 7 6 5
.text
SYSPRI3_addr:
.word 0xE000ED20 ;Indirizzo del registro SYSPRI3
CLR_MASK:
.word #0x00FFFFFF ;Maschera per azzerare il byte più
;significativo (AND_ing) di SYSPRI3
SET2_MASK:
.word #0x40000000 ;Maschera per forzare a 2 i tre bit più
;significativi (OR_ing) di SYSPRI3
; Supponendo di voler assegnare all’evento SysTick il livello di priorità 2
LDR R0, CLR_MASK ;R0 = CLR_MASK
LDR R1, SYSPRI3_addr ;R1 = pointer al registro SYSPRI3
LDR R2, [R1] ;R2 = contenuto del registro SYSPRI3
AND R2, R2, R0 ;R2 = 0x00XXXXXX
LDR R0, SET2_MASK ;R0 = SET2_MASK
ORR R2, R2, R0 ;R2 = 0x40XXXXXX
STR R2, [R1] ;SYSPRI3 = 0x40XXXXXX
.text
EN0_addr .word 0xE000E100 ;Indirizzo del registro di abilitazione
EN_INT4_MASK .word 0x00000010 ;Maschera per abilitare
30/09/2012
Architettura dei sistemi embedded
54
Esempio di gestione dell’interrupt SysTick
con le librerie StellarisWare
/*
* SysTick_Interrupt.h
*
* Created on: 20/set/2015
* Author: Giulio Vitale
*/
#ifndef SYSTICK_INTERRUPT_H_
#define SYSTICK_INTERRUPT_H_
//Inclusione librerie standard del compilatore
#include <stdint.h>//Libreria per tipi aritmetici C99
// Inclusione librerie standard della CPU
#include "inc/hw_memmap.h"//Indirizzi delle aree di memoria
#include "inc/hw_types.h"//Accesso ai registri hardware delle periferiche
// Inclusione driver standard relative alla scheda
// Inclusione Funzioni di livello 1
#include "driverlib/sysctl.h"
#include "driverlib/interrupt.h"
// Inclusione Gestione SysTick Control register
#include "driverlib/systick.h“
// Inclusione Funzioni di livello 2
#include "Utils/uartstdio.h"
// Inclusione delle librerie Custom
#include "Drivers/Led_driver.h"
#endif /* SYSTICK_INTERRUPT_H_ */
Architettura dei sistemi embedded
30/09/2012 Giulio Vitale 55
“main”: preparazione e inizializzazioni generali
#include "SysTick_Interrupt.h"
extern void SysTick_Handler(void);
static uint32_t TickCounter;
static uint32_t OneSecondElapsed;
void main(void) {
// Imposta il PLL per un clock a 50MHz
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_16MHZ);
// Abilita l'UART0 per usarlo come "serial console".
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
// Inizializza l' UART come standard I/O.
//NB: al nome delle funzioni standard delle librerie C occorre inserire il prefisso "UART"
UARTStdioInit(0);
UARTprintf("\r\n Inizializza UART come standard I/O\r\n");
UARTprintf("\r\n Inizializza i led \r\n");
LEDsInit ();
//Azzera TickCounter e la flag “OneSecondElapsed” e spegne i LED
TickCounter = 0;
OneSecondElapsed = 0;
LED_Off(BOTH_LEDS);
uint8_t toggle=0; //Variabile per lampeggiamento LED
toggle=0: