Tôi có thể gửi một nhịp tim cho con chó xem phần cứng từ chương trình của riêng tôi?


14

Tiếp theo từ câu hỏi và câu trả lời xuất sắc được cung cấp bởi Steve Robillard tại đây:

Làm thế nào để tôi cứng thiết lập lại Raspberry Pi?

Làm cách nào tôi có thể gửi tín hiệu nhịp tim từ chương trình của riêng tôi đến cơ quan giám sát phần cứng của BCM2708 thay vì từ trình nền của cơ quan giám sát Linux? Nói cách khác, tôi muốn đặt lại RPi nếu chương trình MY không chạy (thực thi khi khởi động), không chỉ khi toàn bộ hệ thống bị đóng băng.

Cảm ơn.


Câu trả lời:


7

Bạn có thể và nó khá dễ dàng. RPi có một mô-đun Linux thực hiện API theo dõi Linux tiêu chuẩn. Bạn có thể tìm thấy tài liệu này ở đây .

Bây giờ, nếu bạn đọc nó, bạn sẽ biết rằng có một tệp thiết bị đặc biệt được gọi /dev/watchdogvà để sử dụng, watchdogbạn phải mở tệp này và viết một số dữ liệu (một byte, tốt nhất là viết một cái gì đó ngoài 'V' mà tôi ' m giải thích sau) cho nó theo thời gian. Nếu bạn không viết bất cứ điều gì vào tập tin này đủ lâu, watchdogsẽ kích hoạt khởi động lại. Bạn có thể tìm thấy một chương trình ví dụ (rất đơn giản) ở đây .

Lưu ý rằng trong một tình huống bình thường, nếu bạn đóng /dev/watchdog, watchdogcó thể bị vô hiệu hóa. Có một chế độ đặc biệt gọi là 'Tính năng đóng ma thuật' dường như được trình điều khiển RPi triển khai nhưng AFAIK không được bật trong cấu hình kernel mặc định (tùy chọn CONFIG_WATCHDOG_NOWAYOUT). Trong trường hợp này, khởi động lại sẽ được kích hoạt ngay cả khi bạn đóng /dev/watchdogtrừ khi bạn viết 'V' cho nó ngay trước khi thoát ứng dụng.

Bạn nên tự kiểm tra xem nó có thực sự bị vô hiệu hóa không (tôi không có RPi ở đây ngay bây giờ để kiểm tra), nhưng nếu không, điều đó không tốt cho bạn. Nếu ứng dụng của bạn gặp sự cố, tệp thiết bị theo dõi sẽ bị đóng và khởi động lại sẽ không được kích hoạt và đây là lý do bạn muốn nó. Trong tình huống này, bạn có thể thay đổi cấu hình kernel và xây dựng lại hoặc viết một ứng dụng tùy chỉnh sẽ theo dõi nếu ứng dụng chính của bạn đang hoạt động (ví dụ sử dụng một số phương thức IPC).

Ngoài ra còn có API ioctl cho phép bạn làm thêm một số thứ với watchdog. Ví dụ: bạn có thể đặt thời gian chờ khác - IOCTL với WDIOC_SETTIMEOUT (dường như được trình điều khiển RPI hỗ trợ) hoặc hết thời gian chờ - IOCTL với WDIOC_GettIMEOUT (dường như cũng được hỗ trợ). Bạn có thể muốn sử dụng nó để sửa đổi thời gian chờ mặc định (10 giây). Có giới hạn cứng đến 16 giây tuy nhiên. Đây là một ví dụ:

int timeout = 15;
int fd = open("/dev/watchdog", O_WRONLY);
ioctl(fd, WDIOC_SETTIMEOUT, &timeout);

Bạn cũng có thể sử dụng IOCTL với WDIOC_KEEPALIVE thay vì viết một ký tự nếu bạn muốn. Cả hai phương pháp đều hợp lệ.


Ồ, và tôi đã quên - bạn thực sự có thể sử dụng watchdogd cho việc này. Nó hỗ trợ gọi chương trình bên ngoài sẽ kiểm tra và báo cáo trạng thái hệ thống. Đọc "Kiểm tra nhị phân" trong trang người đàn ông này
Krzysztof Adamski

Cảm ơn. Tôi đã làm cho nó hoạt động! Sau khi thêm bcm2708_wdog vào / etc / mô-đun, tôi đã tạo một ứng dụng thử nghiệm VB.NET đơn giản để kiểm tra hiểu biết của mình: Dim fs As New System.IO.FileStream (fn, IO.FileMode.Open) để bắt đầu bộ đếm thời gian chạy và fs.WriteByte ( H) sau đó fs.Flush () để gửi cho nó nhịp tim. Hoạt động tuyệt vời!
Guy

đại diện số của WDIOC_KEEPALIVE là gì? không thể tìm thấy nó ở bất cứ đâu.
Flash Thunder

@FlashThunder: Nó được định nghĩa ở đây: lxr.free-electrons.com/source/include/uapi/linux/watchdog.h#L29 nhưng bạn sẽ phải giải quyết một vài cấp độ macro để tìm giá trị chính xác. Cách tốt hơn là chỉ viết chương trình C đơn giản để in giá trị. Chỉ cần bao gồm <linux / watchdog.h>. Trên hệ thống của tôi, nó0x80045705
Krzysztof Adamski
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.