ทำไมโปรแกรมหยุดตัวจับเวลาจ้องจับผิดใน MSP430


11

โปรแกรมตัวอย่างจำนวนมากสำหรับ MSP430 มีบรรทัดแรกดังนี้:

WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer

ทำไมพวกเขาทำเช่นนี้?

คำตอบ:


15

ตัวจับเวลาจ้องจับผิด (WDT) เปิดใช้งานตามค่าเริ่มต้นมันเป็นสิ่งที่มีประโยชน์ที่จะมีในแอพพลิเคชั่นที่มีความซับซ้อนมากขึ้น พวกเขามักจะไม่ให้บริการ WDT ในรหัสของพวกเขาหรือรวมถึงบริการการขัดจังหวะ (ISR) เพื่อจัดการกับเหตุการณ์ WDT ดังนั้นเมื่อชิปของพวกเขาตั้งค่าใหม่พวกเขาจะผิดหวังมาก นอกจากนี้โปรแกรมตัวอย่างส่วนใหญ่ไม่ได้พยายามสาธิต WDT ดังนั้นจึงถูกปิด

แก้ไข: ตัวจับเวลาจ้องจับผิดอาจมีชื่อว่า "สวิตช์คนตาย" พฤติกรรมเริ่มต้นของมันคือการรีเซ็ตไมโครคอนโทรลเลอร์ยกเว้นว่าเฟิร์มแวร์จะแจ้งให้ทราบเป็นระยะ ๆ ว่าทุกอย่างทำงานได้ดี เรื่องนี้เป็นที่รู้จักกันในชื่อ "เลี้ยงสุนัข" หรือ "เตะหมา" วิธีนี้หากเฟิร์มแวร์ของคุณติดอยู่ในลูปหรือหยุดทำงานตามที่คาดไว้จ้องจับผิดจะไม่ถูกป้อนและจะรีเซ็ตชิป (หวังว่าจะเป็นสถานะใหม่และใช้งานได้)

คุณยังสามารถใช้ WDT เพื่อขัดจังหวะเป็นระยะเพื่อทำงานอื่น ๆ ไม่ว่าคุณจะจินตนาการอะไร คุณเพียงแค่ต้องเขียน ISR ที่เกี่ยวข้อง


+1 ขอบคุณแม้ว่าฉันและผู้อ่านคนอื่น ๆ จะสามารถมองหามันได้มันเป็นเรื่องดีที่ได้ทราบเหตุผลสั้น ๆ ว่าเหตุใด WDT จึงรีเซ็ตชิป (ไม่ต้องกังวลเกี่ยวกับการเพิ่มคำตอบของคุณดีพอที่จะยอมรับได้เหมือนเดิม (หลังจากรออีกสองสามชั่วโมงเพื่อหาคำตอบอื่น ๆ ที่เป็นไปได้))
หมอผี

ฉันเดาว่าฉันควรจะกล่าวถึงในคำถามที่ว่าฉันเป็นมือใหม่แน่นอนที่ยังไม่มีเงื่อนงำสิ่งที่เป็นตัวจับเวลาจ้องจับผิดคือ :)
หมอผี

2
@necromancer อ่าไม่ต้องกังวลฉันได้เพิ่มข้อมูลที่เกี่ยวข้องแล้ว
ซามูเอล

2
ซามูเอลในเกือบทุกกรณีคุณไม่ควรใช้ ISR เพื่อรีเซ็ต WDT เป็นสิ่งผิดปกติที่ต้องทำ การขัดจังหวะสามารถดำเนินต่อไปอย่างสนุกสนานในขณะที่ส่วนอื่น ๆ ของโปรแกรมปิดอยู่ในพื้นที่ la-la เป็นไปได้ / จำเป็นเป็นครั้งคราว (ด้วยการสื่อสารระหว่าง ISR และส่วนอื่น ๆ ของเฟิร์มแวร์ที่ตั้งค่าระดับที่สองของ WDT ได้อย่างมีประสิทธิภาพ) แต่ไม่ควรแนะนำให้สมัครใหม่เป็นวิธีแรก
Spehro Pefhany

9

นอกจากประเด็นของซามูเอลเกี่ยวกับผู้คนที่บังเอิญสะดุดกับ WDT แล้วยังมีอีกเหตุผลที่สำคัญว่าทำไมจึงควรปิดใช้งานในตอนแรก

แม้ว่าโดยปกติแอปพลิเคชันของคุณจะสามารถรีเซ็ตตัวจับเวลาได้อย่างถูกต้อง แต่ก็อาจไม่สามารถทำได้ในช่วงรหัสเริ่มต้นด้วยเหตุผลสองประการ:

  • การเริ่มต้นอาจใช้เวลานานกว่าเห็บ WDT เดียว แต่ต้องปิดการใช้งานอินเตอร์รัปต์ ซึ่งหมายความว่าหากคุณพึ่งพาตัวจับเวลา ISR เพื่อรีเซ็ตตัวจับเวลาคุณสามารถเข้าสู่ลูปการบูตที่ไม่มีที่สิ้นสุด
  • คุณไม่จำเป็นต้องทราบสถานะของตัวจับเวลาลงบน MCU ทั้งหมด (เช่นการทำเครื่องหมายถัดไปอาจเร็วกว่าที่คาดไว้เนื่องจากการลงทะเบียนอาจไม่เริ่มที่ 0)

ดังนั้นจึงเป็นการดีที่จะปิดการใช้งาน WDT เป็นสิ่งแรกที่คุณทำแม้ว่าคุณจะไม่ได้เปิดใช้งานก็ตาม

หากคุณต้องการใช้งานคุณสามารถเปิดใช้งานใหม่ได้ทันทีก่อนเปิดการขัดจังหวะซึ่งเป็นขั้นตอนสุดท้ายของรหัสการเริ่มต้นของคุณ


+1 ขอบคุณที่เพิ่มคำตอบ ฉันค้นพบว่าคุณสามารถปิดการใช้งานก่อนที่จะเริ่มต้นโดยใช้int _system_pre_init(void)ฟังก์ชั่นซึ่งดำเนินการก่อนmain
หมอผี
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.