Ho un codice di controllo in esecuzione robot con priorità in tempo reale su un sistema operativo Linux con patch PREEMPT-RT su un Beaglebone Black. Tutto il codice è scritto in C e funziona a 500Hz.Picchi di latenza durante l'acquisizione dei dati in Linux embedded in tempo reale
Ho notato una latenza nell'intervallo di poche centinaia di millisecondi ogni tanto durante l'esecuzione del codice e l'ho rintracciata nella funzione di registrazione dei dati che ho scritto. Questa latenza causa il fallimento del controllo del mio robot poiché dipende molto dalla funzionalità in tempo reale.
La parte di codice pertinente è riportata di seguito. Ho tagliato un sacco di codice per chiarezza, ma modifico questo post se è necessario qualcosa.
FILE *file;
int main(int argc, char** argv) {
file = fopen(logname, "w");
while (1) {
/* Control code stuff*/
logData();
time_msec = time_msec + controlLoopTime;
}
}
void logData() {
if (time_msec - logTimer_msec >= LOG_TIMER) {
logTimer_msec = time_msec;
if (!bLogCreated) {
fprintf(file,
"SensorData1 SensorData2 SensorDataN"
);
bLogCreated = TRUE;
}
// log data to file
fprintf(file,
"%.2f %.2f\n",
sensorData1, sensorData2, sensorDataN
);
}
}
Ho bisogno di registrare dati da più variabili (probabilmente 20-50) ad una buona frequenza, forse 100-125Hz. Non è necessario che i dati vengano registrati alla velocità di controllo (ogni 2 ms), ma l'ho ridotto a 12 ms e continuo a vedere picchi di latenza ogni pochi minuti.
La latenza può essere un problema con la chiamata fprintf
. Si tratta di una limitazione del BeagleBone Black, del mio codice o solo della natura del data logging?
Una domanda simile è stato chiesto qui, ma non sembrava per affrontare il mio problema: Finding latency issues (stalls) in embedded Linux systems
Un handle di file non tty è un buffer di blocco predefinito. Quindi dopo 'fprintf'ing 4096 byte il buffer verrà svuotato sul disco che potrebbe causare la latenza. Non puoi esternalizzare la registrazione effettiva in un thread separato? Codificare i messaggi di log e rimuoverli dal logthread. – Ctx
Questo codice è in esecuzione come parte di un normale processo? Controlla qualsiasi mutex, semaforo, ecc. Che bloccherebbe un driver di dispositivo? – wallyk
@jekso: crea un thread di registrazione (p) e usa qualcosa come un doppio elenco collegato come coda (accodamento in testa, eliminazione della coda alla fine) e pthread_cond_wait/notifica per segnalare nuove voci. – Ctx