Arduino Mega 2560 - aktuální využití paměti SRAM
Re: Arduino Mega 2560 - aktuální využití paměti SRAM
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
- 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
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
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"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Arduino Mega 2560 - aktuální využití paměti SRAM
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 ........ doufám že jsem to pochopil, když to tady vysvětluji
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 ........ doufám že jsem to pochopil, když to tady vysvětluji
Re: Arduino Mega 2560 - aktuální využití paměti SRAM
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é.
Re: Arduino Mega 2560 - aktuální využití paměti SRAM
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.
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.
- 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
Ano, ale jen pokud bude zbývat málo paměti,kiRRow píše: ↑13 čer 2020, 14:38No 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.
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"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Arduino Mega 2560 - aktuální využití paměti SRAM
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.
Re: Arduino Mega 2560 - aktuální využití paměti SRAM
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.
- 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
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.
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"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Arduino Mega 2560 - aktuální využití paměti SRAM
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.
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.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 27 hostů