[Advanced] Programmazione Arduino in Bare Metal


colgo il suggerimento di guglielmo e apro un apposito post, così ci divertiamo un pò. :d
premetto che non sono un luminare, ma un pò di roba l'ho fatta: metto disposizione quello che e magari qualcun'altro, mette disposizione il suo. vediamo cosa esce fuori.

prologo: l'ambiente di arduino si appoggia cmq su avrlib e altre strutture software di atmel, che sono generalmente utilizzate nel loro ambiente di programmazione principe, quale è avrstudio.

grazie queste caratteristiche è possibile programmare arduino (o meglio, gli atmega) in tre maniere diverse:

1) arduinesca classica (setup, loop)
2) in bare metal e magari anche con classici main e while(1)
3) in maniera ibrida, ovvero mescolando le due di cui sopra

in questo thread ci interessiamo delle ultime due, ovvero in bare metal, e in quella "mescolata" dove possiamo raggiungere una migliore efficienza di codice (risparmio di ram e di flash, e ovviamente, aumento della velocità di esecuzione) insieme librerie che facilitano la stesura (non sempre è ragionevole scrivere in bare metal, quindi ci facciamo andare bene le libbrerie arduinesche)

partiamo dal blink:

blink classico:

code: [select]
/*
  blink
  turns on led on 1 second, off 1 second, repeatedly.
 
  example code in public domain.
 */
 
// pin 13 has led connected on arduino boards.
// give name:
int led = 13;

// setup routine runs once when press reset:
void setup() {               
  // initialize digital pin output.
  pinmode(led, output);     
}

// loop routine runs on , on again forever:
void loop() {
  digitalwrite(led, high);   // turn led on (high voltage level)
  delay(1000);               // wait second
  digitalwrite(led, low);    // turn led off making voltage low
  delay(1000);               // wait second
}


sketch uses 1.116 bytes (3%) of program storage space. maximum 32.256 bytes.
global variables use 11 bytes (0%) of dynamic memory, leaving 2.037 bytes local variables. maximum 2.048 bytes

in bare metal:

code: [select]
void setup()
{

ddrb = 0b00100000; // pb5=d13  setto l'uscita pb5 (d13) come uscita

}

void loop()
{
              portb = 0b00100000;
      delay(1000);
              portb = 0b00000000;
      delay(1000);

}


sketch uses 692 bytes (2%) of program storage space. maximum 32.256 bytes.
global variables use 9 bytes (0%) of dynamic memory, leaving 2.039 bytes local variables. maximum 2.048 bytes.

notare che l'impiego di flash è quasi dimezzato e si risparmia anche ram. non ci portiamo dietro tutto il dinosauro morto di arduino, ma solo la struttura del setup(), del loop() e il delay() (che non è fatto malissimo).


Arduino Forum > International > Italiano > Generale (Moderator: leo72) > [Advanced] Programmazione Arduino in Bare Metal


arduino

Comments