реклама на сайте
подробности

 
 
> Бездействие системы - как измерить?, Мерялка занятости процессора
sonycman
сообщение Aug 11 2010, 16:09
Сообщение #1


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Доброго времени суток!

Использую порт scmRTOS для кортексов.
Большое спасибо авторам ОС и порта, люди сделали большую работу и дали воспользоваться ей другим.
Респект!

Вот захотелось сделать прибамбас - индикацию бездействия контроллера.
Ведь весьма полезная фича при отладке приложения.

Пока идея такова:

1. в одном из процессов запускаем таймер (1) на 1 сек (к примеру).

2. как только попадаем в IdleProcessHook() - запускаем другой таймер (2) и взводим флаг IDLE.
Делаем это в критич. секции (?).
Если IDLE уже взведён - ничего не трогаем.

3. как только попадаем в ContextSwitchUserHook() - проверяем, взведён ли флаг IDLE. Если да - останавливаем таймер (2) и сбрасываем IDLE.

4. как только таймер (1) досчитывает до порогового значения периода измерения - сопоставляем натикавшее время (1) и (2) таймеров и вычисляем загрузку.
Если (2) таймер в нуле - 100% загрузка, если близок по значению к (1) - 0%.
Затем сбрасываем оба таймера и всё повторяется сначала.

Вроде для грубого вычисления подойдёт.
Что плохо - таймер простоя (2) будет считать время выполнения любых прерываний как бездействие системы.
Это внесёт погрешность.

ЗЫ:Если я правильно понял, IdleProcess выполняется также, как и все остальные процессы - то есть продолжает выполняться с того места, откуда был прерван?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sonycman
сообщение Aug 13 2010, 01:51
Сообщение #2


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



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

Попробую немного соптимизировать - использовать вместо двух таймеров один - системный 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.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 1st August 2025 - 21:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01394 секунд с 7
ELECTRONIX ©2004-2016