Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Определение загрузки микроконтроллера.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Lagman
Как определить загрузку (или как это правильно обозвать) микроконтроллера, т.е. выполняется пару задач с прерываниями и без и надо определить есть ли у МК еще свободное время (ресурсы по быстродействию) на выполнение чтобы добавить другие задачи, и для наглядности можно представить как в Windows XP или 7 по ctrl-alt-del во вкладке "быстродействие" - "Загрузка ЦП" и "Хронология загрузки ЦП".
Связь с компьютером можно не рассматривать, только внутри МК как можно реализовать или как обычно делают.
DRUID3
JTAG и возможности IDE или добавлять маленькие паузы в задачу и писать в какой нить кольцевой буфер - пошли пропуски вот и на пределе производительности.
Сергей Борщ
А чем занимается этот контроллер, когда он ничего не делает? Выставьте в том пустом цикле какую-либо ногу в ноль, а при выходе из этого цикла и при входе в прерывания устанавливайте на нее единицу. Вольтметром измерьте усредненное напряжение на этой ноге - чем оно ближе к питанию, тем выше загрузка процессора.
MrYuran
Цитата(Сергей Борщ @ Sep 17 2012, 14:43) *
Вольтметром измерьте усредненное напряжение на этой ноге - чем оно ближе к питанию, тем выше загрузка процессора.

Может, все-таки осциллом?
В этом случае можно расставить для разных контрольных точек импульсные маркеры, а потом рассматривать более конкретно, чем просто "общую загрузку".
Lagman
Цитата(Сергей Борщ @ Sep 17 2012, 14:43) *
А чем занимается этот контроллер, когда он ничего не делает? Выставьте в том пустом цикле какую-либо ногу в ноль, а при выходе из этого цикла и при входе в прерывания устанавливайте на нее единицу. Вольтметром измерьте усредненное напряжение на этой ноге - чем оно ближе к питанию, тем выше загрузка процессора.

Для простого случая понятно, МК крутится в пустом цикле (ожидает или прерывание или запуск вычисления), не засыпает, тут все хорошо.

А если это ОСРВ? Видел реализацию в uCOS-II называлась uCOS-VIEW, кто нибудь знает на каком принципе это реализовано там?
_Артём_
Цитата(Lagman @ Sep 17 2012, 14:24) *
Для простого случая понятно, МК крутится в пустом цикле (ожидает или прерывание или запуск вычисления), не засыпает, тут все хорошо.

А если это ОСРВ? Видел реализацию в uCOS-II называлась uCOS-VIEW, кто нибудь знает на каком принципе это реализовано там?

Если это ОСРВ, то наверняка есть задача Idle, которой передаётся управление, когда делать больше нечего. Там и нужно выдавать на выход что-нибудь характерное.

А если программа - просто round-robin с непустым основным циклом, то как мне кажется, несколько сложнее определить загрузку процессора - Idle-то нету.
_Pasha
По идее, считается отношение числа тиков, за которое выполняется самая низкоприоритетная задача(system idle) к общему числу системных тиков за отчетный период.
Упс. не так выразился: в idle тики суммируются,
при каждом переключении на нее.
Цитата(_Артём_ @ Sep 17 2012, 14:31) *
А если программа - просто round-robin с непустым основным циклом, то как мне кажется, несколько сложнее определить загрузку процессора - Idle-то нету.

biggrin.gif кто мешает его туда добавить?
_Артём_
Цитата(_Pasha @ Sep 17 2012, 14:39) *
biggrin.gif кто мешает его туда добавить?

Как вы себе это представляете? Пример не приведёте?
_Pasha
Цитата(_Артём_ @ Sep 17 2012, 14:48) *
Как вы себе это представляете? Пример не приведёте?

Простейший. Пусть у нас никакие не protothreads, а просто последовательность функций в теле цикла.
Понятное дело, в каждой ф-ции проверяются условия, если они не выполняются, то выходим из пп. А вот если не выходим...тогда у нас и увеличивается потребление сабжевого ресурса, растет загрузка.
Ставим нашу idle() в любое место списка.
При входе читаем таймер.
Код
float resource_usage;
void idle(void)
{
   static tick_t mem_tick, sum_tick;
   tick_t tmr = get_tick(); // читаем текущий систаймер
   tick_t wrk = tmr - mem_tick;
   if(wrk >= INTERVAL_REP)
   {
     mem_tick = get_tick();
     resource_usage = 1 - sum_tick/wrk;//updated
     sum_tick = 0;
}
    sum_tick += tick_diff(tmr); // tick_diff = get_tick()-tmr
    return;
}

Вроде, ничего не ошибся. sm.gif
Не, ошибся. Упдатед.
centrone
На любой стимул должна последовать реакция в течение некоторого времени. Если нужно среагировать на несколько стимулов, то время реакции увеличится. В правильной системе управления время реагироавния всегда укладывается в нормы.
Если стимул приходит периодически и вы знаете время реакции, то загрузка = t рек / t стим

Делайте засечки времени для своих задач по ниболее загруженным веткам. Тупо сложите задержки и получите оценку времени рекции.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.