3.27. Bộ định thời watchdog

Một bộ định thời watchdog là một phần cứng reset vi điều khiển nếu tập lệnh đang chạy không định kỳ "kích hoạt" nó. Tập lệnh "cho ăn" watchdog từ nơi nó biết là đang chạy mã khỏe mạnh; nếu một lỗi, treo máy, hoặc ngoại lệ bất ngờ nào đó khiến camera không thể cho watchdog ăn trong thời gian chờ đã cấu hình, chip sẽ tự reset và tập lệnh khởi động lại.

Trên thiết bị được triển khai không có người ở gần để chu kỳ nguồn, đây là sự khác biệt giữa một lỗi tạm thời phục hồi trong vài giây và một brick cần gọi dịch vụ.

A graph of a watchdog counter over time. The counter starts at the timeout value, drops linearly toward zero, and is reloaded to the timeout each time the script calls feed(). After three successful feed() calls, a fourth interval has no feed() and the counter reaches zero, triggering an MCU reset.

Bộ đếm watchdog đếm ngược từ timeout của nó. Mỗi lần feed() nạp lại nó; nếu nó đến không, chip reset.

3.27.1. Lớp machine.WDT

machine.WDT kích hoạt watchdog và cung cấp một phương thức duy nhất, feed(). Một khi đã khởi động, watchdog không thể dừng -- cách duy nhất để thoát là cho ăn đúng lịch hoặc để nó reset chip:

from machine import WDT

wdt = WDT(timeout=2000)    # reset if not fed within 2 seconds

while True:
    do_work()
    wdt.feed()

timeout tính bằng mili giây. Giá trị phù hợp phụ thuộc vào thời gian vòng lặp chính hợp lệ dài nhất mất bao lâu, với khoảng dư thoải mái -- vòng lặp 100 ms với timeout 2 giây có đủ biên độ cho một vòng lặp chậm mà không gây reset phiền nhiễu.

3.27.2. Nơi gọi feed()

Nơi feed() nằm là quyết định thiết kế quan trọng; watchdog chỉ bắt các lỗi trong các phần mã không chạy giữa các lần feed.

  • Gọi từ vòng lặp chính, ở đầu hoặc cuối. Mẫu phổ biến nhất. Watchdog bắt bất kỳ điều gì treo vòng lặp chính -- deadlock, vòng lặp while vô tận, ngoại vi không bao giờ trả về -- và reset chip trở lại vòng lặp.

  • Không gọi từ trình xử lý ngắt. Điểm của watchdog là bắt các treo trong đường mã thông thường. Một ISR kích hoạt bất kể vòng lặp chính có bị kẹt hay không sẽ tiếp tục cho ăn một watchdog nên kích hoạt.

  • Không gọi từ bên trong một thao tác chặn dài. Một yêu cầu mạng hoặc đọc cảm biến mất mười giây chính xác là loại treo mà watchdog nên bắt. Đặt feed() bên trong nó vô hiệu hóa sự bảo vệ.

Một hướng dẫn hoạt động cho hầu hết các chương trình: feed một lần mỗi vòng lặp chính, với timeout được đặt nhiều lần thời gian vòng lặp dự kiến. Nếu một vòng lặp duy nhất hợp lệ cần lâu hơn timeout -- một giai đoạn hiệu chuẩn có chủ ý, chẳng hạn -- cấu trúc giai đoạn đó thành một loạt các đoạn nhỏ hơn với feed() giữa chúng, hoặc thay đổi timeout bằng timeout_ms() (nếu được hỗ trợ) trước khi vào.

3.27.3. Tính khả dụng

Watchdog được cung cấp trên hầu hết các OpenMV cam nhưng không phải tất cả -- phần cứng có mặt trên mọi phần, nhưng API Python chưa được kết nối ở mọi nơi. Kiểm tra Bo mạch OpenMV hoặc thử xây dựng một WDT và bắt AttributeError nếu không được hỗ trợ.

Ngay cả trên các cam mà WDT không được cung cấp, một thiết bị triển khai thực địa có thể sử dụng một bộ tương đương mềm -- một tác vụ riêng hoặc bước vòng lặp chính theo dõi tiến trình và kích hoạt machine.reset() nếu bất kỳ điều gì có vẻ bị kẹt. Nó ít bền vững hơn watchdog phần cứng (một trình xử lý ngắt bị kẹt cũng có thể làm sập monitor mềm) nhưng bao phủ các trường hợp tương tự ở cấp độ ứng dụng.