Цитата(sonycman @ Aug 11 2010, 19:09)

3. как только попадаем в ContextSwitchUserHook() - проверяем, взведён ли флаг IDLE. Если да - останавливаем таймер (2) и сбрасываем IDLE.
Я пользуюсь TNKernel, но принцип можно применить почти к любой RTOS. Заводится один "сводобно-тикающий" таймер - 32-битный (разрядность не особо важна).
В управляющей структуре задачи заводится поле которое считает время отданное задаче (в тиках данного таймера), и при переключении контекста вызывается такое:
Код
//________________________________________________________________
//
// Функция профайлера обновляет такты профайлера в TCB текущей
// задачи прошедшее с момента последнего вызова данной функции
// Должна вызываться с запрещенными прерываниями
//
#if TN_CPU_PERFMON
TN_SYSTEM_CALL
VOID
TN_CALL_OPTION
tn_profiler_update(
void)
{
static DWORD prev = 0;
DWORD value;
value = hal_profiler_counter();
tn_curr_run_task->task_prof += (value - prev);
prev = value;
}
#endif
В итоге в полях task_prof накапливается распределение времени по задачам. Чтобы не было переполнения счетчиков, в отдельном потоке вызвается с определенным интервалом (порядка секунды) сборщик статистики - и по ней уже можно строить графики распределения времени процессора по задачам - при отладке решает все проблемы кардинально. После сведения статистики task_prof-ы обнуляются и начинается новый цикл. Время бездействия системы - это время отданное задаче IDLE. Точность метода можно повысить если завести отдельный task_prof для обработчиков прерываний, но у меня пока такой надобности не было.