มีการบันทึกไว้อย่างชัดเจนว่าเมื่อมีการแบ่งปันข้อมูลทั่วโลกกับ ISR และโปรแกรมหลักข้อมูลจะต้องประกาศvolatile
เพื่อรับประกันการมองเห็นหน่วยความจำ (และนั่นเพียงพอสำหรับข้อมูล 1 ไบต์เท่านั้นสิ่งที่ใหญ่กว่าต้องมีการจัดการพิเศษเพื่อรับประกันอะตอม . ที่นี่เรามีกฎระเบียบที่ดี:
- ตัวแปรที่ใช้ภายนอก ISR เท่านั้นไม่ควรเปลี่ยนแปลงได้
- ตัวแปรที่ใช้ภายใน ISR เท่านั้นไม่ควรเปลี่ยนแปลงได้
- ตัวแปรที่ใช้ทั้งภายในและภายนอก ISR ควรมีความผันผวน
แต่volatile
จำเป็นเมื่อมีการเข้าถึงตัวแปรจาก> 1 ISR แต่ไม่ได้ใช้ร่วมกันนอก ISR ตัวอย่างเช่นฉันมีฟังก์ชั่นที่รักษาสถานะภายในโดยใช้static
ตัวแปร:
void func() {
static volatile long counter; // volatile or not?
// Do stuff with counter etc.
}
ฟังก์ชั่นนั้นเรียกว่าสองวิธี: จากการขัดจังหวะด้วยพินและจากไลบรารี TimerOne :
attachInterrupt(0, func, CHANGE);
Timer1.attachInterrupt(func);
ไม่มีปัญหา atomicity เนื่องจากเมื่อมีการป้อน ISR อินเทอร์รัปต์จะถูกปิดใช้งานโดยอัตโนมัติแต่นี่volatile
เป็นคำถามคอมไพเลอร์มากกว่าสิ่งที่แคชและสิ่งที่ไม่
ปลอดภัยกว่าดีกว่าขออภัยแน่นอน ...
volatile
เพราะมันไม่ได้ถูกแก้ไขโดยสิ่งอื่นใดนอกจากรหัสที่ถูกสร้างขึ้น คอมไพเลอร์สามารถ "สมมติ" ว่า ISR รันเป็นเส้นตรงและทำเช่นนั้นตราบใดที่อินเตอร์รัปต์ไม่ซ้อนกัน นั่นทำให้รู้สึก ขอบคุณ!