Tips & Tricks - PIC

 

 

Il Template


Una breve introduzione all' uso dei template, principalmente per la programmazione in Assembly.


La "leggibilità" di un programma.

La chiave di una buona programmazione sta nella logica con cui si opera. E questa si estende oltre quella delle pura sequenza di istruzioni, che potranno essere ben chiare, in un determinato momento nella mente del programmatore, ma devono poter assumere una forma fisica per poter essere maneggiate.
Come esempio possiamo portare un brano musicale: fino a che è nella mente del compositore, egli lo potrà fischiettare o suonare  su uno strumento, ma diventa una "composizione" solo quando le note sono tarsferite sul pentagramma, con la struttura adeguata.
E va tenuto ben presente che, se una buona documentazione è indispensabile perchè altri possano leggere la "composizione", lo è altrettanto per lo stesso autore. Se è seccante trovare sul WEB un qualche listato, ma non potersene fare nulla se non copiarlo pedissequamente perchè non si capisce cosa diavolo ha scritto il programmatore, ancor più frustrante è il tornare a leggere propri sorgenti scritti tempo addietro e chiedersi perchè mai erano state inanellate certe sequenze di istruzioni: idea geniale all' epoca della scrittura, ma, prive di spiegazione, diventate ora rebus.

Più leggibili sono i programmi, meno tempo si spenderà per seguirne il percorso logico e quindi per correggerne eventuali errori (debug), che, altrimenti, una massa confusa di istruzioni renderebbe difficoltoso.
Una scrittura ordinata consente, poi, di recuperare parti del codice e ri utilizzarle altrove, aggiunge con facilità nuove parti o modificare quelle esistenti, ecc.

Ci si deve può chiedere che cosa rende un programma più leggibile di un altro. In sostanza si tratta "semplicemente" della metrica. E questo non è un valore astratto, tanto che chiunque, anche non programmatore, riconosce un sorgente ben scritto, quando lo vede.
Se i programmi appaiono come i miei programmi migliori poi sono leggibili, altrimenti non lo sono." Ovviamente, tale metrica è di poco valore dal momento che cambia con ogni persona.

Possiamo anche dire che un programma "leggibile" è quello che un programmatore sufficientemente competente può leggere e comprendere appieno pur non essendone l' autore.

Purtroppo la cosa non è semplicissima, perchè va ricordato come il programma non sia solo struttura  e formattazione del testo, ma principalmente struttura logica di istruzioni conseguenti: per questo non è un eccesso parlare di "arte della programmazione" per intendere la possibilità di ottenere il risultato voluto nel modo più elegante e comprensibile. Ben pochi programmi non banali raggiungono questo status e non molti sono gli esempi utili sul WEB. Comunque, sebbene i programmi veramente illeggibili esistano, ci sono molti livelli di leggibilità ed è importante che, per lo meno, ci si renda conto dell' importanza di questo fattore e si miri in qualche modo al suo raggiungimento.

Un programma leggibile certamente è suddiviso in moduli: questo ne consente una più facile gestione, comprensione e modifica. E, in particolare, l' uso di un "modulo", di un "template", può essere un supporto valido.


Template ?


Scrivendo un sorgente per un compilatore, in qualsiasi linguaggio, ma ancor più in Assemly, su qualsiasi microcontroller, occorre mantenere una struttura formale e logica quanti più possibile ordinata: creare un programma è essenzialmente un processo di logica e solo secondariamente un uso corretto delle risorse fornite dall' hardware e dall' ambiente di sviluppo.
E un lavoro "logico" ha anche una "forma" logica, un ordine e una cadenza sensati. Al limite, può diventare arte.
Se questa norma basilare non viene compresa, ci si può facilmente ritrovare persi nella mancanza di struttura di quanto scritto e, di conseguenza, faticare inutilmente nelle fasi di rilettura, verifica, debug di quanto scritto.

Questo vale per chiunque, ma principalmente per chi inizia a confrontarsi con la programmazione. In questi casi una qualche giuda è benvenuta e molto più efficace che l' arrabattarsi da se.
Ci sono molti strumenti che possono venire in aiuto, tra cui ora voglia evidenziare il "Template".

Template (in francese maquette, traducibile con mascherina, stampo) è una struttura di base , uno scheletro, una guida, in cui inserire il proprio programma.
Come dice il nome, ha la una funzione analoga al normografo o alle mascherine per fare cerchi, ellissi e simboli tecnici che qualcuno ha forse utilizzato a scuola (prima dei CAD...).

Sostanzialmente si tratta di una struttura ordinata da replicare all' inizio della scrittura del sorgente e che sarà via via riempita con le parti di codice necessarie all' applicazione voluta.

Si potrebbe obiettare che l' irrigidire in una forma pre definita la scrittura del sorgente è limitativo, ma non è così. Al bambino che comincia a scrivere, non viene dato un foglio A0 , ma una pagina con righe, per fornirgli un supporto alla stesura dei segni.  Così una carta quadrettata o millimetrata non viene certo presa come una limitazione a quanto si potrà scrivere o disegnare.
Certamente chi  "ha una sua mano e sue preferenze", logicamente derivate dall' esperienza (che non hanno niente a che vedere con idee preconcette, confuse, disordine e mancanza di chiarezza, ovvero tutti quanto è non-logico), potrà benissimo fare a meno di un template elementare o creato da altri, ma proprio perchè in grado di realizzare da sè la necessaria struttura..

Chi, invece, non ha raggiunto una sufficiente sicurezza, potrà iniziare appoggiandosi alla carta quadrettata o millimetrata del Template approntato da altri per poi crearsi un suo metodo e mandare in pensione i template generici; ma a questo punto si accorgerà che un lavoro "logico" lo porterà comunque a stendere una struttura "logica".
Chi ritiene che una struttura del genere sia un orpello inutile è il caso che si faccia un esame di coscienza.

Vediamo qui un esempio di template generico, adattabile ad ogni genere di processore.


Un Template generico


Abbiamo detto che lo scopo di un template è quello di fornire una guida alla stesura di un sorgente ordinato e leggibile, completo dei commenti che potranno essere utili alla rilettura, al debug, all' archiviazione.

Non c'è niente di peggio dei programmini e programmetti che infestano il web con i loro listati dai quali non si capisce un accidenti di niente e che, certamente, metterebbero in difficoltà lo stesso malaccorto autore se fosse costretto a rivederli dopo qualche mese.

I principali problemi sono:

  • mancanza di informazioni su cosa fa il programma e come

  • mancanza di informazioni su come è collegato il microcontroller

  • mancanza di commenti sufficienti a capire cosa si sta facendo in una determinata linea

  • mancanza di una forma leggibile del testo sorgente

a cui normalmente si aggiungono :

  • mancanza di struttura nel sorgente, dove sono mischiate a caso le varie aree

  • aggiunta inutile di definizioni che si trovano già negli .inc del processore

  • uso dissennato di valori assoluti al posto di label
     

Vediamo un esempio di listato sorgente insensato:

  manca una qualsiasi intestazione in cui sia descritto cosa fa il programma
  list p=16f84  
 __CONFIG 0x3FF1 il CONFIG così espresso è incomprensibile se non si consulta il foglio dati del microcontroller
PORTA equ 05h
TRISA equ 85h
PORTB equ 06h
TRISB equ 86h
option equ 81
non ha senso specificare le assegnazioni di elementi del processore che esistono già meglio espressi nel file .inc, di cui basta effettuare l' include
 org 0 
 
 bsf 03,5 avendo omesso la definizione STATUS equ 03h si ricorre ad un valore assoluto, che, senza linea di commento, è a prima vista incomprensibile
 movlw B'11111111' 
 movwf TRISA 
 movlw b'00000000'
 movwf TRISB
 bcf   03,5
 bsf   option,7
 clrf  PORTB
 movf  PORTA,0
 movwf PORTB
manca qualsiasi linea di commento che dia una idea di cosa fanno le varie operazioni, sopratutto dove vengono usati valori assoluti e non label
 goto $-3 l' uso di $ non è consigliato
  manca la direttiva END di chiusura della compilazione

Ma basterà variarne la scrittura per avere una cosa del tutto differente:

; Questo programma copia lo stato dei pin di PORTA su PORTB 

 LIST P=16F84A           ;definizione del processore usato
   #INCLUDE <P16F84A.INC> ;include delle definizioni standard

; configuration
; Oscillatore con quarzo a 4 MHz
; Watchdog disabilitato
; PWRTE disabilitato
; Code protection disabilitato

 __config   _XT_OSC & _WDT_OFF & _PWRTE _ON & _CP_OFF
 
  org 00                  ;Inizio - vettore di reset

start     
 banksel TRISA            ; select bank 1
 setf    TRISA            ; all port A input
 clrf    TRISB            ; all port B output
 banksel OPTION_REG       ; select bank 0

 bsf     OPTION_REG,RBPU  ; disable weak pull up

 clrf    PORTB            ; azzera uscite  

loop:
 movf    PORTA,w          ; copia PORTA su PORTB
 movwf   PORTB            
 goto    loop             ; loop continuo

 end                      ; assembler end

Ora la cosa, pur facendo le stesse funzioni della lista precedente, è ben più chiara e leggibile. E, osserviamo che l' unica precauzione è stata quella di scrivere il tutto in modo logico e ordinato.

Dunque, se provassimo ad usare un qualche genere di supporto, sopratutto per cominciare a programmare, ci troveremmo certo meglio. 
Il template è proprio come la mascherina del normografo, che, fino a quando non diventiamo provetti calligrafi, ci aiuta a tracciare lettere quasi perfette.
Va tenuto ben presente  che anche con altri linguaggi, a partire dal BASIC, ci si imbatte in sorgenti non certo perfetti ed è nota la difficoltà di comprendere un sorgente C non ben strutturato e anche la possibilità di stendere sorgenti C assolutamente "fuzzy", dei quali esiste perfino un ambito ludico col premio a chi ha scritto il sorgente meno comprensibile.
Quindi, l' idea di una struttura "template" è applicabile allo stesso modo anche per i linguaggi ad alto livello e non solo per l' Assembly.


 

Copyright © afg . Tutti i diritti riservati.
Aggiornato il 16/05/12 .