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

 
 
> Бездействие системы - как измерить?, Мерялка занятости процессора
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
Ответов
VslavX
сообщение Aug 14 2010, 09:13
Сообщение #2


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(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 для обработчиков прерываний, но у меня пока такой надобности не было.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Aug 14 2010, 13:03
Сообщение #3


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

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



Цитата(VslavX @ Aug 14 2010, 13:13) *
Я пользуюсь TNKernel, но принцип можно применить почти к любой RTOS. Заводится один "сводобно-тикающий" таймер - 32-битный (разрядность не особо важна).

О, спасибо, это тоже интересный вариант, который немного сложнее варианта Сергея, но способен дать бОльшую точность.

Только непонял, зачем функцию tn_profiler_update() ставить в крит. секцию (запрещать прерывания)?
Наверное, если вызывать подобную функцию из ContextSwitchUserHook() в scmRTOS, прерывания запрещать не нужно?
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 30th July 2025 - 23:46
Рейтинг@Mail.ru


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