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
. jiffies
giá 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 HZ
tham 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 ( jiffies
biến), nó biết có bao nhiêu tick như vậy được tạo ra mỗi giây ( HZ
tù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 RTC
về 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/HZ
giá 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_gettime
cuộ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.