Tengo cierta confusión sobre qué miembros declarar inestable en un programa que estoy escribiendo en C ++ para un microcontrolador AVR, con interrupciones. Cuando está claro C tiene sentido, el compilador no sabe que las ISR de interrupción pueden modificar las variables en cualquier momento, por lo que esas variables deben declararse volatile
. Pero tengo una arquitectura parecida a la siguiente (ejemplo destilado):
class FifoBuffer {
public:
int Size;
int BeginIndex;
void Push() {
Size++;
// ...
}
}
class RadioInterface {
public:
FifoBuffer RxBuffer;
void HandleInterrupts() {
RxBuffer.Push( 123 );
// ...
}
int GetPacket() {
RxBuffer.Pop();
// ...
}
};
RadioInterface g_Radio;
ISR( INT0_vect ) {
g_Radio.HandleInterrupts();
};
void main() {
while ( true ) {
g_Radio.GetPacket();
}
}
Mi pregunta básica: ¿qué necesita ser volatile
aquí?
Cuando el ISR llama a RadioInterface :: HandleInterrupts (), ¿estamos de nuevo en un contexto seguro y no volátil que el compilador puede descubrir y optimizar? ¿O necesito responder el árbol de llamadas y descubrir todo lo que podría ser tocado desde main()
y desde ISR(...)
y hacerlo volátil?