Сделал вчера измерение по описанной методике - всё работает практически как часы

Попробую немного соптимизировать - использовать вместо двух таймеров один - системный SysTick.
И ещё возможен косяк с WFI вот тут:
Код
// 2. как только попадаем в IdleProcessHook() - запускаем другой таймер (2) и взводим флаг IDLE.
// Делаем это в критич. секции (?).
// Если IDLE уже взведён - ничего не трогаем.
void OS::IdleProcessUserHook()
{
if (!idle_flag)
{
TCritSect cs;
idle_flag = TRUE;
tmrIdle = 0;
}
__WFI();
}
если проскочит переключение контекста прямо сразу за крит. секцией и перед инструкцией WFI - при следующем заходе в IdleProcess проц попадёт прямо на WFI и уснёт
со сброшенным флагом idle_flag, так как:
Код
void OS::ContextSwitchUserHook()
{
if (idle_flag)
{
cpu_idle_acc += (dword)tmrIdle;
idle_flag = FALSE;
}
}
То есть внесётся некоторая ошибка.
Чтобы исключить этот косяк - крит. секцию с установкой флага надо размещать в коде ОС прямо перед переключением на IdleProcess.