Tại sao các chương trình dừng hẹn giờ theo dõi trên MSP430?


11

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:


15

Đồ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.


Cảm ơn +1, mặc dù tôi và các độc giả khác có thể tra cứu nó, thật tuyệt khi biết một lý do rất ngắn gọn về lý do tại sao WDT đặt lại chip. (đừng lo lắng về việc thêm nó vào, mặc dù vậy, câu trả lời của bạn đủ tốt để chấp nhận như vậy (sau khi chờ thêm vài giờ cho các câu trả lời có thể khác))
necromancer

Tôi đoán tôi nên đã đề cập trong câu hỏi rằng tôi là một người mới tuyệt đối, người cũng không có manh mối gì về đồng hồ bấm giờ là gì :)
necromancer

2
@necromancer À, đừng lo, tôi đã thêm thông tin liên quan.
Samuel

2
Samuel - trong hầu hết các trường hợp, bạn KHÔNG nên sử dụng ISR để đặt lại WDT. Đó hầu như luôn là điều sai trái. Các ngắt có thể vui vẻ tiếp tục trong khi các phần khác của chương trình đang tắt ở vùng đất la-la. Thỉnh thoảng có thể / cần thiết (với giao tiếp giữa ISR và các phần khác của chương trình cơ sở có hiệu quả thiết lập mức WDT thứ hai) nhưng không nên được đề xuất cho người mới như một cách tiếp cận đầu tiên.
Spehro Pefhany

9

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:

  • Chữ viết tắt có thể mất nhiều thời gian hơn một tích tắc WDT, nhưng yêu cầu ngắt để bị vô hiệu hóa. Điều này có nghĩa là nếu bạn dựa vào, giả sử, bộ định thời ISR ​​để đặt lại bộ hẹn giờ, bạn có thể vào một vòng lặp khởi động vô hạn.
  • Bạn không nhất thiết phải biết trạng thái của thanh ghi hẹn giờ trên tất cả các MCU (nghĩa là, lần đánh dấu tiếp theo có thể sớm hơn nhiều so với dự kiến, vì đăng ký có thể không bắt đầu từ 0).

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.


+1 cảm ơn bạn đã thêm vào câu trả lời. tôi phát hiện ra rằng bạn có thể vô hiệu hóa nó trước khi khởi tạo bằng int _system_pre_init(void)chức năng, nó thực thi trước đómain
necromancer
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.