Forum: Mikrocontroller und Digitale Elektronik lwip cJSON response


von Pascal H. (_pascal_)


Lesenswert?

Guten Abend,

ich habe auf meinem mini DK2 dev board lwip(raw) erfolgreich am laufen.
Jetzt habe ich ein paar Implementierungen vorgenommen welche ueber JSON 
packete angestossen werden.

Bei einem Stress Test verabschiedet sich der microcontroller allerdings 
nach ca 50 requests bei einem 0.5s intervall.

Mir ist aufgefallen dass dies nur passiert wenn ich cJSON verwende. 
Glueck im Unglueck wuerde ich sagen, dass ich lwip ausschliessen kann.

Das hier funktioniert einen Tag lang mit 0.5s intervall:
1
  char *response = "{\"name1\":\"test1\",\"name2\":\"test2\",\"name3\":\"test3\",\"name4\":\"test4\",\"name5\":\"test5\",\"name6\":\"test6\",\"name7\":\"test7\",\"name8\":\"test8\",\"name9\":\"test9\"}\0";
2
3
  tcp_write(tpcb, response, strlen(response), TCP_WRITE_FLAG_COPY);

Das leider nur ca 50 mal (ich denke iwo ein mem leak):
1
  cJSON *json = cJSON_CreateObject();
2
  cJSON_AddStringToObject(json, "name1", "test1");
3
  cJSON_AddStringToObject(json, "name2", "test2");
4
  cJSON_AddStringToObject(json, "name3", "test3");
5
  cJSON_AddStringToObject(json, "name4", "test4");
6
  cJSON_AddStringToObject(json, "name5", "test5");
7
  cJSON_AddStringToObject(json, "name6", "test6");
8
  cJSON_AddStringToObject(json, "name7", "test7");
9
  cJSON_AddStringToObject(json, "name8", "test8");
10
  cJSON_AddStringToObject(json, "name9", "test9");
11
12
  char response[300];
13
  strcpy(&response[0], cJSON_PrintUnformatted(json));
14
15
  cJSON_Delete(json);
16
17
  tcp_write(tpcb, response, strlen(response), TCP_WRITE_FLAG_COPY);

Moeglicherweise mache ich einen Fehler.
Wenn jemand eine Idee hat bitte melden :)

Gruss
Pascal

von Jojo S. (Gast)


Lesenswert?

Pascal Heinrich schrieb:
> Das leider nur ca 50 mal (ich denke iwo ein mem leak):

Dann einfach mal zyklisch den freien Heap ausgeben lassen.

von Jim M. (turboj)


Lesenswert?

Der Rückgabewert von cJSON_PrintUnformatted(json) wird nicht 
freigegeben. Dieser Pointer zeigt mit eniger Sicherheit auf Heap Memory 
und muss explizit freigegeben werden.

von Pascal H. (_pascal_)


Lesenswert?

Hey

vielen Dank ;)

habe das gerade mal umgesetzt. Es scheint jetzt stabil zu laufen.
Dachte eigentlich cJSON_Delete raeumt das alles auf. Anscheinend nicht 
so :)

1
  cJSON *json = cJSON_CreateObject();
2
  cJSON_AddStringToObject(json, "name1", "test1");
3
  cJSON_AddStringToObject(json, "name2", "test2");
4
  cJSON_AddStringToObject(json, "name3", "test3");
5
  cJSON_AddStringToObject(json, "name4", "test4");
6
  cJSON_AddStringToObject(json, "name5", "test5");
7
  cJSON_AddStringToObject(json, "name6", "test6");
8
  cJSON_AddStringToObject(json, "name7", "test7");
9
  cJSON_AddStringToObject(json, "name8", "test8");
10
  cJSON_AddStringToObject(json, "name9", "test9");
11
12
  char *response = cJSON_PrintUnformatted(json);
13
14
  cJSON_Delete(json);
15
16
  tcp_write(tpcb, response, strlen(response), TCP_WRITE_FLAG_COPY);
17
  
18
  tcp_recved(tpcb, p->tot_len);
19
20
  free(response);
21
  pbuf_free(p);

von Jojo S. (Gast)


Lesenswert?

wenn das cJSON das hier ist: 
http://www.ganimede.ro/help/abljson/files/jsonParser-p.html#cJSON_PrintUnformatted
dann steht auch ausdrücklich in der Doku was man tun soll:

Returns
The pointer of the memory zone holding the JSON string.  Don’t forget to 
free memory when done with it by calling cJSON_Free.

von Pascal H. (_pascal_)


Lesenswert?

Nein das ist nicht das gleiche.
Bei meiner Implementierung gibt es kein cJSON_Free() aber der Ansatz den 
pointer mit free freizugeben ist richtig.

Habe das irgendwie uebersehen.

http://sourceforge.net/projects/cjson/

von Jojo S. (Gast)


Lesenswert?

Danke für das Update. Ich versuche auch gerade mich mit JSON zum 
Datenaustausch zwischen uC und PC anzufreunden. Aber die Strings in 
C/C++ auseinander zu nehmen sieht nicht sehr effizient aus.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.