La domanda può sembrare sfocata poiché è difficile descrivere un problema in una riga, quindi ecco qui. Uso Debian su Raspberry Pi per eseguire un regolatore PID, il che significa che dt (differenza di tempo tra le esecuzioni del ciclo) si ottiene ogni volta che viene calcolata l'uscita PID. Fondamentalmente dt è calcolato in questo modo.Come limitare il tempo impiegato da Linux per un'azione?
oldtime_ = time_;
clock_gettime(CLOCK_MONOTONIC, &time_);
Timer.dt = ((static_cast<int64_t>(time_.tv_sec) * 1000000000 + static_cast<int64_t>(time_.tv_nsec)) - (static_cast<int64_t>(oldtime_.tv_sec) * 1000000000 + static_cast<int64_t>(oldtime_.tv_nsec)))/1000000000.0;
PID viene aggiornato circa 400 volte al secondo e va bene, ma a volte Linux decide di prendere molto più tempo per fare un'azione. Il risultato è un grande numero di dt, diciamo, non 1/400 = 0,0025 ma uno 0,8 che è 320 volte più del necessario. Il risultato è un calcolo errato del PID. Sembra così.
Mi piacerebbe avere una risposta su come spostare raspbian un po 'più vicino a un sistema in tempo reale.
EDIT
Grazie, anaken78 e chiunque che hanno aiutato. L'utilizzo della pianificazione RR_FIFO ha funzionato perfettamente e la velocità di elaborazione è sempre di 380-400 hz.
Se è necessario un timer economico di alta precisione, suggerisco di utilizzare il TSC direttamente (se disponibile) e collegare il processo a un singolo core (se il sistema è multiplo) per evitare l'inclinazione di TSC. – erenon
Cosa hai provato finora? Non è che questo requisito sia totalmente nuovo e unico, e sembra che tu sappia già le parole chiave da cercare. Inoltre, il timer non è preciso o lo scheduler si confonde con la tua logica? –
Il sistema è a singolo core. Il problema è che l'utilità di pianificazione non funziona, quindi non sono sicuro che l'utilizzo diretto di TSC potrebbe essere d'aiuto, ma proverò se il funzionamento di TSC fornisce direttamente una priorità più alta a uno schedulatore. Come ho detto, la domanda sembra sfocata per me su Google. L'unica parola chiave che ho provato è "in tempo reale", ma non ho ancora usato i kernel RTlinux o in tempo reale. Lo farò se ballare intorno a Debian non dà risultati. – user3081123