У всякой задержки есть область определения и разрешение. Вопросы точности при таком решении имеет смысл обсуждать с учетом ожидаемых погрешностей, а не из-за их наличия модифицировать способ работы. Если задержка ОБЯЗАНА быть НЕ МЕНЕЕ заявленной, то стОило бы просто поправить >= на > if((s_timer - start)>duration) break; и не лезть в ожидания прерываний и прочая. В предложенном варианте таймер принципиально НЕ ДОЛЖЕН ВЫКЛЮЧАТЬСЯ.