Hai perfettamente ragione, un libro non basta, anzi, sarebbe controproducente, immagginati quante migliaia di pagine da consultare!! meglio se suddiviso sa vari libri, da ogn'uno si traggono alcune idee. in sostanza è quello che ho fatto io per arrivare dove sono adesso, ho preso spunto da esempi, codice esposto su libri e siti web, forum come questo e tanti altri che affrontano argomenti variegati sul tema embedded, solo da un anno a questa parte Arduino.
Da quello che so fin ora, la maggiorparte delle ECU siano esse stradali o da competizione che conosco, usano gli interrupt ed i timer per gestire il tutto, alcune con hardware dedicato, la maggiorparte dei calcoli / eventi vengono fatti in base alla posizione dell'albero motore, per esempio, ricordo di una ECU che dichiarava che ad ogni giro motore, essa ricalcolava 4 volte il tutto, mentre una più recente dichiarava che facesse 200 ricalcoli a giro per un max di 22000 giri (processore da 40MHz se ricordo bene).
Riuscire a schedulare ogni evento al momento giusto è alla base di questo tipo di progetto.
per esempio, per il mio progetto, devo avere degli eventi Interrupt esterni:
CRANK_Signal - ovvero segnale ruota fonica per posizione albero motore, vi sono 60 denti -2-2 ovvero, 28 denti + 2 vuoti + 28 denti + 2 vuoti per 360 gradi. quindi significa che se il mio motore gira a max 6000 rpm, avrò 5600 interrupt, da datasheet ATMEGA328p ho letto che ogni interrupt consuma circa 11 cicli clock e quindi solo per gli interrupt, consumerei: 61600 cicli clock senza contare però il codice da eseguire ad ogni interrupt e il resto del codice.
CAM_Signal - segnale fase camma, ruota fonica da 7 denti che fa capire alla ECU quale cilindro è in compressione. quindi girando alla metà dei giri del motore, ovvero 3000rpm max, e avendo 7 denti darebbe=350 interrupt ovvero altri 3850 cicli clock da aggiungere a quelli per il segnale CRANK (totale 65450 tick).
Se il 328p gira a 16MHz ovvero 16000000 cicli clock/sec significa che (per il mio modesto punto di vista frutto dell'ignoranza in materia, correggetemi se sbaglio) tra un interrupt e l'altro vi restano solo 244 cicli clock, forse pochini per completare la mole di calcoli e cose che deve gestire, o mi sbaglio? Per esempio, ho visto che l'accesso ai canali ADC rallenta l'esecuzione di brutto, anche se ho visto anche che può essere velocizzato mettendo mano ai registri potendoli portare fino a 1 MHz senza perdere troppo in accuratezza (l'ho letto da qualche parte in rete). Per esempio qui, dovrei schedularli in modo da non interferire con le funzionalità critiche, tanto i canali ADC sono parametri che tutte le ECU che conosco controllano con una frequenza minore, ma comunque, almeno 1 volta a giro e quindi intendo prove così.
che ne pensi?