🌱 Watchdog Timer trong hệ thống nhúng
Watchdog là khái niệm rất quen thuộc khi lập trình nhúng / vi điều khiển, tuy nhiên lại ít được sử dụng khi các bạn học tập về vi điều khiển, vì nó liên quan đến phần safety mà chỉ sử dụng trong các ứng dụng thực tế.
Watchdog Timer (WDT) là một bộ ngoại vi timer của vi điều khiển, mục tiêu để giám sát hoạt động của vi điều khiển xem nó có bị treo / ngừng hoạt động hay không.
Trong các tài liệu phổ thông có thể bạn đọc đã nghe về Watchdog với chức năng chống treo chương trình. Trên thực tế thì đó chỉ là chức năng chính và cơ bản nhất của một bộ Watchdog, vì vậy bài viết này mong muốn gửi đến bạn đọc cái nhìn tổng quan nhất về các loại và các cơ chế hoạt động của Watchdog.
➤ Hoạt động cơ bản của Watchdog
Về cấu tạo và cơ chế hoạt động của Watchdog cũng khá đơn giản, thành phần chính là một bộ đếm timer để đếm khoảng thời gian cần giám sát. Nguồn cấp clock cho bộ đếm này thường tách biệt với nguồn clock dành cho CPU.
Sơ đồ khối Watchdog Timer |
👉 Nguồn cấp Clock cho Watchdog
Như hình trên, nguồn cấp clock cho Watchdog thường là một nguồn clock nội riêng, khác với nguồn cấp clock cho core. Mục tiêu là để tránh lỗi mất core clock, lúc này thì Watchdog vẫn sẽ hoạt động và phát hiện được lỗi.
Tuy nhiên, một số dòng chip mới đã tích hợp sẵn các bộ ngoại vi để phát hiện mất clock riêng (ví dụ CMU - Clock Monitoring Unit trong một số chip của NXP, OFD - Oscillation Frequency Detector trong một số chip của Toshiba). Vì vậy, Watchdog có thể sử dụng chung các clock chung nhánh với core như những ngoại vi khác.
👉 Hoạt động chính của Watchdog
Các bộ Watchdog sẽ cho phép người lập trình cấu hình thời gian timeout tương ứng. Khi chương trình bật Watchdog, timer sẽ bắt đầu chạy, chạy hết thời gian đã cấu hình thì timer tràn và Watchdog sẽ đưa đưa ra các phản ứng cho hệ thống. Vì vậy, cách sử dụng Watchdog thông dụng nhất chính là đặt đoạn code cần protect ở sau phần Enable Watchdog, và kết thúc bởi phần Clear Watchdog.
Hoạt động cơ bản của Watchdog |
- Nếu đoạn code (Safety Code) thực thi xong trước thời gian cấu hình, thì chương trình sẽ Clear Watchdog và tiếp tục hoạt động bình thường.
- Nếu có vấn đề xảy ra (nhiễu, mất clock, ...) khiến cho đoạn code không thể thực hiện xong trong thời gian cấu hình, đồng nghĩa CPU không thể clear watchdog, WDT sẽ timeout và đưa ra các behaviour về hệ thống.
👉 Các behaviour của Watchdog về hệ thống
Đối với những con chip mình từng làm việc, một số phản ứng chính của Watchdog:
🔻 Watchdog Reset
Phổ biến nhất chắc chắn là Reset. Đối với các dòng chip đơn giản (AVR, PIC, STM32, ...) thì Watchdog sẽ trigger một tín hiệu reset để vi điều khiển chạy lại từ đầu.
Tuy nhiên, phương án này sẽ chỉ giải quyết được một số vấn đề đơn giản bằng cách reset lại phần mềm chứ không phân tích hay giải quyết các lỗi gây ra. Vì vậy, behaviour này sử dụng trong các trường hợp như lỗi liên quan đến bộ nhớ RAM, nhiễu tín hiệu truyền thông, hẹn giờ reset hệ thống, ...
Phương án bên dưới sẽ cho hệ thống "cơ hội để sửa sai", chứ không vội vàng reset. Việc này nhằm mục đích giúp MCU có thể phân tích, xử lý được lỗi, hoặc check lỗi là gì sau đó lưu vào các bộ nhớ NVM trước khi reset.
🔻 Interrupt / NMI
Một số dòng chip thiết kế Watchdog để có thể cấu hình trigger một Interrupt hoặc NMI Handler (Vì NMI là một exception được thiết kế để nhận tín hiệu trigger từ các bộ ngoại vi).
Trong WDT_ISR hoặc NMI_ISR, dev có thể clear watchdog và xử lý các cờ lỗi tương ứng (cái này tùy vào yêu cầu và thiết kế chương trình).
🔻 FCCU - Fault Collection and Control Unit
FCCU là một module phục vụ cho Functional Safety, với mục đích tổng hợp các lỗi của chương trình MCU và đưa ra các reaction tương ứng. FCCU được thiết kế trong một số dòng chip sinh ra để đáp ứng tiêu chuẩn safety ISO26262 cho Automotive (Một số chip của NXP - S32Gx / S32K3 / ..., ST chip - SPC584B / SPC56EL60x / RPC56EL60x).
Một số dòng chip sẽ thiết kế để Watchdog có thể cấu hình gửi tín hiệu về FCCU khi timeout, sau đó reaction đưa ra là gì (reset, xử lý lỗi, ...) sẽ phụ thuộc vào cấu hình của FCCU. Về cơ bản, mục tiêu vẫn giống trường hợp Interrupt hay NMI ở trên, để phân tích, lưu trữ, xử lý lỗi.
➤ Chế độ hoạt động của Watchdog
🔻 Timeout Mode / or Independent Watchdog
Timeout Mode là chế độ hoạt động đơn giản và thường gặp nhất của Watchdog, với việc phát hiện timer bị timeout khi đếm hết và dev có thể clear watchdog ở bất kể thời điểm nào.
Watchdog Timer Timeout Mode |
➥ Một ví dụ lập trình Watchdog Timeout Mode trên vi điều khiển ATMega16/ATMega32
🔻 Watchdog Window Mode <Chế độ cửa sổ>
Window Mode <Chế độ cửa sổ> là chế độ hoạt động mà Watchdog sẽ chỉ xác định một khoảng thời gian nhất định để chương trình clear watchdog. Tức là watchdog sẽ detect lỗi và đưa ra behaviour nếu nó không được clear trong khoảng thời gian đã đặt, hoặc nhận được nhiều tín hiệu trong khoảng thời gian này.
Watchdog Timer Window Mode |
Vì vậy, mức độ tin cậy của Window Mode là cao hơn so với Timeout Mode và nó thường được sử dụng trong các ứng dụng Automotive Safety.
🔻 Q&A (Question & Answer) mode
Watchdog Timer Question and Answer Mode |
Do đó cơ chế này có độ tin cậy cao hơn hai mode trên, nhưng đổi lại yêu cầu phức tạp hơn cả về thiết kế phần cứng lẫn phần mềm nên rất ít được sử dụng.
➤ External Watchdog
Sử dụng External Watchdog là một ý tưởng hay nếu bạn triển khai một số ứng dụng quan trọng. Vì bản thân các bộ Watchdog nội dùng để giám sát MCU lại nằm trong MCU, nên nếu có vấn đề gì đó xảy ra - chẳng hạn như clock cấp cho Watchdog có vấn đề hoặc bản thân Watchdog nội có vấn đề, thì việc đảm bảo an toàn cho hệ thống sẽ được đảm nhận bởi External Watchdog.
Sơ đồ khối kết nối External Watchdog MAX67xx với vi điều khiển |
Có rất nhiều IC hỗ trợ Watchdog, thường nó kết hợp với các chức năng khác như giám sát nguồn: MAX67xx của Analog Device, TPS34xx của TI, PMIC của NXP, ...
>>>= Follow ngay =<<<
Để nhận được những bài học miễn phí mới nhất nhé 😊
Chúc các bạn học tập tốt 😊