2015-03-15 17 views
5

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 enter image description here

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. enter image description here

+0

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

+0

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? –

+0

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

Trả lời

2

Tôi giả sử bạn đang sử dụng bản gốc Raspberry pi và không phải là Raspberry pi 2. Vấn đề với bản gốc Raspberry pi là nó sử dụng một lõi ARM11 lõi CPU có hiệu quả có nghĩa là bất kỳ loại tính RT nào bạn đang làm) bị ràng buộc có lỗi vì phần cứng ngắt. Ví dụ: các gói đến qua Wifi có thể làm gián đoạn hệ thống của bạn, điều này sẽ gây ra sự cố.

Một điều có thể bạn có thể thử, nếu bạn ổn khi không có kết nối mạng, là tăng ưu tiên quy trình và tắt giao diện wifi và giao diện người dùng. Đây, tôi sẽ nói, là nguồn chính của các ngắt không đồng bộ có thể sẽ làm gián đoạn quá trình thực thi của bạn. Sẽ có các ngắt khác tiếp tục kích hoạt, bạn có thể xem/proc/interrupts và/proc/softirq để có ý tưởng về việc ngắt quãng, nhưng trong một nền tảng như pi mâm xôi, chúng nên là linh hoạt (hẹn giờ) hoặc chúng sẽ rất ngắn ngủi (ví dụ như ngắt USB) không nên gây ra sự chậm trễ trong quá trình của bạn, theo thứ tự của một vài ms.

Các vấn đề liên quan