Câu hỏi có thể bị mờ vì khó mô tả sự cố trong một dòng, vì vậy tại đây có thể xảy ra. Tôi sử dụng Debian trên Raspberry Pi để chạy bộ điều chỉnh PID có nghĩa là dt (chênh lệch thời gian giữa các lần thực thi vòng lặp) thu được mỗi lần tính toán đầu ra PID. Về cơ bản dt được tính như thế này.Làm cách nào để hạn chế thời gian Linux thực hiện một hành động?
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 được cập nhật khoảng 400 lần một giây và mọi thứ vẫn ổn, nhưng đôi khi Linux quyết định dành nhiều thời gian hơn để thực hiện hành động. Kết quả là một số lượng lớn dt, giả sử, không phải là 1/400 = 0,000025 nhưng là 0,8 gấp 320 lần mức cần thiết. Kết quả là tính toán PID không chính xác. Trông như thế này
Tôi muốn có câu trả lời cách di chuyển raspbian gần hơn một chút với hệ thống thời gian thực.
EDIT
Cảm ơn, anaken78 và bất cứ ai đã giúp đỡ. Sử dụng lịch trình RR_FIFO hoạt động hoàn hảo và tốc độ xử lý luôn là 380-400hz.
Nếu bạn cần độ chính xác cao, hẹn giờ rẻ, tôi đề nghị sử dụng TSC trực tiếp (nếu có), và ghim quy trình của bạn vào một lõi đơn (nếu hệ thống là đa lõi) để tránh TSC bị lệch. – erenon
Bạn đã thử những gì cho đến nay? Nó không giống như yêu cầu này là hoàn toàn mới một độc đáo, và bạn đã dường như biết các từ khóa để tìm kiếm. Ngoài ra, là bộ đếm thời gian không chính xác hoặc không lộn xộn lên lịch với logic của bạn? –
Hệ thống là một lõi riêng. Vấn đề là lập lịch trình rối tung lên vì vậy tôi không chắc chắn nếu sử dụng TSC trực tiếp sẽ giúp đỡ, nhưng tôi sẽ cung cấp cho nó một thử nếu hoạt động TSC trực tiếp cho một ưu tiên cao hơn để lên lịch. Như tôi đã nói, câu hỏi có vẻ mờ cho tôi với google. Từ khóa duy nhất tôi đã thử là "thời gian thực", nhưng tôi chưa sử dụng hạt nhân RTlinux hoặc thời gian thực. Tôi sẽ làm điều này nếu nhảy múa quanh debian không cho kết quả. – user3081123