Soru, bir satırdaki bir problemi tanımlamak zor olduğu için bulanık görünüyor. Bir PID regülatörü çalıştırmak için Debian on Raspberry Pi'yi kullanıyorum, bu da her bir PID çıkışı hesaplandığında dt (döngü yürütmeleri arasında zaman farkı) elde edildi. Temel olarak dt bu şekilde hesaplanır.Linux, bir eylem için ne kadar zaman alır?
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 ikinci 400 kez etrafında güncellenir ve gayet güzel gidiyor, ama bazen Linux bir eylem yapmak için çok fazla zaman almaya karar verir. Sonuç, çok sayıda dt'dir, diyelim ki, 1/400 = 0,0025 değil, gerekli olandan 320 kat daha fazla bir 0.8'dir. Sonuç, yanlış PID hesaplamasıdır. Bu böyle görünüyor.
Ben gerçek zamanlı sisteme biraz daha yakın raspbian taşıma cevabını isteriz. yardımcı olduk
DÜZENLEME
sayesinde anaken78 ve herkes. RR_FIFO programının kullanılması mükemmel bir şekilde çalıştı ve işlem hızı her zaman 380-400hz oldu.
, ben TSC çarpık önlemek için (varsa) doğrudan TSC kullanın ve (sistem çok çekirdekli ise) tek bir çekirdek için sürecinizi pin öneriyoruz. – erenon
Şimdiye kadar neler denediniz? Bu gereksinim tamamen yeni bir benzersiz değil ve zaten aramak için anahtar kelimeleri bilmek gibi görünüyor. Ayrıca, zamanlayıcı kesin değil mi yoksa programlayıcı mantığınızla uğraşır mı? –
Sistem tek başına özdeştir. Sorun programlayıcıyı karıştırıyor, bu yüzden TSC'yi doğrudan kullanıp kullanmamaya yardımcı olacağından emin değilim, ancak TSC'yi çalıştırmanın doğrudan programlayıcıya daha yüksek bir öncelik vermesi durumunda bir deneme yapacağım. Dediğim gibi, soru google için benim için bulanık görünüyor. Denediğim tek anahtar kelime "gerçek zamanlı", ama henüz RTlinux veya gerçek zamanlı çekirdekler kullanmadım. Debian etrafında dans etmek sonuç vermezse bunu yapacağım. – user3081123