Как уменьшить использование процессора из собственных программ на C - PullRequest
0 голосов
/ 03 июля 2019

Пользовательская программа C использует процессор на 200% на моем RPi3 +.Я заметил это, потому что я задавался вопросом о высокой температуре.

Я проверил свой другой Pis с другими собственными написанными C-программами.Почти то же самое: загрузка процессора 100% (Pi3, но без плюса).Когда я убиваю / останавливаю только эту программу, загрузка процессора и температура падают.

В цикле while (1) я проверяю состояние gpio (подключено к кнопке).Если он нажал, я делаю вещи в зависимости от продолжительности нажатия кнопки.Для печати образца поверх чашек или удаления / изменения данных mysql.

Я прочитал кое-что о select (), но не понял контекста или использования.Но я поняла, что замедление цикла со сном не является искусством.

...
while(1)
{
   if (digitalRead(butPin)) // Button is released if this returns 1
   {
       digitalWrite(ledPin, LOW);     // Regular LED off
   }
   else 
   {
      //evalute button press
      ......
   }
...

Все работает нормально, и пи обычно быстро реагирует.Но для этой легкой работы пи слишком жарко.Поэтому ему также нужно слишком много энергии.

РЕДАКТИРОВАТЬ:

Первая попытка: добавьте usleep () в конце while (1)

thisуменьшить загрузку процессора, но не до низкого уровня.

usleep(0) => 200%

usleep(5) => 111%

usleep(100) => 105%

usleep(5000) => 100%

(на Raspberry 3+)

Top RPI3 + CPU 200%

1 Ответ

1 голос
/ 03 июля 2019

Вы можете позволить ОС сэкономить ресурсы (вычислить другие вещи), сказав, что ваша программа находится в спящем режиме.

usleep(int timeInMicroseconds);

это заставит программу спать в течение времени в микросекундах.

Поскольку ваша программа учитывает, что нажатие кнопки спит в течение нескольких миллисекунд, это не должно сделать вашу программу менее эффективной в обнаружении нажатий.

Чем дольше ваша программа будет в спящем режиме, тем больше она будет высвобождать ЦП, но при этом будет меньше реагировать на обнаружение ваших нажатий (и даже не обнаруживать их, если период ожидания слишком длинный). Это баланс; некоторые проб и ошибок должны дать вам хорошую ценность.

#include <unistd.h>

while(1)
{
   if (digitalRead(butPin)) // Button is released if this returns 1
   {
       digitalWrite(ledPin, LOW);     // Regular LED off
   }
   else 
   {

   }
   usleep(5000); //Sleep for 5ms
}

Другой вариант - использовать прерывание: Прерывание с проводкойPi .

...