Oluyor açıkça belgelenmiş global veri bir ISR ve ana program ile paylaşıldığında, veri ihtiyacı tanımlanmak zorunda olduğunu volatile
garanti bellek görünürlüğü için (ve sadece 1 bayt veri için yeterli; birşey daha büyük ihtiyaçları da teminat bölünmezlik için özel düzenlemeler) . Burada iyi kurallarımız var:
- Yalnızca ISR dışında kullanılan değişkenler uçucu olmamalıdır.
- Yalnızca bir ISR içinde kullanılan değişkenler uçucu olmamalıdır.
- ISR'nin içinde ve dışında kullanılan değişkenler değişken olmalıdır.
Ancak volatile
değişkene> 1 ISR'den erişilip ISR dışında paylaşılmadığında gereklidir? Örneğin, bir static
değişken kullanarak iç durumunu koruyan bir işlevim var:
void func() {
static volatile long counter; // volatile or not?
// Do stuff with counter etc.
}
Bu işlev iki şekilde çağrılır: pin kesmesinden ve TimerOne kütüphanesinden :
attachInterrupt(0, func, CHANGE);
Timer1.attachInterrupt(func);
Atomisite sorunu yoktur, çünkü bir ISR girildiğinde, kesmeler otomatik olarak devre dışı bırakılır , ancak bu volatile
daha çok bir derleyici sorusudur: önbelleğe alınmış olan ve olmayan.
Elbette üzgün olmaktan daha güvenli ...
volatile
, oluşturulan koddan başka bir şey tarafından değiştirilmediğinden değişkenin olması gerekmez ; derleyici, ISR'nin doğrusal olarak yürütüldüğünü "kesebilir" ve kesmeler iç içe geçmediği sürece yapar. Mantıklı. Teşekkürler!