ฉันกำลังมองหาการพัฒนาซอฟต์แวร์ที่ใช้พลังงานแบตเตอรีโดยใช้ตัวควบคุม EFM Gekko (http://energymicro.com/) และต้องการให้ตัวควบคุมหลับไปทุกครั้งที่ไม่มีอะไรทำ คำสั่ง WFI (Wait For Interrupt) ถูกใช้เพื่อจุดประสงค์นี้ มันจะทำให้ตัวประมวลผลเข้าสู่โหมดสลีปจนกว่าจะเกิดการขัดจังหวะ
หากการนอนหลับมีส่วนร่วมโดยการจัดเก็บบางแห่งบางแห่งสามารถใช้การดำเนินการโหลดพิเศษ / เก็บพิเศษเพื่อทำสิ่งที่ต้องการ:
// dont_sleep โหลด 2 ครั้งเมื่อมีอะไรเกิดขึ้น // ควรบังคับให้วนรอบหลักหมุนเวียนอย่างน้อยหนึ่งครั้ง หากมีการขัดจังหวะ // เกิดขึ้นที่ทำให้มันถูกรีเซ็ตเป็น 2 ระหว่างคำสั่งต่อไปนี้ // พฤติกรรมจะเหมือนกับว่ามีการขัดจังหวะเกิดขึ้นหลังจากนั้น store_exclusive (load_exclusive (dont_sleep) >> 1); ในขณะที่ (! dont_sleep) { // หากการขัดจังหวะเกิดขึ้นระหว่างคำสั่งถัดไปและ store_exclusive อย่านอนหลับ load_exclusive (SLEEP_TRIGGER); ถ้า (! dont_sleep) store_exclusive (SLEEP_TRIGGER); }
หากการอินเตอร์รัปต์เกิดขึ้นระหว่างการดำเนินการ load_exclusive และ store_exclusive ผลจะเป็นการข้าม store_exclusive ดังนั้นทำให้ระบบทำงานผ่านลูปอีกครั้ง (เพื่อดูว่าอินเตอร์รัปต์ได้ตั้งค่า น่าเสียดายที่ Gekko ใช้คำสั่ง WFI แทนที่อยู่การเขียนเพื่อเปิดใช้งานโหมดสลีป เขียนรหัสเช่น
ถ้า (! dont_sleep) WFI ();
จะเรียกใช้ความเสี่ยงที่การขัดจังหวะอาจเกิดขึ้นระหว่าง 'if' และ 'wfi' และการตั้งค่า dont_sleep แต่ wfi จะดำเนินต่อไปและดำเนินการต่อไป รูปแบบที่ดีที่สุดในการป้องกันนั้นคืออะไร? ตั้งค่า PRIMASK เป็น 1 เพื่อป้องกันการขัดจังหวะจากการขัดจังหวะตัวประมวลผลก่อนดำเนินการ WFI และล้างออกทันทีหรือไม่ หรือว่ามีเคล็ดลับที่ดีกว่า?
แก้ไข
ฉันสงสัยเกี่ยวกับเหตุการณ์บิต ตามคำอธิบายทั่วไปมันต้องการให้มีการสนับสนุนโปรเซสเซอร์แบบมัลติโปรเซสเซอร์ แต่สงสัยว่าสิ่งต่อไปนี้อาจทำงานได้หรือไม่:
ถ้า (dont_sleep) SEV (); / * จะทำให้การล้างสถานะเหตุการณ์ WFE ชัดเจนขึ้น แต่ไม่นอน * / WFE ();
การขัดจังหวะทุกครั้งที่ตั้งค่าอย่า_sleepควรดำเนินการคำสั่ง SEV ด้วยดังนั้นหากการขัดจังหวะเกิดขึ้นหลังจากการทดสอบ "if" WFE จะล้างค่าสถานะเหตุการณ์ แต่ไม่เข้าสู่โหมดสลีป เสียงนั้นเหมือนกระบวนทัศน์ที่ดีหรือไม่?