Visualizza messaggio singolo
Vecchio 15 ottobre 10, 15:07   #34 (permalink)  Top
Davide B.
User
 
Data registr.: 12-04-2006
Residenza: Mondovì
Messaggi: 103
Visto che mi piace fare le cose per bene, allego anche il compilato.
Codice:
_main:

;LedBlinking.c,26 ::                 void main()
;LedBlinking.c,29 ::                 ANSEL  = 0;            // I pin AN sono I/O Digitali
        CLRF       ANSEL+0
;LedBlinking.c,30 ::                 ANSELH = 0;
        CLRF       ANSELH+0
;LedBlinking.c,31 ::                 C1ON_bit = 0;          // Disabilito i comparatori
        BCF        C1ON_bit+0, 7
;LedBlinking.c,32 ::                 C2ON_bit = 0;
        BCF        C2ON_bit+0, 7
;LedBlinking.c,34 ::                 TRISA = 0x00;          // Imposto la direzione della porta come uscite
        CLRF       TRISA+0
;LedBlinking.c,35 ::                 TRISB = 0x00;          // Imposto la direzione della porta come uscite
        CLRF       TRISB+0
;LedBlinking.c,36 ::                 TRISC = 0x00;          // Imposto la direzione della porta come uscite
        CLRF       TRISC+0
;LedBlinking.c,37 ::                 TRISD = 0x00;          // Imposto la direzione della porta come uscite
        CLRF       TRISD+0
;LedBlinking.c,39 ::                 do {
L_main0:
;LedBlinking.c,40 ::                 PORTA = 0x00;        // Spegni i led su PORTA
        CLRF       PORTA+0
;LedBlinking.c,41 ::                 PORTB = 0x00;        // Spegni i led su PORTB
        CLRF       PORTB+0
;LedBlinking.c,42 ::                 PORTC = 0x00;        // Spegni i led su PORTC
        CLRF       PORTC+0
;LedBlinking.c,43 ::                 PORTD = 0x00;        // Spegni i led su PORTD
        CLRF       PORTD+0
;LedBlinking.c,44 ::                 Delay_ms(1000);      // delay di 1 secondo
        MOVLW      11
        MOVWF      R11+0
        MOVLW      38
        MOVWF      R12+0
        MOVLW      93
        MOVWF      R13+0
L_main3:
        DECFSZ     R13+0, 1
        GOTO       L_main3
        DECFSZ     R12+0, 1
        GOTO       L_main3
        DECFSZ     R11+0, 1
        GOTO       L_main3
        NOP
        NOP
;LedBlinking.c,46 ::                 PORTA = 0xFF;        // Accendi i led su PORTA
        MOVLW      255
        MOVWF      PORTA+0
;LedBlinking.c,47 ::                 PORTB = 0xFF;        // Accendi i led su PORTB
        MOVLW      255
        MOVWF      PORTB+0
;LedBlinking.c,48 ::                 PORTC = 0xFF;        // Accendi i led su PORTC
        MOVLW      255
        MOVWF      PORTC+0
;LedBlinking.c,49 ::                 PORTD = 0xFF;        // Accendi i led su PORTD
        MOVLW      255
        MOVWF      PORTD+0
;LedBlinking.c,50 ::                 Delay_ms(1000);      // delay di 1 secondo
        MOVLW      11
        MOVWF      R11+0
        MOVLW      38
        MOVWF      R12+0
        MOVLW      93
        MOVWF      R13+0
L_main4:
        DECFSZ     R13+0, 1
        GOTO       L_main4
        DECFSZ     R12+0, 1
        GOTO       L_main4
        DECFSZ     R11+0, 1
        GOTO       L_main4
        NOP
        NOP
;LedBlinking.c,52 ::                 } while(1);            // Cicla per sempre
        GOTO       L_main0
;LedBlinking.c,53 ::                 }
        GOTO       $+0
; end of _main
Come si può ben notare, questo programma è assolutamente non ottimizzato, molte istruzioni si possono scrivere diversamente ed il codice può essere quasi dimezzato.
Ad esempio per scrivere 255 nei porti viene ricaricato 4 volte il working register, mentre in realtà si può ricaricarlo una volta sola.
Inoltre la funzione di delay in realtà viene tradotta come macro ed il codice duplicato, cosa che nessun programmatore medio farebbe.
Il codice in C è comunque molto manutenibile, nel senso che volendo caricare un gioco di led diverso non bisogna stravolgere la struttura del programma come invece si dovrebbe fare in caso di assembler, nel caso di codice ottimizzato.
Citazione:
e poichè nel mondo attuale il 'time to market' è importante....
La cosa è vera solo in parte, perchè quando il numero dei pezzi è basso, allora il tempo di lavoro (ovvero il costo di sviluppo) influisce molto sul costo finale del prodotto. Quando invece il numero dei pezzi è alto, allora dieci centesimi di risparmio per 100.000 pezzzi all'anno, perchè si usa un micro più piccolo, ripagano il tempo di sviluppo di un buon programmatore.
Davide B. non è collegato   Rispondi citando