Tôi đã đọc chương 7 trong 'Trình điều khiển thiết bị Linux' (which can be found here) mà thời gian có thể được đo bằng 'jiffies'. Vấn đề với biến jiffies cổ phiếu là nó kết thúc tốt đẹp xung quanh khá thường xuyên (đặc biệt là nếu bạn có CONFIG_HZ của bạn đặt là 1000).Giờ hiện hành trong hạt nhân Linux 2.6
Trong mô-đun hạt nhân, tôi đang lưu giá trị jiffies được đặt thành một thời gian trong tương lai và so sánh giá trị này sau đó với giá trị 'jiffies' hiện tại. Tôi đã học được đã có những chức năng mà lấy bọc 32bit nháy mắt xem xét như vậy để so sánh hai giá trị Tôi đang sử dụng này:
if (time_after(jiffies, some_future_jiffies_value))
{
// we've already passed the saved value
}
Ở đây có câu hỏi của tôi: Vì vậy, bây giờ tôi muốn thiết lập 'some_future_jiffies_value' thành "now + 10ms". Điều này có thể dễ dàng thực hiện bằng cách thực hiện việc này:
some_future_jiffies_value = jiffies + msecs_to_jiffies(10);
Điều này có đúng không? Điều gì sẽ xảy ra nếu các jiffies hiện tại gần MAX_JIFFY_OFFSET và giá trị kết quả của msecs_to_jiffies (10) đặt some_future_jiffies_value quá khứ bù đắp đó? Liệu nó quấn quanh tự động hay tôi nên thêm một số mã để kiểm tra này? Có chức năng nào giúp tôi tránh phải đối phó với điều này không?
Cập nhật:
Để tránh nội dung với wraparound Tôi đã viết lại vòng lặp giấc ngủ của tôi:
// Sleep for the appropriate time
while (time_after(some_future_jiffies_value, jiffies))
{
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(1);
}
Tôi giả định này là hơn đúng xách tay?
Cập nhật 2:
Thank you very much 'ctuffli' đã dành thời gian để trở về với câu hỏi này và cung cấp một số thông tin phản hồi về ý kiến của tôi là tốt. Trình điều khiển hạt nhân của tôi hiện đang hoạt động tốt và nó kém hơn rất nhiều so với tình huống trước khi bạn cung cấp cho tôi tất cả các mẹo này. Cảm ơn!
Một ý nghĩ khác: sẽ sử dụng get \ _jiffies \ _64() cứu tôi khỏi phải nghĩ đến việc bao bọc và chỉ để tôi làm toán đơn giản? – Benjamin