Nachtrag zum NOP:

asm volatile ("NOP");

wird in einer Schleife nicht rausoptimiert, da es ja expliziet so vom Programmierer gewünschter ASM-Code an dieser Stelle ist.

Ein einfaches

nop ();

würde aber rausoptimiert werden.