|
Как определить загруженность процессора, при выполнении программы? |
|
|
|
Jul 21 2006, 08:12
|
Участник

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

|
Цитата(Pasha 111 @ Jul 21 2006, 11:01)  Есть программа, вот с такой функцией main: void main() { Init(); while(1) ; }
Вся остальная программа выполняется по срабатыванию прерываний от ножек процессора и таймера, работающего на частоте 500 Гц. Вопрос: как определить, например в процентах, какая часть процессорного времени уходит на выполнение кода, кроме while(1) в main'е. В кейловском симуляторе (если есть возможность запустить в нем) можно посмотреть процент выполнения модулей и отдельных функций.
|
|
|
|
|
Jul 21 2006, 08:28
|

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

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

Частый гость
 
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jul 21 2006, 08:57
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jul 21 2006, 09: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
|
|
|
|
|
Jul 21 2006, 09:19
|

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

|
zltigo, программа работает так: инициализируются прерывания на изменение уровня на ножках процессора, к этим ножкам подключаются энкодеры (от моторов). Т.о. при вращении двигателя возникают П-образные сигналы, и прерывание, отвечающее за обработку этих ножек, увеличивает или уменьшает счётчики (смотрит на ножки, соответствующие каналам А или Б энкодеров). Т.о. скорость вызовов функции-обработчика прерываний всё время разная, но не меняется скачками, и моментов, когда процессор загружен на 100% в течении очень короткого времени, а в остальное на 0 с чем-то, быть не может  Параллельно с этим, работает таймер на частоте 500 Гц. Функция обработки прерываний этого таймера смотрит на переменные, изменяемые энкодерами, и в зависимости от этого выполняет некоторые действия (слудящая, блок принятия решений и т.д.) На самом деле в функции main() в дальнейшем должен появиться некоторый код  , так вот мне интересно, сколько ресурсов жрёт следящая, и хватит ли моего at91sam7s на выполнение той проги, которую я в main'е напишу. P.S. И ещё параллельно с этим функция таймера отправляет данные по uart'у и вызываются прерывания переполнения буфера dma контроллера. KRS, а это не эквивалентно тому, что я выше написал? Просто так проще  и таймер лишний юзать не надо.
Сообщение отредактировал Pasha 111 - Jul 21 2006, 09:21
|
|
|
|
|
Jul 21 2006, 14:54
|

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

|
Предлагаю такую вариацию решения (если есть 1 свободный таймер) имеем один 32 бит таймера конфигурим его так чтоб он инкрементировался по каждому такту. при входе в прерывания его включаем при выходе выключаем. На это потребуется всего 2 такта, что можно либо учесть или забить если код прерываний большой (првда че это за прерывания тогда  ) Через 2^32/Fтакт секунд смотрим отношение числа в счетном регистре таймера к числу 0xFFFFFFFF, это и будет процент загрузки.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|