Buoni approcci per implementare più di una funzione time-critical usando un microcontrollore?


8

Qual è la filosofia o l'approccio adottato per implementare funzioni altamente critiche in termini di tempo nei microcontrollori, se ce ne sono?

Sto lavorando a un progetto che prevede l'output di una precisa forma d'onda quadra di frequenza variabile. L'ho fatto usando un timer e una funzione di interruzione. Tuttavia, anche per implementarlo correttamente, ho dovuto calibrare l'offset per il numero di cicli di clock eseguiti durante la routine di servizio di interrupt. Immagino che questa precisione sarebbe disturbata dal fatto che un'altra forma d'onda del genere corre accanto (dire che la frequenza deve essere cambiata allo stesso tempo). Avere un microcontrollore ciascuno, per ogni momento in cui una funzione critica sembra dispendiosa.

Facciamo un altro esempio di implementazione di una funzione clock (come in hh: mm: ss). Non riesco a immaginare che ogni microncontroller / computer di alto livello abbia un chip di orologio in tempo reale dedicato esclusivamente per tenere traccia del tempo. Tuttavia, trovo difficile immaginare che venga misurato con precisione utilizzando il core processor, che è impegnato a servire una pletora di funzioni che nel frattempo vengono ad intervalli asincroni. Immagino che il conteggio del tempo avrebbe errori di offset, che cambiano a seconda delle funzioni in esecuzione.

Esiste un processo di progettazione o un approccio per contenere o dare una tolleranza alla precisione raggiungibile? O qualcuno ha qualche suggerimento o suggerimento su dove potrei trovare maggiori informazioni al riguardo?


Le cose che richiedono un RTC accurato spesso hanno un chip dedicato o una sottofunzione con la propria potenza e cristallo, al fine di tenere traccia del tempo quando il dispositivo è spento. Il tempo è una seccatura enorme.
pjc50,

Smetti di usare un'architettura così orribile (o inizia a usarla correttamente) - i timer hardware non dovrebbero dipendere dal tempo impiegato nella manutenzione dell'ISR - fintanto che i ricarichi vengono effettuati "in tempo" non dovrebbe importare.
Spehro Pefhany,

Quale microcontrollore? Consentirebbe risposte di qualità migliore.
StainlessSteelRat

@SpehroPefhany Devo dire che sono abbastanza inesperto in questo. Il problema che sto riscontrando con l'onda quadra è che vorrei che la frequenza cambi (in grado di) ogni passaggio di uscita (che per 2 diverse onde quadrate sarebbe a intervalli asincroni e potrebbe anche coincidere). Un'onda quadra era una parte più piccola di una domanda più grande che avevo in mente. Nella generazione di forme d'onda, come implementereste più di 1 forma d'onda analogica arbitraria? Il sacrificio sarebbe nel fare una "frequenza di campionamento" comune?
mezzanotteBlu

@StainlessSteelRat Non ho deliberatamente specificato un microcontrollore specifico poiché ritenevo che la domanda fosse piuttosto ampia. A mio avviso, potrebbe applicarsi all'architettura del processore nei computer di grandi dimensioni fino ai microcontrollori. In parte, voglio sapere se ci sono risorse disponibili per imparare a fare buoni progetti / limitare l'errore quando si implementa più di una funzione che è sensibile al tempo.
mezzanotteBlu

Risposte:


10

Per produrre onde quadrate precise, utilizzare l'hardware. La maggior parte dei microcontrollori hanno generatori PWM integrati che possono farlo. Si imposta il periodo e l'ora in cicli di clock e l'hardware fa il resto. Per cambiarlo in una nuova frequenza, scrivere il nuovo periodo nel registro dei periodi e metà del periodo nel registro del ciclo di lavoro.

Quanto all'orologio in tempo reale che perde tempo a causa di altri carichi del processore, non funziona in questo modo a meno che non sia scritto molto male. Generalmente l'hardware verrebbe utilizzato per creare un interrupt periodico che è un multiplo di alcuni secondi e il firmware si divide ulteriormente da lì. Funziona indipendentemente da quanto sia occupato il processore, poiché l'interrupt viene eseguito ogni volta che è necessario. Fintanto che la routine di interruzione richiede una piccola frazione dei cicli complessivi, la maggior parte del processore viene comunque applicata all'attività in primo piano.

Esistono anche modi per mantenere il tempo eseguendo il polling a intervalli alquanto sconosciuti. L'hardware ha un conteggio e ogni volta che si aggiorna l'orologio, lo si aggiorna in base al numero totale di tick trascorsi. Fintanto che questa routine viene eseguita abbastanza spesso in modo tale che qualunque contatore venga utilizzato non passi da una corsa all'altra, non si perde tempo.


Scusate! Avrei dovuto essere più ampio con la mia domanda. Un'onda quadra era solo un esempio particolare di un'applicazione critica nel tempo che avevo in mente. Con il metodo del generatore PWM che hai citato, sarebbe in grado (se necessario) di aggiornare la frequenza su ogni transizione di onda quadra? E se dovessi farlo per due onde quadrate asincrone? Che ne dici di dieci? Mi chiedo se ci siano approcci di progettazione generale a tali cose. I metodi che menzionate per l'interruzione periodica e il polling per aggiornare l'orologio stanno sicuramente facendo luce.
mezzanotteBlu

1
@mid: la maggior parte dei micro può interrompere all'inizio di un periodo PWM. Alcuni hanno registri a doppio buffer in modo da poter aggiornare i parametri durante un periodo, quindi farli entrare in vigore all'inizio del periodo successivo. Alcuni micro possono alimentare il PWM tramite DMA. L'ho usato una volta per avere automaticamente l'hardware nel dithering.
Olin Lathrop

3

La parola chiave qui è "supporto hardware". Per qualsiasi cosa seria avrai bisogno dell'hardware di supporto nel µC. La periferica integrata più comune è la circuiteria del timer che funziona in modo relativamente preciso e senza interferenze da altre operazioni della CPU.

Basandoti su questo, puoi avere molte funzioni in esecuzione con un tempismo a medio termine preciso come la sorgente di clock del tuo controller.

Ma: come forse hai già sperimentato, oltre all'accuratezza a medio o lungo termine, nella gestione del software degli eventi hardware (tra cui cose come l'overflow del timer) c'è sempre anche il jitter di temporizzazione. Ciò è causato da diversi possibili stati di esecuzione nel momento in cui si verifica un evento che comportano ritardi variabili fino a quando può verificarsi la risposta effettiva all'evento.

Quindi, la linea di fondo è: per qualsiasi cosa con requisiti di jitter ad alta velocità o quasi zero, il supporto hardware è essenziale. Molte periferiche hardware sono incluse nella maggior parte dei µC, come UARTs & c, e più µC è potente e costoso, più l'hardware di supporto è solitamente integrato. Se il tuo µC non fornisce l'hardware di cui avresti bisogno, dovrai effettivamente prendere in considerazione hardware esterno dedicato per l'attività.


Comprendere il jitter è la chiave: puoi avere più timer hardware e tutti terranno traccia in modo indipendente, ma se tutti attivano contemporaneamente un interrupt, non tutti possono essere riparati contemporaneamente.
pjc50,

2

Fai tutto il possibile con l'hardware, soprattutto per le funzioni che richiedono molto tempo. Tutti i microcontrollori hanno timer / contatori creati appositamente per contare e cronometrare gli eventi.

A parte questo, questa è davvero una domanda molto ampia. Quindi non c'è una buona risposta.

L'unica vera risposta è l'esperienza. Provalo, profilalo, stressalo, riparalo. Devi identificare aree di codice ad alto utilizzo. Il 20% del software esegue il 90% del tempo, significa che ogni istruzione rimossa, migliora le prestazioni.

Un buon design ha sempre bilanciato hardware, software e memoria. Questo vale per tutti i microprocessori, ma in particolare i microcontrollori. Massimizzane uno o usalo in modo inefficiente e otterrai un prodotto scadente. Con l'aumentare della densità del silicio, sempre più funzionalità sono incluse nell'hardware dei microcontrollori. Ma più funzionalità significa più aspettative. Doppia memoria integrata e aggiungi alcune funzionalità che la utilizzano.

Tutti gli ISR ​​hanno un sovraccarico, che dipende dai registri utilizzati dall'ISR. Se la latenza per salvare lo stato della macchina è significativa rispetto alla manutenzione dell'ISR per funzioni altamente critiche in termini di tempo, la progettazione potrebbe non essere scalabile. Da qui il consenso generale delle risposte all'uso dell'hardware.

L'uso di interrupt software può ridurre il gonfiamento dello stato della macchina ISR.

// Timer0 ISR
Temp = Temp + 1
if (Temp == 150)
    call Inc_Seconds()

Tutti i registri per Inc_Seconds () devono essere inviati, quando vengono utilizzati solo una volta ogni 150 cicli.

// Timer0 ISR
Temp = Temp + 1
if (Temp == 150)
    _Software_Interrupt
...
// Software_Interrupt ISR
    call Inc_Seconds()

Ora il colpo di latenza si verifica solo una volta ogni 150 cicli.

Se si implementa un orologio in tempo reale in hh: mm: ss, importa se è 50ms di sconto. Nessuna persona avrebbe rilevato l'errore. Questo non è certamente un problema operativo in tempo reale.

Per quanto riguarda gli eventi che devono avvenire contemporaneamente. Devono? Se devono, la progettazione dell'hardware deve occuparsene. In caso contrario, è necessario eseguire alcuni compromessi software. Se non è possibile impostare due bit contemporaneamente, impostare un bit. L'istruzione successiva imposta l'altra. Precisione di un ciclo di clock sui processori RISC. Direi che era abbastanza buono.


0

Per la forma d'onda quadrata è necessario utilizzare una periferica PWM collegata a XTAL utilizzando un tipo di contatore per sapere quando eseguire il ciclo (per impostare la pochiquenza). Ogni scheda tecnica ti dirà come farlo :)

Per mantenere il tempo , sì, avrai bisogno di un RTC per farlo in modo accurato a meno che tu non vada assemblatore e autore di codici operativi in ​​modo da conoscere a mano l'esatto tempo di esecuzione di ogni istruzione in qualsiasi percorso di esecuzione. Probabilmente farà anche nuova luce sull'affermata e vera affermazione "goto è considerato dannoso".


3
I tuoi commenti sul software RTC si applicherebbero solo alle soluzioni implementate più negligentemente. Un modo sano e affidabile per farlo è usare un timer hardware per generare un interrupt una volta ogni 1msec (o 10 msec). Nella routine di servizio è presente una variabile contatore statica che conta quindi il numero di interrupt fino a 1000 (o 100). Quando viene raggiunto il conteggio completo, reimpostare il contatore e quindi incrementare il contatore dei secondi. Ogni 60 secondi ripristinerai la variabile del contatore dei secondi a zero e aumenterai la variabile del contatore dei minuti. Estendi tutto questo fino a mesi e anni se necessario.
Michael Karas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.