Table of Contents
Perché le prestazioni in tempo reale Matters in robotica moderna
I sistemi robotizzati funzionano in ambienti dove il tempo è tutto. Un robot che richiede troppo tempo per elaborare i dati dei sensori o calcolare un comando motore può perdere un evento critico, scontrarsi con un ostacolo, o non eseguire un movimento preciso. Le prestazioni in tempo reale non sono un lusso nella robotica, è un requisito difficile per la sicurezza, l'affidabilità e l'efficacia.
I sistemi in tempo reale devono garantire che le risposte avvengano all'interno di un frame di tempo limitato. Ciò è particolarmente impegnativo nella robotica, dove il loop di controllo deve leggere sensori, elaborare dati, comandi di calcolo e attivare motori all'interno di microsecondi. Qualsiasi ritardo in questo loop può degradare le prestazioni o causare un fallimento definitivo. Per soddisfare questi severi requisiti di tempistica, gli ingegneri devono sfruttare ogni livello dell'architettura di calcolo, e uno degli strumenti più potenti disponibili è l'umile registro.
Cosa sono i registri e perché si occupano di questi?
I registri sono le posizioni di archiviazione più veloci in un processore di computer, che vengono costruite direttamente nel core della CPU e funzionano alla stessa velocità del processore stesso.A differenza della memoria principale (RAM), che può prendere decine o centinaia di cicli di clock per accedere, i registri forniscono i dati in un unico ciclo.
In un sistema robotizzato tipico, i registri detengono risultati intermedi di operazioni aritmetiche, contatori a ciclo, dati dei sensori che devono essere agiti immediatamente e controllano variabili che cambiano ogni ciclo di controllo. Poiché i registri sono così veloci, permettono al processore di mantenere le sue tubazioni piene ed evitare di aspettare sulla memoria, che è spesso il collo di bottiglia primario in sistemi in tempo reale.
Ogni processore moderno ha un numero limitato di registri, tipicamente tra 16 e 32 registri generali in un microcontrollore tipico, anche se alcune architetture come ARM hanno più. Questa scarsità significa che l'allocazione del registro, il processo di decidere quali variabili vivono in registri in qualsiasi momento, è un problema di ottimizzazione critica.
Il ruolo dei registri nella gerarchia della memoria
Per apprezzare pienamente l'impatto dei registri sulle prestazioni in tempo reale, aiuta a capire dove si adattano alla gerarchia della memoria.
- Registers:[] On-chip, accesso a un ciclo singolo, capacità molto limitata (circa cento byte totali).
- Cache (L1, L2, L3):[ On-chip o molto vicino, alcuni cicli di latenza di accesso, capacità più grande (kilobyte ai megabyte).
- Memoria principale (RAM): Off-chip, decine a centinaia di cicli latenza, grande capacità (gigabyte).
- Secondary Storage (Flash, SSD, HDD): Off-chip, milioni di cicli di latenza, capacità massiccia (terabiti).
Ogni istruzione che opera sui dati legge tipicamente i suoi operandi dai registri e scrive i risultati ai registri. Quando i dati non sono in un registro, il processore deve eseguire un'istruzione di carico o di archiviazione, che introduce un ritardo variabile che può interrompere il comportamento in tempo reale.
Quantificare l'impatto delle prestazioni dei registri
La differenza di prestazione tra accesso al registro e accesso alla memoria è in netto contrasto. Per un microcontrollore tipico in esecuzione a 100 MHz:
- Accesso al registro: un ciclo di orologio (10 nanosecondi).
- L1 accesso alla cache: da due a quattro cicli di clock (20-40 nanosecondi).
- RAM access: 20-50 cicli di clock (200-500 nanosecondi).
In un loop di controllo in tempo reale in esecuzione a 1 kHz, il bilancio del loop è di 1 millisecondo. Se ogni iterazione richiede 100 accessi di memoria, e ogni accesso alla memoria costa 10 volte più di un accesso al registro, la sovraccarica totale dalla latenza della memoria potrebbe consumare 500 microsecondi, metà del budget intero. Mantenendo i dati usati frequentemente nei registri, che la testa di sovraccarico scende a 10 microsecondi, liberando 490 microsecondi per elaborazione aggiuntiva.
Tipi di registri utilizzati in Robotics
Registrazioni generali
Questi sono i registri dei cavalletti utilizzati per le operazioni di movimento aritmetico, logico e dati. Tengono variabili, risultati intermedi e indirizzi. In codice robotico in tempo reale, contatori a loop critici, valori temporanei di fusione dei sensori e variabili di stato del controller PID dovrebbero occupare idealmente i registri generali per la durata del ciclo di controllo.
Registrazioni Speciali
La maggior parte dei processori include registri con funzioni dedicate direttamente rilevanti al controllo robotico in tempo reale:
- Contenitore di programma (PC):] Tene l'indirizzo della prossima istruzione. Nei sistemi in tempo reale, i manubri di interruzione modificano il PC per rispondere agli eventi critici nel tempo.
- Stack Pointer (SP): Punti in alto nella pila di chiamata. I sistemi in tempo reale devono gestire con attenzione lo stack per evitare il trabocco durante gli interruttori nidi.
- Status Register (SR):] Contiene bandiere di stato (zero, trasportare, overflow, interrompere abilitare).
- Link Register (LR):] Sulle architetture ARM, tiene l'indirizzo di ritorno per le chiamate di funzione.
Registrati per periferiche
Nella robotica incorporata, molte periferiche (tempori, ADC, generatori PWM, encoders) sono controllate attraverso registri mappati dalla memoria. Questi sono indirizzi speciali che, quando letti o scritti, comunicano direttamente con l'hardware. L'accesso a questi registri è veloce come accesso alla memoria, ma spesso molto più veloce di passare attraverso uno stack del driver.
Strategie per l'utilizzo efficace del registro nel controllo robotico in tempo reale
Identificare e Priorizzare i dati relativi al tempo
Non tutti i dati in un sistema robotico hanno bisogno di accesso a livello di registro, ma è necessario identificare il sottoinsieme delle variabili che sono accessibili a ogni ciclo di controllo e la cui latenza influisce direttamente sulle prestazioni del sistema.
- Letture sensori da encoder, IMU, sensori di forza e telecamere.
- Setpoint e traiettorie di riferimento per il controller.
- Termini di errore e accumulatori integrali in loop PID.
- Variabili di stato nei filtri Kalman o altri algoritmi di stima.
- Puntatori di buffer di comunicazione per protocolli in tempo reale come EtherCAT o CAN FD.
Se il processore non può contenere tutti contemporaneamente a causa della pressione di registro, la prossima opzione migliore è quella di organizzare il codice in modo che le variabili più frequentemente accessibili siano sempre nei registri quando necessario.
Funzioni in linea e Ridurre la chiamata funzione Overhead
Per i loop di controllo in tempo reale, l'inlining funzioni critiche elimina questa overhead. Ad esempio, una matrice si moltiplica per un robot Jacobian o un aggiornamento quaternion per la stima di orientamento può essere inlineato per mantenere tutti i risultati intermedi nei registri piuttosto che versarli allo stack.
Utilizzare le ottimizzazioni dei clienti in modo intelligente
I compilatori moderni hanno passaggi di allocazione dei registri sofisticati. Bandiere come e consentono l'ottimizzazione aggressiva, ma possono anche introdurre comportamenti non deterministici se il compilatore riordina le istruzioni in modi che violano i vincoli di temporizzazione. Per il codice in tempo reale duro, considerare l'utilizzo (ottimizza per le dimensioni) con un'attenta allocazione manuale del registro manuale tramite la parola chiave
Impostazioni registro dedicate per i manici interruttori
Molti processori, in particolare la serie ARM Cortex-M, hanno un insieme di registri bancari per i gestori interrotti, il che significa che quando un incendio interrompi, il processore può passare ad una serie di registri freschi senza salvare il contesto corrente. Questa funzione hardware riduce drasticamente la latenza di interruzione ed è essenziale per l'interruzione del sensore ad alta frequenza.
Registrazione manuale di allocazione con assemblaggio in linea
Quando l'allocazione del registro generata dal compilatore è insufficiente per le garanzie in tempo reale, l'assemblaggio manuale in linea dà agli ingegneri il pieno controllo. Ad esempio, su un ARM Cortex-M4 che esegue un calcolo PID a 32 bit, si può legare il termine di errore a R0, il termine integrale a R1, e il termine derivato a R2, ed eseguire l'intero calcolo senza alcun carico di memoria o immagazzinamento.
Studio pratico dei casi: Registra l'ottimizzazione in un robot quadruped
Considerare un robot quadruped che esegue trottaggio dinamico a 3 m/s. Ogni gamba ha tre articolazioni, e il sistema di controllo deve calcolare la cinematica inversa, coppia di coppia congiunte e forze di reazione a terra a 500 Hz. Il loop di controllo elabora 12 articolazioni, ognuna che richiede un aggiornamento PID, un controllo limite di coppia e una conversione di comando corrente.
Nella versione accessibile, tutte le variabili sono memorizzate in RAM. Il loop di controllo richiede 520 microsecondi, lasciando solo 480 microsecondi per la lettura e la comunicazione del sensore nel ciclo di 1 kHz.
Dopo l'ottimizzazione del registro:
- Tutti i coefficienti di PID e le variabili di stato per ogni articolazione sono mappati su un insieme dedicato di registri, aggiornati su ogni ciclo.
- Le operazioni di matematica critica (sine/cosina per la cinematica) utilizzano una rapida approssimazione che opera interamente nei registri.
- L'assemblaggio in linea viene utilizzato per il loop interno delle operazioni di matrice.
- La funzione principale di controllo è inlineata, eliminando la chiamata funzione overhead.
Il loop ottimizzato viene eseguito a 180 microsecondi, liberando 820 microsecondi per la lavorazione e la comunicazione dei sensori. Il robot ora può gestire ingressi sensori aggiuntivi (LiDAR, telecamera di profondità) senza sacrificare la velocità di controllo. Il miglioramento è venuto quasi interamente dalla riduzione della latenza di accesso alla memoria, mantenendo i dati nei registri.
Pitfalls comuni nel registro di uso per sistemi in tempo reale
Over-Reliance sull'ottimizzazione dei requisiti
I compilatori sono bravi nell'ottimizzazione generale, ma non possono comprendere pienamente i vincoli in tempo reale di un sistema robotico. Un compilatore può rovesciare un registro alla memoria solo perché vede un percorso di codice a bassa probabilità, non sapendo che questa fuoriuscita causerà una violazione dei tempi nel caso comune.
Registrazione Starvation in Complex Loops
Con registri limitati, il compilatore deve versare alcuni alla memoria. Questo può causare tempismo imprevedibile se i modelli di spillatura variano con i dati di input. La soluzione è quella di semplificare l'algoritmo, romperlo in fasi più piccole che si adattano ai registri, o utilizzare un processore con più registri.
Ignorando gli effetti di rottura della latenza
Se il loop di controllo principale utilizza tutti i registri disponibili, il salvataggio del contesto interrompi richiede più tempo, aumentando la la latenza. Una strategia comune è quella di riservare alcuni registri esclusivamente per i gestori di interrompi, assicurando che la routine di servizio di interrompi possa iniziare immediatamente senza salvare il file di registro completo.
Interferenza prefettura prevista per Cache
Nei sistemi con cache, un accesso di memoria mal tempo può causare una mancanza di cache, che innesca un'impresa di memoria che interferisce con il comportamento in tempo reale. I registri, essendo in cima alla gerarchia, non hanno manca di cache. Mantenendo più dati possibile nei registri, gli ingegneri evitano il non-deterinismo del comportamento della cache del tutto.
Strumenti e tecniche per l'analisi di utilizzo del registro
Analisi di uscita Compiler
Per GCC, utilizzare per vedere quali variabili sono assegnate a quali registri. Questo è il modo più diretto per verificare che le variabili critiche rimangano nei registri durante il loop di controllo.
Simulatori di ciclo-accurati
Strumenti come QEMU o simulatori specifici del fornitore (ad esempio, modelli ARM Fast) possono contare i cicli e rivelare eventi di fuoriuscita del registro.
Contatori di prestazioni hardware
I moderni microcontrollori hanno contatori di prestazioni integrati che possono misurare le mancanze della cache, le imprevedizioni del ramo e le bancarelle delle tubazioni.
Tendenze future: Registrare i file e la robotica in tempo reale
File di registro più grandi
Le architetture del processore stanno tendendo verso i file di registro più grandi. RISC-V, ad esempio, permette estensioni personalizzate che possono aggiungere più registri. Poiché i processori morbidi basati su FPGA diventano più comuni nella robotica, gli ingegneri possono progettare i file di registro personalizzati su misura per i loro carichi di lavoro specifici in tempo reale, come un set di registro dedicato per ogni asse di un braccio robotico.
Registrare Windows per il commutazione rapida del contesto
Alcune architetture, come SPARC e RISC-V con l'estensione 'Zcmp', supportano le finestre dei registri, permettono di usare più chiamate funzionali per l'uso di registri freschi senza un salvataggio/ripristina esplicito, riducendo la testa in codice in tempo reale profondamente nidificati, particolarmente utile per le tubazioni di fusione dei sensori che chiamano molte piccole funzioni in sequenza.
AI-Assisted Registrazione
In futuro, i compilatori possono imparare i modelli in tempo reale di un sistema robotico e assegnare i registri per ridurre al minimo il tempo di esecuzione peggiore piuttosto che il caso medio, beneficiando direttamente delle prestazioni in tempo reale dure.
Integrazione dell'ottimizzazione del registro nel flusso di lavoro di sviluppo
L'ottimizzazione del registro non dovrebbe essere un ripensamento nel design del sistema robotico, ma dovrebbe essere integrata nel flusso di lavoro di sviluppo fin dall'inizio:
- Profilo in anticipo:[] Prima di scrivere codice ottimizzato, misurare il tempo di controllo della linea di base del loop e identificare i colli di bottiglia di accesso alla memoria.
- Identificare i percorsi caldi:[] Determinare quali percorsi di codice eseguire ogni ciclo di controllo e quali dati sono accessibili su ogni iterazione.
- Allocate i registri manualmente:[ Per i percorsi più caldi, utilizzare l'assemblaggio in linea o il binding del registro specifico del compilatore per garantire un accesso rapido.
- Verificare il determinismo:[] Utilizzare contatori del ciclo e analisi del tempo di esecuzione peggiore (WCET) per confermare che il codice ottimizzato per il registro soddisfa le garanzie in tempo reale in tutte le condizioni.
- Uso del registro di documento:[[] Mantenere chiara documentazione di cui i registri sono riservati per i quali scopi, soprattutto se il codice sarà mantenuto da più ingegneri.
Conclusioni
I registri non sono solo un concetto di architettura informatica astratto, ma sono uno strumento pratico e ad alto livello per ottenere prestazioni in tempo reale nella robotica. Capire come funzionano i registri, identificare i dati che la maggior parte delle esigenze della loro velocità, e applicare tecniche di ottimizzazione manuale in cui i compilatori cadono a corto, gli ingegneri possono ridurre drasticamente latenza del circuito di controllo e migliorare l'affidabilità del sistema.
La differenza tra un robot che si controlla nei registri e uno che si riversa nella memoria su ogni ciclo è la differenza tra un sistema che soddisfa semplicemente il suo budget di tempistica e uno che ha la headroom per l'innovazione.
Per ulteriori informazioni su questo argomento, prendere in considerazione l'esplorazione delle risorse su sistemi incorporati progettazione per la robotica, come la [ Guida collegata incorporata per registrare l'allocazione in sistemi in tempo reale[], la documentazione di architettura ARM per l'utilizzo dei registri in processori Cortex-M, e la [[