I came accross this code fragment when reviewing some sample code for ethernet. Didnt even try to build it. Would the delay function even be called if no executable code is in the body? I would think it would be optimized out under all circumstances? In my opionion, its not the right way to do it anyway...
Just curious ...
static void delay (void) {;}; /*--------------------------- output_MDIO -----------------------------------*/ static void output_MDIO (U32 val, U32 n) { /* Output a value to the MII PHY management interface. */ for (val <<= (32 - n); n; val <<= 1, n--) { if (val & 0x80000000) { GPIO2->FIOSET = MDIO; } else { GPIO2->FIOCLR = MDIO; } delay (); GPIO2->FIOSET = MDC; delay (); GPIO2->FIOCLR = MDC; } }
"a NOP can be optimized out"
Yes and no. Many compilers have a specific NOP primitive that they know they must not optimize away.
See for example: infocenter.arm.com/.../index.jsp
In most cases, when nop is used, it's enough to guarantee a minimum delay. It's normally thinks like settle/hold times for external signals.