Arduino Mega 2560 - aktuální využití paměti SRAM

Patrik
Příspěvky: 199
Registrován: 02 dub 2020, 09:58
Reputation: 0

Arduino Mega 2560 - aktuální využití paměti SRAM

Příspěvek od Patrik » 12 čer 2020, 09:43

Ahoj,

chtěl bych mít na Vás prosbu, dotaz. Jelikož jsem program překopal, ale stejně mně dochází co 3-4 dny, zcela nepravidelně k zastavení cyklování programu (někdy i dříve). Je to nežádoucí, neboť potřebuji nepřetržitý provoz... Napadlo mě vyřešit to watchdogem, ovšem bych raději zjistil chybu v programu (pokud je to tou chybou)... Třeba jestli nedochází z nějakého důvodu k přetečení paměti.... A já bych se právě chtěl zeptat, jestli je možné vypisovat aktuální stav paměti do sériové linky, abych to zjistil na monitoru (jestli se to zvedá či nikoliv).... A nejlépe bych zjistil při jaké podmínce třeba k tomu dochází... Tzn. nechal bych program běžet třeba celý den bez toho aniž by uživatel nějak chod cyklu ovlivnil (např. stisknutím tlačítka, tvoření proměnných a ukládání do pole,...) a poté pokud by stav paměti byl cca stejný po těch 24 hodinách, tak bych zkoušel právě jednotlivé podmínky.. Dalo by se to nějak takto vyřešit? Paměťovou kartu zatím nemám.

Děkuji.

mart-in
Příspěvky: 16
Registrován: 27 kvě 2020, 21:43
Reputation: 0

Re: Arduino Mega 2560 - aktuální využití paměti SRAM

Příspěvek od mart-in » 12 čer 2020, 10:35

Ahoj, kdysi jsem někde našel toto:

Kód: Vybrat vše

int freeRAM() {
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

void printFreeRAM() {
  Serial.print(F("(Free RAM: "));
  Serial.print(freeRAM());
  Serial.println(F(" B)"));
}
po zavolání fce. printFreeRAM() někde v kódu, se ti na serial monitor vytiskne volná paměť SRAM v B.

Patrik
Příspěvky: 199
Registrován: 02 dub 2020, 09:58
Reputation: 0

Re: Arduino Mega 2560 - aktuální využití paměti SRAM

Příspěvek od Patrik » 12 čer 2020, 11:23

Děkuji, funguje. Uvidíme.. Zatím mi to píše 1468 B volných.. Tak uvidíme, co to udělá za pár hodin. Jinak asi bude celkem složitější přijít na to, kde mám chybu.. Také pro to, že to zařízení nemám doma, takže mohu simulovat pouze chod kodu na arduinu... Ale nemohu načítat karty, měnit vstupy na základě zmáčknutí tlačítka,... Možná bych to rád vyřešil dočasně tím watchdogem, ale potřeboval bych restart kontroléru nejlépe co 24 hodin.. A to z důvodu, že zobrazuji i čas... Pokud bych restartoval dříve, tak by docházelo k tomu, že můj nastavený čas např. na 15:00 by samozřejmě nesouhlasil.. Tzn. potřeboval bych restart přesně v 15:00.. Jinak v průběhu chodu cyklu programu restartuji hodnoty pole 2x na výchozí hodnoty (co 12 hodin), tzv. nulování.. Takže by mně vyšlo i tohle.. Jestli mi rozumíte... Např. někdo vstoupil 6x (6x přiložil kartu), tak se o tom vede evidence, až vstoupí 10x tak se jeho karta zablokuje tím, že přičtu k uloženému číslu hodnotu 10... Po těch 12 hodinách dojde k restartu hodnot, karty které byly zablokované se odblokují odečtením čísla 10 a vynuluje se vlastně hodnota kolikrát vstoupili. Takže ten watchdog by mně zde vůbec nevadil.. Ale aby byl přesný restart co 24 hodin - jen kvůli času. Napadlo mě vytovřit nějakou podmínku, až by hodiny dosáhly 23 h, 59 minut a 59 s, tak by se provedl restart viz v podmínce. Zatím jsem zkoušel restarty pevně nadefinované (tuším, že tam byly 2 s) a to mně fungovalo bez problému. Myslíte, že je to reálné? Podle mě ano, ale obávám se, že problém bude toto - dopočítávám chybějící čas.. Normálně když běží cyklus bez vnějšího vlivu (uživatel nepřikládá kartu), tak čas běží zcela normálně.. Ale například načte kartu, tak běží jiný cyklu (cyklus uvnitř vlastně času - sekundy), kdy po dobu 40 s je možný vstup).. Např. vstoupí za 20 s, tak k sekundám přičtu 20 s.. a v případě, jestli je to vyšší než 60 > s, tak pracuji i s minutami... tohle vidím za možný problém při pravidelném restartu watchdogem.. Protože prostě by mohlo dojít na tuhle situaci: Bude čas 23:59:55 s (watchdog podmínka pro restart kontroléru bude 23:59:59)... Jenomže někdo přiloží kartu v čase 23:59:55 (vstoupím třeba za 20 s) tzn. po vstupu se zobrazí již čas 00:00:15 - tzn. restart by se neprovedl...

mart-in
Příspěvky: 16
Registrován: 27 kvě 2020, 21:43
Reputation: 0

Re: Arduino Mega 2560 - aktuální využití paměti SRAM

Příspěvek od mart-in » 12 čer 2020, 11:31

A z čeho bereš ten čas? z funkce millis()? není lepší mít samostatný RTC modul? např. DS 3231 je docela přesný a na Ebay ho seženeš do 40 Kč. Jinak vnitřní hodiny v Arduinu jsou hodně nepřesné, i několik minut za den, kdežto ten RTC modul má odchylku pár minut za měsíc. Neznám tvůj kód, ale nebylo by lepší najít problém než to řešit takhle komplikovaně? :)

Jinak mám pocit, že těch 1468B je u Mega tak na hraně správné funkčnosti.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Arduino Mega 2560 - aktuální využití paměti SRAM

Příspěvek od pavel1tu » 12 čer 2020, 14:58

Pokud za chodu programu nevzniká moc proměnných, mělo by to být v pohodě, ale to záleží na programu.
Ta hodnota ti stejně nic neřekne, tato hodnota sice ukazuje volnou paměť, ale ne její fragmentaci - na to můžeš dojet.
Koukni sem, jaké jsou možnosti "odlehčení" paměti SRAM
https://learn.adafruit.com/memories-of- ... izing-sram
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Arduino Mega 2560 - aktuální využití paměti SRAM

Příspěvek od kiRRow » 12 čer 2020, 16:44

Zajímavé čtení, díky Pavle.

Uměl by někdo přesně vysvětlit a ukázat na kusu kódu, jak úmyslně docílit fragmentování té paměti ? Tak aby se ten procesor po nějakém čase zaseknul, nebo zbláznil. Pro mě je někdy lepší se na to kouknout z druhé stránky. Co musím provést, aby se něco stalo, místo toho co nedělat, aby se to nestalo.

Jak se to dá udělat ? Rozbabrat tu paměť tak, že ačkoliv bude plná volného místa tak mi nabourá do paměti kde je stack ? ... to že mi stack nabourá do paměti lokálních funkcí a proměnných se dá udělat snadno ... moc vnořených funkcí do sebe, zacyklení rekurzivního volání funkce

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Arduino Mega 2560 - aktuální využití paměti SRAM

Příspěvek od KamilV » 12 čer 2020, 19:01

Tady to máš podrobněji i s příklady.
https://cpp4arduino.com/2018/11/06/what ... ation.html

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Arduino Mega 2560 - aktuální využití paměti SRAM

Příspěvek od pavel1tu » 12 čer 2020, 20:03

Nevím jak velký a náročný program máš,
vyzkoušej ho optimalizovat.

Třeba texty pro menu, nebo hlášky uložit do PROGMEM a klidně jako const,
pokud máš displej, použít fonty co zabírají méně paměti (pro text jen textové, pro čísla jen číselné), vyhnout se zbytečnému používání více fontů,
vyhnout se používání proměnných s dynamicky se měnící velikostí - tady vzniká nejčastěji fragmentace paměti,
využívat ve funkcích lokálních proměnných - ty uvolní paměť po ukončení funkce,
i přijímání dat po serial do nějakého buferu může paměť fragmentovat.

Stačí si o tom počíst, dost lidí vytváří tzv. zbytečné proměnné, které se použijí jen jednou nebo dvakrát za běh programu, je lepší je nepoužít a výpočet nebo něco prostě provést vícekrát.

I funkce reserve() je zajímavá.

Je toho hodně, prostě to chce nastudovat a program už od počátku psát "úsporně"

PS: Arduino nemá žádnou funkci na defragmentování paměti
PS2: už při plánování projektu musíš myslet na to, jaké potřeby tvůj program bude mít a vybrat odpovídající HW (já na středně velké projekty beru DUE, na větší už STM32)
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Patrik
Příspěvky: 199
Registrován: 02 dub 2020, 09:58
Reputation: 0

Re: Arduino Mega 2560 - aktuální využití paměti SRAM

Příspěvek od Patrik » 13 čer 2020, 10:08

Děkuji za rady. No, já si myslím, že mým největším problémem bude to, že mám hodně prvků pole.. A ty přepisuji a ukládám... Možná se to ukládá na jiné místo v paměti? A to původní se tváří, jakože je zaplněné? Dá se to ukládat na přesně vyhrazené místo v paměti? Jinak dnes po 3 dnech chodu se to zaseklo znova, ale tím stylem, že se to zaseklo zrovna v cyklu, kdy uživatel vstupoval.. Tzn. přiložil kartu a zaseklo se to v čase 20 s.. Což je samozřejmě hodně nežádoucí, neboť to zůstane otevřené trvale. Jinak máte nějaký typ, chtěl bych na displeji načítat jako by loading - když se načítá nějaká dejme tomu hra.. tak třeba aby po 5 hodinách byla polovina vyplněná a po 7 hodinách 3/4 a po 10 hodinách celý první řádek vyplněný... Rozumíte mi? :-D

Patrik
Příspěvky: 199
Registrován: 02 dub 2020, 09:58
Reputation: 0

Re: Arduino Mega 2560 - aktuální využití paměti SRAM

Příspěvek od Patrik » 13 čer 2020, 10:42

A nebo si myslím, že mi zbytečně až přes příliš zabírá v paměti (možná zrovna toto dělá problémy) pole String...

Mám pole String o 217 prvcích, kde jsou jména uživatelů... Nevím, jak bych to nahradil něčím jiným, když charem nemohu.

Ovšem rozdíly s využitím paměti jsou značné s tímto polem zbývá paměti 1468 B, ale bez tohoto pole mám hned volné místo: 5723 B.

Odpovědět

Kdo je online

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