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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как определить загруженность процессора, при выполнении программы?
Pasha 111
сообщение Jul 21 2006, 08:01
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 154
Регистрация: 6-11-05
Из: Москва
Пользователь №: 10 515



Есть программа, вот с такой функцией main:
void main()
{
Init();
while(1) ;
}

Вся остальная программа выполняется по срабатыванию прерываний от ножек процессора и таймера, работающего на частоте 500 Гц. Вопрос: как определить, например в процентах, какая часть процессорного времени уходит на выполнение кода, кроме while(1) в main'е.
Go to the top of the page
 
+Quote Post
iit
сообщение Jul 21 2006, 08:12
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 72
Регистрация: 8-11-04
Из: Томск
Пользователь №: 1 070



Цитата(Pasha 111 @ Jul 21 2006, 11:01) *
Есть программа, вот с такой функцией main:
void main()
{
Init();
while(1) ;
}

Вся остальная программа выполняется по срабатыванию прерываний от ножек процессора и таймера, работающего на частоте 500 Гц. Вопрос: как определить, например в процентах, какая часть процессорного времени уходит на выполнение кода, кроме while(1) в main'е.


В кейловском симуляторе (если есть возможность запустить в нем) можно посмотреть процент выполнения модулей и отдельных функций.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Jul 21 2006, 08:18
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Если длительность прерывания таймера вполне поддаеться просчету,
то все остальное будет зависеть исключительно от внешних событий.
А вообще существуют такие программы - профайлеры, которые просчитывают скорость исполнения различных фрагментов кода и позволяют выявлять узкие места.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
KRS
сообщение Jul 21 2006, 08:28
Сообщение #4


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Можно осцилографом, на глаз? если есть свобожная нога
только чуть изменить хлостой цикл
Код
while(1) {
  SetTestPin();
  ClearTestPin();
}

и сразу будут видны места где проц работатет в прерываниях

второй вариант в начале каждого прерывания устанавливать ногу в 1 ( SetTestPin()wink.gif
а в главном цикле всегда сбрасывать
Код
while(1) {
  ClearTestPin();
}
Go to the top of the page
 
+Quote Post
Alechek
сообщение Jul 21 2006, 08:29
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(Pasha 111 @ Jul 21 2006, 14:01) *
Вопрос: как определить, например в процентах, какая часть процессорного времени уходит на выполнение кода, кроме while(1) в main'е.

Я бы не именя никаких отладочных средств просто при входе в прерывание кидал бы ногу, допустим, в 1, а при выходе опять в 0. А потом в работе мультиметром посмотрел бы напряжение на этой ноге.
Go to the top of the page
 
+Quote Post
Pasha 111
сообщение Jul 21 2006, 08:30
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 154
Регистрация: 6-11-05
Из: Москва
Пользователь №: 10 515



iit, от симулятора не будет толка, потому что выполнение программы зависит от внешних условий.

beer_warrior, функция тамера вызывается 500 раз в секунду, но время её выполнения зависит от внешних факторов.

Интересует не просто врем выполнения программы и, как было сказано, выявление узких мест, а именно на реальном процессоре в реальных условиях постоянно мониторить занятость процессора (как в таск баре в windows)
Go to the top of the page
 
+Quote Post
Alechek
сообщение Jul 21 2006, 08:33
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(Pasha 111 @ Jul 21 2006, 14:30) *
а менно на реальном процессоре в реальных условиях постоянно мониторить занятость процессора (как в таск баре в windows)

Вот светодиод и повесь на ногу.
Go to the top of the page
 
+Quote Post
Pasha 111
сообщение Jul 21 2006, 08:33
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 154
Регистрация: 6-11-05
Из: Москва
Пользователь №: 10 515



KRS, Alechek, а если без внешних приборов? Чтобы была некоторая переменная, изменяющаяся от 0 до 100 и обозначающая загруженность проца?
Go to the top of the page
 
+Quote Post
Alechek
сообщение Jul 21 2006, 08:35
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(Pasha 111 @ Jul 21 2006, 14:33) *
KRS, Alechek, а если без внешних приборов? Чтобы была некоторая переменная, изменяющаяся от 0 до 100 и обозначающая загруженность проца?

Завести с этой ноги на вход АЦП??
Go to the top of the page
 
+Quote Post
Pasha 111
сообщение Jul 21 2006, 08:43
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 154
Регистрация: 6-11-05
Из: Москва
Пользователь №: 10 515



Alechek, не думаю, что АЦП в этом случае правильно будет работать. Он или остановит весь проц, выдав 1023 или 0. Или, производя преобразования по мере включения/выключения ножки, выдаст полную лажу. Просто светодиод (т.е. глаз человека) и вольтметр - инертные приборы.

У меня есть такой вариант: отключить все прерывания, а в while(1) сделать счётчик, скажем, до 1 000 000. Посмотреть сколько времени (в тиках процессора например) выполняется миллион пустых итерация while(1) (ну и счётчика внутри).

При 100%-й загруженности проца другими функциями, функция main должна как бы "зависнуть", т.е. время выполнения = бесконечности. Т.е. время выполнения 1000000 тиков обратно пропорционально загруженности проца, но при 0-й загруженности уходит не в бесконечность, а в некоторую константу. Т.е. формула типа:
t = A / (100 - cpu_usage)
где (A / 100) - время выполнения 1000000 итераций незагруженного проца.

Как вам такой вариант? Мои рассуждения вообще логичны или нет? Или такой алгоритм не будет правильно работать?

Сообщение отредактировал Pasha 111 - Jul 21 2006, 08:47
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 21 2006, 08:57
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Pasha 111 @ Jul 21 2006, 11:30) *
а именно на реальном процессоре в реальных условиях постоянно мониторить занятость процессора (как в таск баре в windows)

Абсолюно бесполезная рюшечка - толку Вам будет от такого индикатора показывающего, что
в течении времени интеграции доступного к наблюдению человеком (сотни миллисккунд-секунды) процессор был загружен на 0 челых хреен десятых процента, если он при этом реально захлебывался несколько тактов таймера.
Практическое значение в такой системе, как Ваша (сужу по вечному циклу вместо операционной системы могущей как-то разбираться с нехваткой ресурсов) похоже может иметь только наличие фатальной нехватки времени, например (ну не сочли нужным Вы сообщить подробности) можете запрограммировав счетчик таймера на "ручной" сброс и читая/cбрасывая его в обработчике прерывания можете получить величину на которую "перетянули" остальные обработчики таймерное прерывание.
Задаете допустимые с Вашей точки зрения отступления от "временной оси" и ругаетесь на превышение.
Это явно работать будет при отсутствии ввложенных прерываний и нижайшем приоритете таймерного. В других условиях думайте сами, или формулируйте правила игры.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
KRS
сообщение Jul 21 2006, 09:12
Сообщение #12


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Pasha 111 @ Jul 21 2006, 12:33) *
KRS, Alechek, а если без внешних приборов? Чтобы была некоторая переменная, изменяющаяся от 0 до 100 и обозначающая загруженность проца?


Можно попробовать использовать таймер
при входе в прерывание, останавливать таймер, при выходе опять запускать
(можно не при выходе а в главном цикле всегда разрешать)

И потом раз в секунду например (нужен еще один таймер), можно узнать загрузку по содержимому 1 таймера (который останавливался в перываниях)

Или лучше даже наоборот, запускать таймер в прерывании, а в главном цикле останавливать, загрузка и получится!

Сообщение отредактировал KRS - Jul 21 2006, 09:15
Go to the top of the page
 
+Quote Post
Pasha 111
сообщение Jul 21 2006, 09:19
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 154
Регистрация: 6-11-05
Из: Москва
Пользователь №: 10 515



zltigo,
программа работает так: инициализируются прерывания на изменение уровня на ножках процессора, к этим ножкам подключаются энкодеры (от моторов). Т.о. при вращении двигателя возникают П-образные сигналы, и прерывание, отвечающее за обработку этих ножек, увеличивает или уменьшает счётчики (смотрит на ножки, соответствующие каналам А или Б энкодеров).
Т.о. скорость вызовов функции-обработчика прерываний всё время разная, но не меняется скачками, и моментов, когда процессор загружен на 100% в течении очень короткого времени, а в остальное на 0 с чем-то, быть не может smile.gif

Параллельно с этим, работает таймер на частоте 500 Гц. Функция обработки прерываний этого таймера смотрит на переменные, изменяемые энкодерами, и в зависимости от этого выполняет некоторые действия (слудящая, блок принятия решений и т.д.)

На самом деле в функции main() в дальнейшем должен появиться некоторый код smile.gif, так вот мне интересно, сколько ресурсов жрёт следящая, и хватит ли моего at91sam7s на выполнение той проги, которую я в main'е напишу.

P.S. И ещё параллельно с этим функция таймера отправляет данные по uart'у и вызываются прерывания переполнения буфера dma контроллера.

KRS, а это не эквивалентно тому, что я выше написал? Просто так проще smile.gif и таймер лишний юзать не надо.

Сообщение отредактировал Pasha 111 - Jul 21 2006, 09:21
Go to the top of the page
 
+Quote Post
klen
сообщение Jul 21 2006, 14:54
Сообщение #14


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Предлагаю такую вариацию решения (если есть 1 свободный таймер)
имеем один 32 бит таймера
конфигурим его так чтоб он инкрементировался по каждому такту.
при входе в прерывания его включаем при выходе выключаем. На это потребуется всего 2 такта, что можно либо учесть или забить если код прерываний большой (првда че это за прерывания тогда smile.gif )
Через 2^32/Fтакт секунд смотрим отношение числа в счетном регистре таймера к числу 0xFFFFFFFF, это и будет процент загрузки.
Go to the top of the page
 
+Quote Post
Abo
сообщение Jul 21 2006, 16:25
Сообщение #15


Частый гость
**

Группа: Свой
Сообщений: 101
Регистрация: 9-01-06
Пользователь №: 12 967



Ой, не советовал бы я энкодеры на прерывания вешать, особенно если они на моторах стоят и точность отслеживания позиции нужна на всем времени работы аппарата (в ЧПУ зануление один раз за смену обычно принято делать) и этих энкодеров несколько. Нет возможности точно указать максимальную чстоту следования импульсов, при которой не будет наблюдаться их пропусков.
Go to the top of the page
 
+Quote Post

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

 


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


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