Ohne Optimierung geht es fast immer auch ohne volatile, aber mit optimierung sollte das volatile schon rein. Nach den Sprachdefintionen gehört das volatile auch hin, denn der Compiler weiß sonst nicht, das sich im Hauptprogramm was an "a" und "empfang" ändern kann. Ohne Optimierung wird GCC das noch nicht ausnutzen, mit Optimierung wahrscheinlich schon.