Top Banner
Arduino: Anatomia di un’istruzione - 1 Enrico Colombini (Erix) µhackademy 21 Ottobre 2016
34

Anatomia di unistruzione in Arduino Pt.1

Jan 23, 2018

Download

Devices & Hardware

hack
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Anatomia di unistruzione in Arduino Pt.1

Arduino:Anatomia di un’istruzione - 1

Enrico Colombini (Erix)

µhackademy 21 Ottobre 2016

Page 2: Anatomia di unistruzione in Arduino Pt.1

Abbastanza semplice: 8 bit, poca RAM

Abbastanza complesso: c'è tanto da imparare!

Meno distrazioni per capire i meccanismi

Perché Arduino Uno?

Page 3: Anatomia di unistruzione in Arduino Pt.1

void setup() { pinMode(LED_BUILTIN, OUTPUT);}

void loop() { digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000); }

Un LED lampeggia

Page 4: Anatomia di unistruzione in Arduino Pt.1

digitalWrite(LED_BUILTIN, HIGH);

Ma cosa c’è sotto?

Semplice, no?

Page 5: Anatomia di unistruzione in Arduino Pt.1

digitalWrite(13, 1);

#define LED_BUILTIN 13

#define HIGH 0x1

(per Arduino Uno)

Sostituzione costanti

Page 6: Anatomia di unistruzione in Arduino Pt.1

Il numero 13 è arbitrario

Pin di I/O

Page 7: Anatomia di unistruzione in Arduino Pt.1

digitalWrite(13, 1);

Non è una funzione standard C(++)

Da dove sbuca?

Page 8: Anatomia di unistruzione in Arduino Pt.1

/hardware/arduino/avr/cores/arduino/wiring_digital.c

Aggiunta dal linker

Libreria

Page 9: Anatomia di unistruzione in Arduino Pt.1

Comodità, semplicitàPortabilità (parziale)Isolamento dall'hardware

Inefficienza, scarso controlloDipendenzaIsolamento dall'hardware

GOOD

BAD

Dipende da cosa si deve fare

Librerie: pro e contro

Page 10: Anatomia di unistruzione in Arduino Pt.1

void digitalWrite(uint8_t pin, uint8_t val){

uint8_t timer = digitalPinToTimer(pin);uint8_t bit = digitalPinToBitMask(pin);uint8_t port = digitalPinToPort(pin);volatile uint8_t *out;

if (port == NOT_A_PIN) return;

if (timer != NOT_ON_TIMER) turnOffPWM(timer);

out = portOutputRegister(port);

uint8_t oldSREG = SREG;cli();

if (val == LOW) {*out &= ~bit;

} else {*out |= bit;

}

SREG = oldSREG;}

digitalWrite()

Page 11: Anatomia di unistruzione in Arduino Pt.1

void digitalWrite(uint8_t pin, uint8_t val){

uint8_t timer = digitalPinToTimer(pin);uint8_t bit = digitalPinToBitMask(pin);uint8_t port = digitalPinToPort(pin);volatile uint8_t *out;

if (port == NOT_A_PIN) return;

if (timer != NOT_ON_TIMER) turnOffPWM(timer);

out = portOutputRegister(port);

uint8_t oldSREG = SREG;cli();

if (val == LOW) {*out &= ~bit;

} else {*out |= bit;

}

SREG = oldSREG;}

Controllo che il pin non sia in uso

Page 12: Anatomia di unistruzione in Arduino Pt.1

void digitalWrite(uint8_t pin, uint8_t val){

uint8_t bit = digitalPinToBitMask(pin);uint8_t port = digitalPinToPort(pin);volatile uint8_t *out;

if (port == NOT_A_PIN) return;

out = portOutputRegister(port);

uint8_t oldSREG = SREG;cli();

if (val == LOW) {*out &= ~bit;

} else {*out |= bit;

}

SREG = oldSREG;}

Blocco temporaneo degli interrupt

Page 13: Anatomia di unistruzione in Arduino Pt.1

void digitalWrite(uint8_t pin, uint8_t val){

uint8_t bit = digitalPinToBitMask(pin);uint8_t port = digitalPinToPort(pin);volatile uint8_t *out;

if (port == NOT_A_PIN) return;

out = portOutputRegister(port);

if (val == LOW) {*out &= ~bit;

} else {*out |= bit;

}}

Parametri a 8 bit

Page 14: Anatomia di unistruzione in Arduino Pt.1

digitalWrite(13, 1);

Argomenti

Valori passati alla funzione

Page 15: Anatomia di unistruzione in Arduino Pt.1

void digitalWrite(uint8_t pin, uint8_t val){

uint8_t bit = digitalPinToBitMask(pin);uint8_t port = digitalPinToPort(pin);volatile uint8_t *out;

if (port == NOT_A_PIN) return;

out = portOutputRegister(port);

if (val == LOW) {*out &= ~bit;

} else {*out |= bit;

}}

bit mask, port address

Page 16: Anatomia di unistruzione in Arduino Pt.1

Memory-mapped I/O (ATmega328P)

Page 17: Anatomia di unistruzione in Arduino Pt.1

Registro PORTB

8 uscite o ingressi binari

Page 18: Anatomia di unistruzione in Arduino Pt.1

Collegamento elettrico

(scelta arbitraria)

Page 19: Anatomia di unistruzione in Arduino Pt.1

Bit di I/O

Nel nostro caso è un’uscita: 0 V / 5 V

Page 20: Anatomia di unistruzione in Arduino Pt.1

Isolare un bit

Page 21: Anatomia di unistruzione in Arduino Pt.1

Mettere un bit a 1

Senza toccare gli altri

Data

Mask

Result

(bit 5)

Page 22: Anatomia di unistruzione in Arduino Pt.1

*out = *out | bitmask;

Non confondere | con l'OR logico ||

OR bitwise in C

out

*out

l'indirizzo del registro (PORTB)

il dato contenuto nel registro

Page 23: Anatomia di unistruzione in Arduino Pt.1

Dereferencing

Indirizzo e dato

viamazzini23

*viamazzini23

l'indirizzo della casa

chi ci abita

Page 24: Anatomia di unistruzione in Arduino Pt.1

*out = *out | bitmask;

(in questo caso è lo stesso)

OR bitwise in C, abbreviato

*out |= bitmask;

Page 25: Anatomia di unistruzione in Arduino Pt.1

void digitalWrite(uint8_t pin, uint8_t val){

uint8_t bit = digitalPinToBitMask(pin);uint8_t port = digitalPinToPort(pin);volatile uint8_t *out;

if (port == NOT_A_PIN) return;

out = portOutputRegister(port);

if (val == LOW) {*out &= ~bit;

} else {*out |= bit;

}}

Tornando a digitalWrite

Page 26: Anatomia di unistruzione in Arduino Pt.1

if (val == LOW) {*out &= ~bit;

} else {*out |= bit;

}

Tornando a digitalWrite

Mette un bit della porta a 1

out indirizzo di PORTBbit bitmask

Page 27: Anatomia di unistruzione in Arduino Pt.1

Mettere un bit a 0

Senza toccare gli altri

Data

Mask

Result

(bit 5)

Page 28: Anatomia di unistruzione in Arduino Pt.1

Invertire la maschera

Complemento a 1

ORmask

ANDmask

Page 29: Anatomia di unistruzione in Arduino Pt.1

if (val == LOW) {*out &= ~bit;

} else {*out |= bit;

}

Tornando a digitalWrite

Mette un bit della porta a 0

& AND bitwise in C~ NOT bitwise in C

Page 30: Anatomia di unistruzione in Arduino Pt.1

Dal software all'hardware

Page 31: Anatomia di unistruzione in Arduino Pt.1

Uscita digitale (in teoria...)

Page 32: Anatomia di unistruzione in Arduino Pt.1

Uscita digitale (un po’ più realistica)

Page 33: Anatomia di unistruzione in Arduino Pt.1

Impostare la direzione del pin

Vale per gli AVR

void setup() { pinMode(LED_BUILTIN, OUTPUT);}

● DDR: data direction register

● DDRB bit 5 = ingresso / uscita

● DDR si usa come PORT

Page 34: Anatomia di unistruzione in Arduino Pt.1

Next time...

Stay tuned!

Comandare il LED direttamente

Macro dietro le quinte

Ma davvero conviene l'assembly?

Ottimizzazioni