Dove mettere i calcoli?All'interno del gestore di interrupt o del ciclo principale?(Applicazione in tutto il tempo incorporata)

StackOverflow https://stackoverflow.com//questions/9609882

Domanda

Sto sviluppando un'applicazione incorporata per il controllo motore e ho dubbi su cosa per con alcuni calcoli che trasformano valori numerici adc in valori fisici firmati (amplificatori).

Dovrei effettuare i calcoli nel gestore di interrupt o dovrei usare il gestore per impostare una bandiera globale e creare i calcoli nel ciclo principale quando è stato impostato il flag?

Grazie in anticipo.

È stato utile?

Soluzione

Non c'è nessuna risposta a misura di adattamento per questo.Dipende dai tuoi requisiti di temporizzazione, dal carico di interrupt esistente, ecc.

Se è abbastanza semplice moltiplicabile o qualcosa, allora lo farei solo nell'interruzione e andare avanti.

Assicurati solo di sapere cosa stai facendo e non passare più tempo nel tuo interrupt di quanto dovresti.

Altri suggerimenti

Il lavoro meno che puoi fare nel tuo gestore di interrupt, meglio è.In questo momento potrebbe non essere un grosso problema per la tua applicazione, ma arriverà un momento in cui il caricamento del sistema è più alto e non vorrà tenere premuto altri compiti di priorità più elevata per gestire gli interrupt.Potresti voler esaminare semaforici e una corretta multithreading piuttosto che impostare le bandiere globali.

Dipende da cosa vuoi fare con i valori ADC e quanto è velocemente bisogno di farlo. Se è necessario prendere un'azione critica di tempo in base ai valori ADC, è necessario affrontare quello nell'interruzione. Tuttavia, se questo è il caso, per salvare te stesso la spesa di calcolare il valore analogico "reale" dai conteggi ADC, dovresti semplicemente esprimere le tue soglie critiche in termini di conteggi ADC.

Ad esempio, se il tuo ADC emette 8 conteggi per Volt, e devi firmare un arresto di emergenza se l'ADC segnala maggiore di 1,5 volt, si scrive il codice di interruzione per sparare l'e-stop a 12 conteggi. Potresti quindi passare ancora il conteggio ADC al ciclo principale per la traduzione in unità user-friendly per scopi dell'interfaccia utente, ecc.

Il principio generale è che per garantire che tu possa soddisfare le tue scadenze, si struttura la tua applicazione e tutte le impostazioni per renderlo il più semplice possibile per soddisfare quelle scadenze. Se qualcosa non ha una scadenza dura, mettilo nel loop principale (di nuovo, in generale).

Una cosa da pensare è la coerenza dei dati.Se si ottiene diversi valori correlati dall'ADC (posizione, tensione, corrente, ecc.) Allora potresti voler fare qualcosa per assicurarti di lavorare con un set coerente.Questo potrebbe significare che un aggiornamento di sfondo è migliore di un aggiornamento nell'ISR.Anche la coerenza di una singola lettura per un determinato passaggio dell'algoritmo potrebbe essere importante.Considera questo codice di sfondo.

  delta = data-lastData;
  //ISR could update data here.
  lastData = data;
  something = K1* data + K2 * delta;  //this may be wrong now
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top