Ahoj,
existuje nějaké obecné doporučení na množství volné ram co je potřeba mít v arduinu volnou? Pokud píšu na Arduino s 2kB RAM program a mám už jen 200byte volných. Jak moc riskuju?
Díky za odpovědi.
Arduino a doporučená volná ram
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
- pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
- Kontaktovat uživatele:
Re: Arduino a doporučená volná ram
Asi neriskuješ nic, co by jsi riskoval
Pokud to chápu že RAM nebude stačit, kompilátor to stopne a nenahraje se to
Pokud to chápu že RAM nebude stačit, kompilátor to stopne a nenahraje se to
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Arduino a doporučená volná ram
No ono prý riziko existuje pri nejake fragmentaci pameti. Snad to pry vznika pokud se napriklad ukladaji do string promene ruzne dlouhe retezce.
Existuje nejaky rychly "arduino simulator" u ktereho se daji simulovat ruzne vstupy a tim zrychlene testovat arduino program napr proti preteceni?
Existuje nejaky rychly "arduino simulator" u ktereho se daji simulovat ruzne vstupy a tim zrychlene testovat arduino program napr proti preteceni?
Re: Arduino a doporučená volná ram
Dobrý den,
ono hodně závisí na programu.
Pokud se v programu nevyskytují dynamicky alokované datové struktury (pole, objekty, ...), tak se nemáte čeho bát. Jen pozor na to, že i když vy žádnou takovou strukturu nevytváříte, může se toto dít v použitých knihovnách.
Pěkným příkladem objektu, který mění svoji velikost za běhu programu, je String. Občas nevíte, jestli má nějakou maximální délku a může se tak stát, že už se do RAM nevyjde (třeba načítáte něco ze sériové linky, přijímáte data z wifi, ...).
Druhou skupinou, kde je potřeba si dát pozor, jsou funkce - jejich parametry a lokální proměnné při zavolání také zabírají nějakou RAM. Potom záleží, kolik má funkce parametrů, kolik lokálních proměnných používá, jaké typy mají apod. Žroutem RAM jsou i rekurzivně volané funkce.
Pokud je ale nedostatek paměti způsobených tím, že máte v programu hodně proměnných, popřípadě velká pole apod., u kterých zároveň znáte jejich velikost (jsou alokované staticky), popřípadě přesně víte, kdy voláte funkce, jestli se tyto funkce nějak navzájem volají a kolik maximálně potom zaberou jejich lokální proměnné a parametry, tak bych se toho nebál.
Kupříkladu pole byte[2000] zabírá většinu z 2kB paměti, ale nehrozí u něj, že se "nafoukne" mimo povolenou velikost - bude mít vždy 2000 bytů.
Možná by stálo za zkusit v programu najít místa, která zabírají hodně paměti, ale zároveň se při běhu programu nemění - jsou to často například velká pole. Ty je pak možné přesunout mimo RAM do oblasti dat programu pomocí PROGMEM.
ono hodně závisí na programu.
Pokud se v programu nevyskytují dynamicky alokované datové struktury (pole, objekty, ...), tak se nemáte čeho bát. Jen pozor na to, že i když vy žádnou takovou strukturu nevytváříte, může se toto dít v použitých knihovnách.
Pěkným příkladem objektu, který mění svoji velikost za běhu programu, je String. Občas nevíte, jestli má nějakou maximální délku a může se tak stát, že už se do RAM nevyjde (třeba načítáte něco ze sériové linky, přijímáte data z wifi, ...).
Druhou skupinou, kde je potřeba si dát pozor, jsou funkce - jejich parametry a lokální proměnné při zavolání také zabírají nějakou RAM. Potom záleží, kolik má funkce parametrů, kolik lokálních proměnných používá, jaké typy mají apod. Žroutem RAM jsou i rekurzivně volané funkce.
Pokud je ale nedostatek paměti způsobených tím, že máte v programu hodně proměnných, popřípadě velká pole apod., u kterých zároveň znáte jejich velikost (jsou alokované staticky), popřípadě přesně víte, kdy voláte funkce, jestli se tyto funkce nějak navzájem volají a kolik maximálně potom zaberou jejich lokální proměnné a parametry, tak bych se toho nebál.
Kupříkladu pole byte[2000] zabírá většinu z 2kB paměti, ale nehrozí u něj, že se "nafoukne" mimo povolenou velikost - bude mít vždy 2000 bytů.
Možná by stálo za zkusit v programu najít místa, která zabírají hodně paměti, ale zároveň se při běhu programu nemění - jsou to často například velká pole. Ty je pak možné přesunout mimo RAM do oblasti dat programu pomocí PROGMEM.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 51 hostů