Làm thế nào để Pi theo dõi khoảng thời gian?


8

Theo tôi hiểu RTC là cần thiết để theo dõi thời gian. Tuy nhiên, Raspberry Pi không có điều đó và sử dụng máy chủ NTP để đồng bộ hóa thời gian của nó.

Tất cả đều ổn, nhưng làm sao Pi biết rằng một phần nghìn giây hoặc một giây đã trôi qua. Làm thế nào là Pi nhận thức được thời gian trôi qua?


RTC thực sự ở đó (có pin) khi Pi (hoặc bất kỳ bộ xử lý nào) bị tắt.
Bạch tuộc

Pi có đồng hồ bên trong được đặt bởi NTP bất cứ khi nào nó có trên Internet, như bạn đã nói. Nó là phần mềm theo dõi nó và thời gian trôi qua sau đó, không phải là một RTC tuyệt đối. Các lệnh Linux tiêu chuẩn có thể truy xuất thông tin đó bất cứ khi nào bạn cần. Vì vậy, để trả lời câu hỏi của bạn, tất cả những gì nó "biết" là thời điểm nó được đặt gần đây nhất sau đó có bao nhiêu tích tắc kể từ đó. Đây là một bài viết thú vị về chủ đề này. : blog.remibergsma.com/2013/05/12/ Từ
SDsolar

Câu trả lời:


16

Hoạt động RTC

Thứ RaspberryPi thiếu là RTC (Đồng hồ thời gian thực) được hỗ trợ bằng pin. Đây là thiết bị có thể hoạt động độc lập với máy tính chính và theo dõi thời gian trôi qua ngay cả khi thiết bị tắt (đây là lý do tại sao nó có pin riêng). Nó có thể hoạt động theo cách rất đơn giản - nó có một bộ dao động tần số đã biết được kết nối và trên mỗi xung của bộ dao động, nó sẽ tăng bộ đếm thời gian / bộ đếm bên trong của nó. Vì tần số được biết, nên thật dễ dàng để tính thời gian trôi qua dựa trên bộ đếm. Thiết bị cũng sẽ có pin để có thể tiếp tục hoạt động ngay cả khi tắt nguồn bên ngoài.

Một số thiết bị RTC có thể tinh vi hơn. Ví dụ, họ có thể tạo ra một ngắt trong tần số lập trình hoặc ở chế độ báo động (được đặt thành một thời điểm nhất định trong tương lai hoặc thời gian nhất định mỗi ngày, v.v.). Nó không liên quan đến việc giữ thời gian hệ thống và là tùy chọn.

RTC được sử dụng như thế nào

Một máy tính có thể hỏi RTC thời gian là gì (hay chính xác hơn - giá trị truy cập của nó là gì) tại thời điểm khởi động và đặt ngày / giờ nội bộ dựa trên giá trị này. Tuy nhiên, kể từ bây giờ, một máy tính sẽ không yêu cầu RTC về thời gian mỗi giây / milisecond / micro giây. Thay vào đó, nó sẽ chạy đồng hồ của riêng mình (được gọi là thời gian hệ thống), thường sử dụng bộ đếm thời gian / bộ đếm riêng. Giống như trong RTC, bộ đếm thời gian / bộ đếm được đồng hồ với tần số đã biết để dễ dàng tính toán thời gian trôi qua.

Bạn có thể buộc hệ thống của mình đồng bộ hóa đồng hồ với thiết bị RTC (theo cả hai hướng) nhưng điều đó sẽ không xảy ra cho đến khi được yêu cầu. Ví dụ, một số hệ thống được định cấu hình để lưu trữ thời gian hệ thống trong RTC khi tắt hoặc sau khi đồng bộ hóa NTP.

Thiếu RTC

RaspberryPi, giống như nhiều máy tính bảng đơn giá rẻ, không có thiết bị RTC bên ngoài. Điều này có nghĩa là nó không thể yêu cầu thời gian hiện tại khi khởi động. Nhưng như đã đề cập - đây không phải là vấn đề nếu chúng ta có thể lấy ngày / giờ từ nguồn khác (như NTP). Nhược điểm duy nhất là không giống như RTC, bạn không thể yêu cầu NTP khởi động sớm (vì trước tiên bạn cần kết nối mạng).

Vì vậy, để trả lời trực tiếp câu hỏi của bạn - bất kể RaspberryPi (hoặc bất kỳ máy tính nào khác) có RTC hay không, nó sẽ theo dõi thời gian bằng cách sử dụng thiết bị hẹn giờ / bộ đếm nội bộ có sẵn trong hầu hết mọi hệ thống máy tính và được yêu cầu chạy hầu hết mọi loại của hệ điều hành.

Thời gian trong Linux

Các ứng dụng không gian người dùng trong Linux có thể xác định cái gọi là calendar time(đó là thời gian trong thế giới thực) bằng cách sử dụng gettimeofday()chức năng gọi cuộc gọi clock_gettime()hệ thống. Điều xảy ra bây giờ hơi phức tạp một chút do nhiều tính năng nâng cao mà nhân Linux có (như không gian tên, v.v.). Nhưng điều cơ bản là kernel duy trì thời gian dựa trên jiffies. Nó thực sự chỉ là một biến bên trong kernel (thường rộng 64 bit), đếm số lượng bọ kể từ khi hệ thống bắt đầu.

Ticks được tạo ra bởi bộ đếm thời gian phần cứng bằng phương tiện interrupts. jiffiesgiá trị được tăng lên trên mỗi ngắt như vậy. Bộ đếm thời gian phần cứng được cấu hình để tạo ra các ngắt như vậy đều đặn. Khoảng thời gian được cấu hình tại thời điểm khởi động theo một giá trị của HZtham số cấu hình kernel.

Tại bất kỳ thời điểm nào, kernel đều biết có bao nhiêu tick được tạo từ boot ( jiffiesbiến), nó biết có bao nhiêu tick như vậy được tạo ra mỗi giây ( HZtùy chọn cấu hình) để nó có thể dễ dàng tính được bao nhiêu thời gian từ lần khởi động cuối cùng.

Vì vậy, để tổng hợp - kernel hỏi RTCvề calendar time(còn được gọi wall clock) khi khởi động để nó biết thời gian thực sự khi hệ thống khởi động. Sau đó, nó bổ sung jiffies/HZgiá trị này mỗi khi ứng dụng không gian người dùng hỏi thời gian sử dụng clock_gettimecuộc gọi hệ thống.

Thiết bị hẹn giờ / bộ đếm phần cứng

Bộ đếm thời gian / bộ đếm phần cứng là một thiết bị rất đơn giản. Nó có một thanh ghi đếm đếm đồng hồ của nó. Đồng hồ tích tắc thường được tạo bởi một số bên ngoài oscillator(một mạch điện tử tạo ra tín hiệu lặp đi lặp lại) và có tần số đã biết (thường dao động từ vài kHz đến hàng trăm MHz). Điều này có nghĩa là chúng ta có thể dễ dàng tính toán thời gian trôi qua bằng cách chia giá trị bộ đếm cho tần số của bộ dao động.

Thiết bị hẹn giờ có thể được lập trình để làm nhiều việc khác nhau - nó có thể đếm lên và xuống, so sánh thanh ghi bộ đếm với một số giá trị. Ví dụ, nó có thể tạo tín hiệu bên ngoài và bắt đầu đếm từ đầu khi thanh ghi bộ đếm ở một giá trị nào đó. Bằng cách này, bạn có thể định cấu hình thiết bị hẹn giờ để tạo tín hiệu bên ngoài như vậy ở khoảng thời gian không đổi có tần số thấp hơn nhiều so với bộ dao động. Tín hiệu này sau đó có thể được sử dụng như một sự kiện ngắt cho CPU.

Lưu ý rằng bộ tạo dao động có thể được sử dụng trực tiếp thay cho thiết bị hẹn giờ. Điều khác biệt thiết bị hẹn giờ / bộ đếm từ bộ tạo dao động là nó có thể được lập trình. Vì vậy, bạn có thể nghĩ về thiết bị hẹn giờ / bộ đếm như một bộ dao động tinh vi hơn nhiều.


Sẽ hữu ích hơn nếu có nhiều chi tiết hơn được cung cấp về bộ đếm thời gian nội bộ.
AppleGrew

@AppleGrew: Chi tiết nào bạn quan tâm?
Krzysztof Adamski

Bạn có thể đặt tên cho bộ tính giờ bạn đề cập? Để tôi có thể đọc thêm về họ. Khi tôi google "bộ đếm thời gian CPU nội bộ", dường như không nhận được bất cứ điều gì liên quan. Tôi không chắc chính xác những gì tôi hy vọng sẽ học được từ đó, nhưng tôi cảm thấy như tôi vẫn còn thiếu một chút rõ ràng.
AppleGrew

@AppleGrew: Tôi đã thêm một số thông tin cơ bản vào câu hỏi của mình. Hi vọng điêu nay co ich.
Krzysztof Adamski

BTW bạn có thể muốn sửa lỗi chính tả - 'hút' trong phần 3 của phần 'Thời gian trong Linux'.
AppleGrew

1

Đồng hồ CPU có nguồn gốc từ một tinh thể. Thông thường, bạn có thể mong đợi 10-20 phần triệu cho độ chính xác của đồng hồ (khoảng 5-10 phút mỗi năm)


0

Dù sao để trả lời câu hỏi theo cách dễ dàng hơn nhiều cùng với hướng dẫn để thêm RTC vào PI của bạn, tôi sẽ chèn một liên kết dưới đây. Tùy thuộc vào việc bạn chỉ muốn một phương thức đáng tin cậy bên cạnh việc sử dụng cách inet / ntp để biết thời gian hoặc cần một phương pháp rất chính xác, tôi sẽ khuyên bạn nên sử dụng RTC "Chronodot". Nếu không, bảng đột phá RTC sẽ hoạt động tốt và rất dễ để làm việc, tất cả những gì bạn cần thiết lập là I2C để PI giao tiếp với RTC. Thông tin liên kết / tài liệu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.