Arduino Mega - memmory leak

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
schamann
Příspěvky: 9
Registrován: 18 lis 2017, 22:54

Arduino Mega - memmory leak

Příspěvek od schamann » 18 lis 2017, 23:53

chtel bych se zeptat zkusenejsich na praci s pameti.

obecne:
na Arduinu Mega pracuji s dlouhymi stringy. rad bych nasel optimalni zpusob prace.
pro zjednoduseni arduino mega ma 4k RAM

String1 ma 1200 znaku
String2 ma 1200 znaku

1, rad bych se zeptal jaky je rozdil (co v pameti probiha) mezi String1 = String1 + String2 (to vim...) a String1.concat(String2) (to nevim)
2, jak sloucit dlouhe stringy "optimalne" tedy, aby nedoslo k preteceni vyhrazeneho prostoru, kdyz mam na konkretni string udelany String1.reserve(2400) a String2.reserve(1200)? zbytek pameti pochopitelne potrebuju na jinou praci - dokazu se pohybovat v tom 3600 prostoru nebo musim ven?

po 1+2 mi to pise blbosti a to chapu, ale po 1.concat(2) mi to zamrzne a nemuzu to ani debugovat, tak patram co se deje.
na promennne typu String v zasade netrvam.

Dik.

zbysek
Site Admin
Příspěvky: 125
Registrován: 22 úno 2017, 15:18

Re: Arduino Mega - memmory leak

Příspěvek od zbysek » 21 lis 2017, 22:38

Dobrý den,
String je objektový datový typ, nad kterým jsou definované jak různé metody (např. concat), tak přetížené operátory (+).

Pokud byste si chtěl počíst, jak je String implementovaný, tak vás odkáži sem: https://github.com/arduino/Arduino/blob ... String.cpp.
Na řádku 263 je definovaná metoda concat, kterou dále používají všechny další přetížené funkce concat i přetížený operátor +.

Ve vašem případě by už mohl být problém v tom, že začíná docházet RAM paměť. Všechny lokální proměnné se tuším vytvářejí na RAM paměti. Pokud zaplníte 3600B prostoru z 4kB, už by mohl nastat problém s nedostatkem místa.

Zkuste se podívat na možnost práce s daty uloženými ve Flash paměti Arduina https://www.arduino.cc/reference/en/lan ... s/progmem/.

schamann
Příspěvky: 9
Registrován: 18 lis 2017, 22:54

Re: Arduino Mega - memmory leak

Příspěvek od schamann » 22 lis 2017, 22:17

To ja samozrejme vim, ze dochazi pamet. mozna jsem to mel napsat jinak:
lze pri slouceni dvou dlouhych retezcu String pouizt nejakou funkci ktera prida string2 do promenne String1 v oblasti vyhrazenych pomoci reserve?

+ concat i && vyleze ven, a snazi se to udelat ve volne pameti a pak to zase vrati do puvodniho rezervovaneho mista. proto to spadne. (teda alespon takhle si myslim, ze to ve skutecnosti je)

premyslim treba tak ze udelat pole1[2400] a treba v cyklu pridavat po byte z pole2[1200] ? nebo cokoliv jineho me momentalne totiz nic konstruktivniho nenapada co bz netrvlo "vecnost".

schamann
Příspěvky: 9
Registrován: 18 lis 2017, 22:54

Re: Arduino Mega - memmory leak

Příspěvek od schamann » 22 lis 2017, 22:22

a diky za cteni - progmem znam, usetri hodne mista :)

zbysek
Site Admin
Příspěvky: 125
Registrován: 22 úno 2017, 15:18

Re: Arduino Mega - memmory leak

Příspěvek od zbysek » 22 lis 2017, 23:23

Nic jiného, než pole znaku me taky nenapadá. Když to zkombinujete s uložením zdrojových stringů pomoci PROGMEM, tak by to mohlo být poměrně optimální řešení.


Sent from my iPhone using Tapatalk

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host