Помогите найти утечку памяти

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем Joshua, 11 ноя 2017.

  1. Joshua

    Joshua Нерд

    сразу прошу прощения за немного офтопик

    но node.js ближе по концепции к espruino чем к теме raspberry.Pi

    Код (Javascript):
    //read gpio state
    var onoff = require('onoff');
    var Gpio = onoff.Gpio,
      relayIn1 = new Gpio(2,'out' );
      relayIn2 = new Gpio(6,'out' );

    // пороги макимального и минимального значения температуры
    var maxTemp = 28;
    var minTemp = 23;

    //LCD part

    var LCD = require('lcdi2c');
    var lcd = new LCD( 0, 0x27, 20, 4 );

    //lcd.createChar(0,[0x18,0x18,0x3,0x4,0x4,0x4,0x3] );

    lcd.on();
    //lcd.setBacklight();

    lcd.clear();
    lcd.home();

    function run() {
      var valueL=1;
      var valueF=1;

      var ip = require('ip');
      var ds18b20 = require('ds18b20');

     
      var light = 'Light ON ';
      var fito = 'Fito ON'



      now = new Date();
      var time1 = now.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit', hour12: false});
      var date1 = now.toLocaleDateString([], {month: 'short',day: 'numeric', year: 'numeric'});
      var myip=ip.address();
      valueL = (relayIn1.readSync()) % 2;
      valueF = (relayIn2.readSync()) % 2;
      if (valueL==0){
        light = 'Light ON ';
      }
      else light = 'Light OFF';


      if (valueF==0){
        fito = 'Fito ON ';
      }
      else fito = 'Fito OFF';


     
      var temp = ds18b20.temperatureSync('28-041663a8bcff')
     

       if (temp>=maxTemp){
         lcd.println( '    WATER IS HOT!    ' , 4);
       }
       else if (temp<=minTemp){
          lcd.println( '   WATER IS COLD!     ' , 4 );
       }
       else {
            lcd.println( 'IP= '+myip + '   ', 4 );
       }

    lcd.println( date1 + ' ' + time1 + '  ', 1 );
    lcd.println( light + ' | ' + fito, 2 );
    lcd.println( 'Aqua Temp C = '+ temp + '     ' , 3 );
     
    setInterval(() => run(), 100);
    };

    run();

    /*
    function lcdError( err ) {
        clearInterval( int1 );
        console.log( 'Unable to print to LCD on bus 1 at address 0x27. Error: ' + JSON.stringify( err ) );

    };
    */



     
    после запуска прога память кушает прямо как не в себя... и после 5-7 часов работы выгружается

    где косяк?
     
  2. rkit

    rkit Гуру

    Устанавливаете интервалы по экспоненте.
     
    sys нравится это.
  3. Joshua

    Joshua Нерд

    а как надо сделать правильно?
     
  4. ИгорьК

    ИгорьК Гуру

    Не уверен до пяток в том что говорю, но полагаю косяками две вещи:
    • рекурсивный вызов функции таймером внутри себя;
    • вызов опроса ds18b20 чаще секунды.
    Избавляйтесь от обоих и должно заработать.

    Вытащите из функции run строку setInterval и сделайте ее самой последней в скрипте:
    Код (Javascript):
    setInterval(run, 1000);
     
    Последнее редактирование: 12 ноя 2017
    Konkery и sys нравится это.