NoteRequest Memory Leak on Swan

We just discovered a memory leak in our code but have been unable to correct it. We are using a Swan microcontroller. The leak seems to occur whenever we use NoteRequest() in the following function:

void NoteAdd (ModbusData data){

      Serial.println("Sending Data to Notecard\n");

      J *req = notecard.newRequest("note.add");
      JAddStringToObject(req, "file", "batteryCont.qo");
      JAddBoolToObject(req, "sync", true);

      J *body = JAddObjectToObject(req,"body");
      JAddNumberToObject(body, "BatV", data.batteryVoltage/100 );
      JAddNumberToObject(body, "BatV2", data.batteryVoltage2/100 );
      JAddNumberToObject(body, "BatV3", data.batteryVoltage3/100 );
      JAddNumberToObject(body, "BatA", data.batteryCurrent/100 );
      JAddNumberToObject(body, "LoadV", data.loadVoltage/100 );
      JAddNumberToObject(body, "LoadA", data.loadCurrent/100 );
      JAddNumberToObject(body, "SolarV", data.solarVoltage/100 );
      JAddNumberToObject(body, "SolarA", data.solarCurrent/100 );
      JAddNumberToObject(body, "Temp", data.temperature/100 );
      JAddNumberToObject(body, "DCC", data.dailyChargingCapacity/100);
      JAddNumberToObject(body, "TCC", data.totalChargingCapacity/100 );
      JAddNumberToObject(body, "SoC", data.stateOfCharge);
      JAddNumberToObject(body,"SoC_CC", data.stateOfChargeCC);
      JAddNumberToObject(body,"Uptime_d",data.uptime_d);
      JAddNumberToObject(body,"Uptime_h", data.uptime_h);
      JAddNumberToObject(body,"Uptime_m", data.uptime_m);
      JAddNumberToObject(body,"Days", data.runningDays);
      JAddNumberToObject(body, "Battery Status", data.batteryStatus);
      JAddNumberToObject(body, "LVP", data.LowVoltageProtection/10);
      JAddNumberToObject(body, "LVR", data.LowVoltageRecovery/10);
      JAddNumberToObject(body,"OVP", data.OverchargeVoltage/10);
      JAddNumberToObject(body,"OVR", data.OverchargeRecovery/10);
      JAddNumberToObject(body,"OTP", data.HighTempCutoff/10);
      JAddNumberToObject(body,"LTP", data.LowTempCutoff);
      JAddNumberToObject(body, "Boost", data.boostV);
      JAddNumberToObject(body, "Boost", data.equalV);
      JAddNumberToObject(body, "Float", data.floatV);
      JAddStringToObject(body,"Type",data.BatteryType.c_str());
      JAddStringToObject(body, "Mode", data.BatteryMode.c_str());
      JAddNumberToObject(body,"Discharge Status",data.dischargeStatus);
      JAddNumberToObject(body,"Test-H",data.test);
      JAddStringToObject(body,"Version", version.c_str());
      JAddNumberToObject(body, "Capacity", data.batteryCapacity);
      //JAddItemToObject(req, "body", body);
      Serial.print("Post Object RAM: ");
      Serial.println(freeMemory());


      notecard.sendRequest(req);
      Serial.print("Post NoteRequest RAM: ");
      Serial.println(freeMemory());
      //JDelete(body);
      Serial.println("-----------------------------------------------------");

}

It looks like the JSON object is created, uses 40 bytes of RAM and is later freed. However, notecard.sendRequest() uses 1950 bytes that are never freed.

Am I misusing sendRequest() / NoteRequest()?

1 Like

Hi @rfadell3

Can I get some more information about your application?

  • What version of note-arduino are you using?
  • Is this a single-threaded application?

This certainly seems odd as you are only using sendRequest() which should free the req object after the request is complete.

If you try a less complicated request such as card.status do you still observe the memory leak or is it specifically the note.add request?

Thanks,
Alex

Can you also confirm where freeMemory() is coming from? Is that your own implementation or are you calling a library?