Нехер пошагово шляться. Я вставляю "asm volatile ("NOP");" в нужном
месте. Тогда появляется возможность привязать точку останова к
конкретной команде ассемблера. Но и это может не сработать - может
оказаться, что через это место код проходит и из других функций. В
таком случае ставлю условие по смыслу, например: if (Speed>=5000) {
asm volatile ("NOP");
}
В таком случае точно сработает, когда в этом месте кода, переменная будет иметь подходящее значение. Оба способа работают при любой оптимизации, первый менее надёжен, так как при переиспользовании кода после оптимизации, может давать ложные срабатывания.
А для отладки значений переменных, когда используется оптимизация, их приходится объявлять вне функции и волатильными. Иначе состояние переменной: "optimized out".