Перейти к содержанию
    

Вычисление загрузки ЦПУ на stm32h7

Может кто решал задачу с вычислением загрузки ЦПУ на stm32. И может подсказать как это делать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, Arlleex сказал:

Например, вот так.

Не работает ссылка :( Или мы им сервер обвалили :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, Arlleex сказал:

Например, вот так.

Коллеги, у всех эта ссылочка открывается?

UPD. Меня опередили.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, MrBearManul said:

Коллеги, у всех эта ссылочка открывается?

UPD. Меня опередили.

 

5 minutes ago, Сергей Борщ said:

Не работает ссылка :( Или мы им сервер обвалили :biggrin:

У меня открылась

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хмм... У меня тоже открывается. Попробуйте по словам "CPU load monitor for STM32F4xx" первой ссылкой в гугле.

P.S. Хотя да, сайт у них открывается дольше чем другие. Секунд пять уходит на получение ответа и обновление странички.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если используется какая-нибудь RTOS, можно создать задачу с самым низким приоритетом, и считать время простоя в ней. Типа такого: http://we.easyelectronics.ru/os-rtos/freertos-opredelyaem-srednyuyu-zagruzku-yadra-mikroprocessora-cpu-utilization.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, arhiv6 сказал:

Если используется какая-нибудь RTOS...

Распределение времени между задачами и нагрузка на CPU - это совершенно разные вещи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Arlleex сказал:

Хмм... У меня тоже открывается. Попробуйте по словам "CPU load monitor for STM32F4xx" первой ссылкой в гугле.

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

 

P.S. кто-нибудь может объяснить, зачем они делают

    /* Add to working time */
    WorkingTime += DWT->CYCCNT - l;
    
    /* Save count cycle time */
    t = DWT->CYCCNT;

вместо

    /* Save count cycle time */
    t = DWT->CYCCNT;
    /* Add to working time */
    WorkingTime += t - l;
    

?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Сергей Борщ сказал:

P.S. кто-нибудь может объяснить, зачем они делают...

Думаю, Ваш вариант даже лучше...

Хотя нет. Между чтениями CYCCNT может еще пройти какое-то количество тактов, и для переменной l оно должно учитываться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

56 минут назад, Arlleex сказал:

Хотя нет. Между чтениями CYCCNT может еще пройти какое-то количество тактов, и для переменной l оно должно учитываться.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Сергей Борщ сказал:

Там больше тактов на чтение CYCCNT уйдет.

Уйдет. Только они будут учтены в счет времени работы (WorkingTime). 

Вот их код без лишней требухи
image.png.6f8ade7d0475b1f28e55c359bac8ff4a.png

Зеленая область - область учета тактов, потраченных на полезную работу.
Красная зона - это область, где учитываются только такты, потраченные на сон (не берем в расчет доступ к CYCCNT).
За счет порядка чтения переменных в зеленом контуре будет учтено время выполнения этого тела, вместе с инструкциями в красной зоне.

Если сделать как Вы предлагаете
image.png.89cfef65b683a14822af0ffc4980c3b2.png

То в зону учета времени сна будут входить лишние такты, ко сну не относящиеся.
Конечно, тактов там не так много, но все-же, ИМХО, корректнее их вариантом делать.

P.S. Предложу свой вариант (на деле не проверял пока)

void GoToSleepMode(void)
{
  static u32 wtim = 0, // work  time
             stim = 0, // sleep time
             ltim = 0; // last  time
  
  __disable_irq();
  u32 prev = DWT->CYCCNT;
  __WFI();
  u32 next = DWT->CYCCNT;
  __enable_irq();
  
  wtim += prev - ltim;
  stim += next - prev;
  ltim  = next;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Блин, хотел на своем Cortex-M0 запустить - да нету в нем CYCCNT... Но, ИМХО, можно на обычном таймере замутить. Или на SysTick-е.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Неудобный какой-то метод... Обычный способ со счётчиком в низкоприоритетной idle-задаче имхо - лучше. И DWT.CYCCNT не требует....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...