Nhiều chương trình mẫu cho MSP430 có dòng đầu tiên là:
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
tại sao họ lại làm việc này?
Nhiều chương trình mẫu cho MSP430 có dòng đầu tiên là:
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
tại sao họ lại làm việc này?
Câu trả lời:
Đồng hồ bấm giờ theo dõi (WDT) được bật theo mặc định, đó là một điều hữu ích để có trong các ứng dụng phức tạp hơn, nhưng làm vấp ngã rất nhiều người mới. Họ thường không phục vụ WDT trong mã của họ hoặc bao gồm một thói quen dịch vụ ngắt (ISR) để xử lý sự kiện WDT, vì vậy, khi chip của họ tiếp tục đặt lại, họ trở nên rất bực bội. Ngoài ra, phần lớn các chương trình mẫu không cố gắng chứng minh WDT để nó bị tắt.
Chỉnh sửa: Đồng hồ bấm giờ có thể được đặt tên là "công tắc của người chết". Hành vi mặc định của nó là thiết lập lại vi điều khiển trừ khi phần sụn định kỳ cho phép nó biết mọi thứ đang chạy tốt. Điều này được gọi là "cho chó ăn" hoặc "đá chó". Bằng cách này, nếu phần sụn của bạn bị kẹt trong một vòng lặp hoặc nếu không thì ngừng hoạt động như mong đợi, bộ giám sát sẽ không được cho ăn và sẽ đặt lại chip (hy vọng sẽ ở trạng thái hoạt động mới).
Bạn cũng có thể sử dụng WDT làm ngắt định kỳ để thực hiện các tác vụ khác, bất cứ điều gì bạn có thể tưởng tượng. Bạn chỉ cần viết ISR có liên quan.
Ngoài quan điểm của Samuel về việc mọi người vô tình vấp ngã WDT, còn có một lý do quan trọng khác khiến nó bị vô hiệu hóa ban đầu.
Ngay cả khi ứng dụng của bạn thường có khả năng đặt lại bộ hẹn giờ một cách chính xác, nó có thể không thể làm như vậy trong mã khởi tạo, vì hai lý do:
Do đó, cách tốt nhất là vô hiệu hóa WDT là điều đầu tiên bạn làm, ngay cả khi bạn chưa bao giờ kích hoạt nó .
Nếu bạn muốn sử dụng nó, bạn có thể kích hoạt lại nó ngay lập tức trước khi bật ngắt, là bước cuối cùng của mã khởi tạo.
int _system_pre_init(void)
chức năng, nó thực thi trước đómain