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

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, 12:11

Zkusím to pole String úplně odstranit.. Ty jména zas tak důležitá nejsou, ale bylo by fajn, kdyby mohla být zobrazena.. Tzn. Teď budu mít místo 1468 B skoro 6 KB volných.. Alespoň uvidím, jak dlouho to pojede... Jinak.. Chtěl jsem se zeptat, neboť jsem na Internetu četl, že String je velký problém I z hlediska plýtvání paměti, ale zajímalo by mě, jak může dojít k přetečení paměti, když je jednou ten String uloženy a už se s ním nijak nemanipuluje? Nemělo by to zabírat přesně místo v paměti a "nepreukladat se?" ty prvky pole (jména) vypisuji na LCD displej

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 » 13 čer 2020, 12:29

A když do toho string nezapisuješ, jen z něj čteš, proč jej nemáš v progmem ?

Nakonec zjistíme že to po úpravách narvem do UNO ;)
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 » 13 čer 2020, 12:48

To o tý fragmentaci je uplně úžasný ...

To co se nikdy nemění, uložit natvrdo do progmem flash paměti. Pokud potřebuji pracovat s stringem co má 10-100 znaků, tak si na to vyrezervovat pevně kus paměti ... právě na 100 znaků.
Takže jména mít natvrdo ve flash, v programu mít rezervu na 16znaků pro aktuálně zobrazené jméno. (beru to z toho že předpokládám že na řádek displeje se vleze 16 znaků)

Když si vytvoříš za běhu proměnou s 10znaky, zabere nějaké místo, pak si za ni uložíš další proměnnou a těch prvních 10znaků smažeš. Když v ten moment vytvoříš proměnnou s 11znaky, tak zabere místo až za tou druhou proměnnou, protože se do díry po 10znacích nevleze. Pak uložíš 2byte, ty se do tý díry vlezou, tak ji zmenší na 8znaků ... alokuješ dalších 9znaků a ty se uloží zase na konec ... a tak to krásně a nenápadně bobná až do doslova a do písmene vyskypí jako mléko :D ........ doufám že jsem to pochopil, když to tady vysvětluji :D

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 » 13 čer 2020, 14:00

Jak už tady bylo řečeno, pokud se data nemění tak jednoznačně uložit do flash pomocí progmem. Pokud se mění tak já osobně bych radši šel do dvourozměrného pole charů konstantní délky. Stringy používám jen někdy a to jen proto, že se s tím lépe pracuje, ale v naprosté většině případů je to zbytečné.

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 » 13 čer 2020, 14:38

No jak jsem pochopil já :
Pokud potřebuji pracovat s daty, jenž mají dynamický rozměr a znám jejich maximální velikost ... musím si na to vymezit prostor manuálně ... pevně určené místo v paměti, kde to bude ... když to nechám dělat dynamicky, tak se mi může stát, že jednou za měsíc ten prostor vlivem běhu programu nabourá do prostoru kde se ukládají informace o tom kde ten procesor byl a kam se má vrátit. Což jako je fatal error.

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 » 13 čer 2020, 22:20

kiRRow píše:
13 čer 2020, 14:38
No jak jsem pochopil já :
Pokud potřebuji pracovat s daty, jenž mají dynamický rozměr a znám jejich maximální velikost ... musím si na to vymezit prostor manuálně ... pevně určené místo v paměti, kde to bude ... když to nechám dělat dynamicky, tak se mi může stát, že jednou za měsíc ten prostor vlivem běhu programu nabourá do prostoru kde se ukládají informace o tom kde ten procesor byl a kam se má vrátit. Což jako je fatal error.
Ano, ale jen pokud bude zbývat málo paměti,
dnes jsem to testnul, uložil jsem v pohodě v UNO skoro 3kB jmen do PROGMEM, v pohodě je vyčítám.
Paměť SRAM je z 90% volná.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

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

Příspěvek od ondraN » 14 čer 2020, 06:54

Pokud má běh programu být dlouhodobě spolehlivý, na MCU s tím málem paměti co mají, měl by se člověk naprosto vyhnout veškerému dynamickému alokování RAM. V klasickém C funkcím malloc a free. V CPP už je to horší, protože spousta různých objektů si alokuje paměť dynamicky a většina uživatelů to vůbec netuší. Viz ta třída String, která to musí ale dělat již z podstaty.

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

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

Příspěvek od gilhad » 14 čer 2020, 13:36

Tak nemyslim, ze by se clovek mel dynamickemu alokovani pameti vyhybat, jen se to musi delat rozumne, jako cokoli, kdyz pracujes s omezenymi zdroji. Mnohdy je to naopak jedina cesta, jak se do te omezene pameti vejit - pouzivat ji jen kdyz je potreba a kdyz neni potreba v dane funkci, tak ji uvolnit pro funkci jinou. Ostatne proto je lepsi misto globalnich promennych pouzivat lokalni, kdekoli to dava smysl, opet se na te same posici RAM muze vystridat v prubehu vypoctu spousta promennych a nemuseji kazda zabirat RAM samostatne.

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 » 14 čer 2020, 17:15

Souhlasím, dynamické alokování je potřeba a je v některých případech výhodné,
ale jak se píše výše - musí se zase hned vyprázdnit - ideální je proto vytvořit "malou" funkci, kdy alokujeme podle potřebných dat, data přijmeme, zpracujeme a s opuštěním funkce paměť uvolníme.

Ale opět je to tu dohadování o voze a koze, když není k dispozici zdroj.
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 » 15 čer 2020, 21:14

Ahoj,

omlouvám se za pozdní odpověď. Děkuji za rady, řeším to uložením do flash paměti (PROGMEM). Dále budu nad tím pracovat další dny, tak podám bližší informace. Děkuji za rady. :-)

Odpovědět

Kdo je online

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