Go Down

Topic: Come usare tanti Switch Case (o If) [Problemi memoria?] (Read 2 times) previous topic - next topic

astrobeed

#10
Sep 14, 2012, 10:54 am Last Edit: Sep 14, 2012, 11:21 am by astrobeed Reason: 1

dove le vedi le call??  :D i case son delle jump,o se è furbo usa una jump table a va velocissimo..
lo so,sono un rompi****e che mette i puntini sulle i


La switch case viene codificata come una serie di chiamate a subroutine, una per ogni funzione invocata, e ovviamente sono delle call, i jump sono esclusivamente per la break che salta direttamente alla fine della switch.
Ovviamente di call ne viene eseguita solo una, ovvero quella della condizione valida, e occupa nello stack solo lo spazio riservato ad una singola chiamata a subroutine,  però a livello di flash viene utilizzata una word (call) per ogni funzione inserita nella switch che va a pesare sull'impiego della memoria di programma, ma non sulla ram.
Da notare che la riga "case 0:TestRx= "U";break; " viene totalmente memorizzata nella flash, la "U" viene considerata come rom constant e posta direttamente nella flash senza necessità di usare progmem.

leo72


PaoloP

E se provassi a registrare le sigle nella Eprom o in una eprom esterna o in una SD?
Dovresti fare solo una funzione per richiamare il dato in base all'indice.
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

m_ri

#13
Sep 14, 2012, 11:35 am Last Edit: Sep 14, 2012, 11:50 am by m_ri Reason: 1
@astrobeed: solitamente,gli switch vengono tradotti in una serie di cmp/test e jump..ho provato a fare un po' di disassemblaggio adesso,ed è così...
altrimenti,come ho detto prima,in alcuni casi,e se l'ottimizzazione è buona,lo switch viene tradotta in jump table..ossia usa l'argomento dello switch come indice in un vettore di puntatori a codice(ossia la cella i-esima del vettore contiene il puntatore al codice da eseguire nel caso la variabile valesse i,più alcune ottimizzazioni)..può essere che in alcuni casi usi la call,ma non mi vengono i mente..
EDIT: anche perchè il compilatore come fa a fare le call condizionate?al massimo può usare call + branch table,ma direi che ha più overhead di una jump table ..

amacbr

ma invece provare qualcosa di questo tipo:

se la prima lettera e' "U" allora
---se la seconda e' una "A" allora
------se la terza e' una "U" allora
---------azione da fare per la combinazione UAU
------else la terza e' una "A" allora
---------azione da fare per la combinazione UAA

non migliorerebbe l'occupazione di memoria? forse ancora meglio sarebbe definendo le lettere possibili come constanti (si puo'?) e poi fare le varie combinazioni con le constanti...
"Cosi non si va avanti..." disse il gambero

Go Up