Come risolvere una lunga cascata di IF
Moderatore:
Paolino
36 messaggi
• Pagina 2 di 4 • 1, 2, 3, 4
1
voti
metti in un array tutti i puntatori a funzioni e poi gli indicizzi, come nell’esempio del messaggio [6]
-

PietroBaima
90,7k 7 12 13 - G.Master EY

- Messaggi: 12207
- Iscritto il: 12 ago 2012, 1:20
- Località: Londra
0
voti
Non so se soddisfi la richiesta, ma il C di Microchip supporta lo statement switch (), come già detto da MarcoD
https://microchipdeveloper.com/tls2101: ... statements
https://microchipdeveloper.com/tls2101: ... statements
1
voti
alev ha scritto:Non so se soddisfi la richiesta
no, non la soddisfa.
Mettere uno switch o una catena di if non è molto diverso.
Inoltre l’uso dello switch è oggi deprecato e viene conservato unicamente per legacy.
-

PietroBaima
90,7k 7 12 13 - G.Master EY

- Messaggi: 12207
- Iscritto il: 12 ago 2012, 1:20
- Località: Londra
1
voti
PietroBaima ha scritto:... non usare l’istruzione “goto”, è veramente orribile...
Perche' ? ... "10 Goto 10" non era una perla di saggezza ?
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.
-

Etemenanki
9.527 3 6 10 - Master

- Messaggi: 5950
- Iscritto il: 2 apr 2021, 23:42
- Località: Dalle parti di un grande lago ... :)
2
voti
Lo era, ma gli spaghetti stanno sullo stomaco ai programmatori.
Forse questo video spiega meglio perché sia utile costruire puntatori a funzioni:
Oggi, comunque, non si usano più nemmeno i puntatori a funzioni, che sono superati dalle funzioni anonime.
A chi interessa approfondire consiglio di leggere qualcosa sulla programmazione funzionale o sul lambda calcolo.
Questi concetti sono stati fondamentali per costruire gli interpreti dei comandi.
Lo stesso interprete dei comandi DOS era una struttura dati (una lista) di puntatori a funzioni.
Qui un esempio di funzioni anonime in Mathematica.
-

PietroBaima
90,7k 7 12 13 - G.Master EY

- Messaggi: 12207
- Iscritto il: 12 ago 2012, 1:20
- Località: Londra
0
voti
A mio avviso, senza nulla togliere alla pregevole proposta di Pietro, occorre modificare in modo più pesante il codice.
Siamo in una ISR (fast!! ??).
Quindi l'unica cosa da fare è settare una o due variabili ed uscire. Altrove ci si occuperà di agire in base a quanto settato.
Poi ormai i compilatori sono molto più bravi di un bravo programmatore....
Siamo in una ISR (fast!! ??).
Quindi l'unica cosa da fare è settare una o due variabili ed uscire. Altrove ci si occuperà di agire in base a quanto settato.
Poi ormai i compilatori sono molto più bravi di un bravo programmatore....
0
voti
eh??
-

PietroBaima
90,7k 7 12 13 - G.Master EY

- Messaggi: 12207
- Iscritto il: 12 ago 2012, 1:20
- Località: Londra
2
voti
Non si sta parlando di come bisogna scrivere una ISR.
Se vuoi possiamo farlo, ma è OT.
L’OP vuole sapere come rendere efficiente una lunga catena di IF.
La risposta è di usare un puntatore a funzioni e di fare un array con tutti i puntatori.
Il codice da scrivere nella ISR sarà pertanto:
al posto di tutti quegli IF.
L’efficienza del codice, facendo così, aumenta almeno di un fattore 10.
Se poi vogliamo parlare di come ci si deve comportare in un service di interrupt bisogna considerare questo:
L’applicazione è real-time?
se sì allora la funzione va calcolata nell’ISR e pertanto il uC deve avere una potenza di calcolo adeguata; se no si esce dalla ISR con il puntatore alla funzione e si richiama la funzione fuori, mentre si aspetta il prossimo INT, quando deciso dallo scheduler.
Se vuoi possiamo farlo, ma è OT.
L’OP vuole sapere come rendere efficiente una lunga catena di IF.
La risposta è di usare un puntatore a funzioni e di fare un array con tutti i puntatori.
Il codice da scrivere nella ISR sarà pertanto:
- Codice: Seleziona tutto
(*fun_ptr_arr[stato])(var1, var2, var3 eccetera);
al posto di tutti quegli IF.
L’efficienza del codice, facendo così, aumenta almeno di un fattore 10.
Se poi vogliamo parlare di come ci si deve comportare in un service di interrupt bisogna considerare questo:
L’applicazione è real-time?
se sì allora la funzione va calcolata nell’ISR e pertanto il uC deve avere una potenza di calcolo adeguata; se no si esce dalla ISR con il puntatore alla funzione e si richiama la funzione fuori, mentre si aspetta il prossimo INT, quando deciso dallo scheduler.
-

PietroBaima
90,7k 7 12 13 - G.Master EY

- Messaggi: 12207
- Iscritto il: 12 ago 2012, 1:20
- Località: Londra
36 messaggi
• Pagina 2 di 4 • 1, 2, 3, 4
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 17 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)
pigreco]=π

