ฉันกำลังมองหาการพัฒนาซอฟต์แวร์ที่ใช้พลังงานแบตเตอรีโดยใช้ตัวควบคุม 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 จะล้างค่าสถานะเหตุการณ์ แต่ไม่เข้าสู่โหมดสลีป เสียงนั้นเหมือนกระบวนทัศน์ที่ดีหรือไม่?