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

 
 
 
Reply to this topicStart new topic
> Определение загрузки микроконтроллера., свободные ресурсы
Lagman
сообщение Sep 17 2012, 10:35
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Как определить загрузку (или как это правильно обозвать) микроконтроллера, т.е. выполняется пару задач с прерываниями и без и надо определить есть ли у МК еще свободное время (ресурсы по быстродействию) на выполнение чтобы добавить другие задачи, и для наглядности можно представить как в Windows XP или 7 по ctrl-alt-del во вкладке "быстродействие" - "Загрузка ЦП" и "Хронология загрузки ЦП".
Связь с компьютером можно не рассматривать, только внутри МК как можно реализовать или как обычно делают.
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Sep 17 2012, 10:41
Сообщение #2


山伏
*****

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



JTAG и возможности IDE или добавлять маленькие паузы в задачу и писать в какой нить кольцевой буфер - пошли пропуски вот и на пределе производительности.


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 17 2012, 10:43
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



А чем занимается этот контроллер, когда он ничего не делает? Выставьте в том пустом цикле какую-либо ногу в ноль, а при выходе из этого цикла и при входе в прерывания устанавливайте на нее единицу. Вольтметром измерьте усредненное напряжение на этой ноге - чем оно ближе к питанию, тем выше загрузка процессора.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 17 2012, 11:03
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

Может, все-таки осциллом?
В этом случае можно расставить для разных контрольных точек импульсные маркеры, а потом рассматривать более конкретно, чем просто "общую загрузку".


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Lagman
сообщение Sep 17 2012, 11:24
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



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

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

А если это ОСРВ? Видел реализацию в uCOS-II называлась uCOS-VIEW, кто нибудь знает на каком принципе это реализовано там?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 17 2012, 11:31
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Lagman @ Sep 17 2012, 14:24) *
Для простого случая понятно, МК крутится в пустом цикле (ожидает или прерывание или запуск вычисления), не засыпает, тут все хорошо.

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

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

А если программа - просто round-robin с непустым основным циклом, то как мне кажется, несколько сложнее определить загрузку процессора - Idle-то нету.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Sep 17 2012, 11:39
Сообщение #7


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



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

biggrin.gif кто мешает его туда добавить?

Сообщение отредактировал _Pasha - Sep 17 2012, 11:41
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 17 2012, 11:48
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



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

Как вы себе это представляете? Пример не приведёте?
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Sep 17 2012, 12:04
Сообщение #9


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(_Артём_ @ 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
Не, ошибся. Упдатед.

Сообщение отредактировал _Pasha - Sep 17 2012, 12:15
Go to the top of the page
 
+Quote Post
centrone
сообщение Oct 10 2012, 07:46
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 24-12-05
Пользователь №: 12 627



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

Делайте засечки времени для своих задач по ниболее загруженным веткам. Тупо сложите задержки и получите оценку времени рекции.
Go to the top of the page
 
+Quote Post

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

 


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


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