Variabili numeriche in mikroBasic

Il mikroBasic, prodotto dalla MikroElektronika, è un potente compilatore per PIC, PIC32, dsPIC, AVR, 8051, FT90x e ARM. A partire da questo articolo distribuiremo tante "pillole" di programmazione, trucchi, segreti e quant'altro al fine di conoscere al meglio questo potente strumento.

Avatar di Elettronica Open Source

a cura di Elettronica Open Source

banner prova1

Più un linguaggio di programmazione è ad alto livello e più esso permette la gestione di variabili molto capienti che esulano dall'architettura della macchina. A volte, infatti, un microcontrollore (MCU), dotato di registri utente a 8 bit, programmato in Assembler o in linguaggio macchina, gestisce solamente variabili di quella grandezza. La potenza di un linguaggio performante, invece, riesce a superare questo limite, consentendo l'utilizzo di variabili numeriche ben più grandi.

Leggi anche: Cos'è un microcontrollore? Introduzione per principianti

Alla data della scrittura del presente articolo, la MikroElektronika ha rilasciato la versione 7.1.0 del mikroBasic. Vediamo quali tipologie di dati numerici riesce a sopportare e qual è la loro occupazione in RAM, nella tabella sottostante:

Tipo Dimensione Intervallo
bit 1-bit 0 ÷ 1
sbit 1-bit 0 ÷ 1
byte, char 8-bit 0 255
short 8-bit -128 .. 127
word 16-bit 0 .. 65535
integer 16-bit -32768 .. 32767
longword 32-bit 0 .. 4294967295
longint 32-bit -2147483648 .. 2147483647
float, double 32-bit ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038

Come si vede, quasi tutte le esigenze del programmatore sono coperte e sono previste variabili con o senza segno. Superando i limiti della MCU, possiamo dire che ad esempio, la variabile di tipo longword, utilizza una costruzione di tipo software, indipendente dall'architettura del microcontrollore utilizzato. Questo si traduce, ovviamente, in una lievitazione del codice eseguibile e di una relativa lentezza nella sua esecuzione. Ma lo scopo finale è brillantemente raggiunto, con pochi sacrifici dal punto di vista della programmazione.

La memoria delle MCU non è altrettanto vasta di quella dei PC. Per questo motivo, il programmatore deve cercare di risparmiare al massimo lo spazio occupato dai dati, un po' come quando, agli inizi dell'era informatica, le risorse elettroniche erano ridotte ai minimi termini. Osserviamo adesso il seguente listato:

program MyProject

dim x as longword

dim y as longword

dim i as longword

main:

x=3

y=7

i=x+y

end.

Le operazioni aritmetiche svolte dal programma sono ridotte al minimo (solo una somma), ed è del tutto inutile riservare tanto spazio in memoria, e disturbare delle grosse locazioni. Meglio utilizzare il più adatto tipo byte. La figura sottostante mostra l'occupazione in RAM delle tre variabili, prima di tipo longword e poi di tipo byte.

figura 1 ram

FIGURA 1: Occupazione del programma in memoria

Come si nota, cambiando semplicemente la tipologia della variabile utilizzata si riduce enormemente l'occupazione, con conseguente velocità e ottimizzazione nell'esecuzione. Ovviamente se il programmatore prevede che, nel corso della vita del suo firmware, un certo valore raggiunga limiti prestabiliti, magari di elevata consistenza, deve utilizzare, gioco forza, il massimo contenitore, anche se la reale capienza è utilizzata poche volte.

Anche la codifica in Assembler risulta differente, come si può evincere dalla figura sottostante.

figura 2 assembler

FIGURA 2: Differenze di lunghezza dei listati in Assembler

Una attenta pianificazione delle variabili fa sempre la differenza ed essa costituisce, a tutti gli effetti, una delle più critiche fasi della programmazione.