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.