Stránka 2 z 2

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

Napsal: 13 čer 2020, 12:11
od Patrik
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

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

Napsal: 13 čer 2020, 12:29
od pavel1tu
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 ;)

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

Napsal: 13 čer 2020, 12:48
od kiRRow
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

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

Napsal: 13 čer 2020, 14:00
od mart-in
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

Napsal: 13 čer 2020, 14:38
od kiRRow
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.

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

Napsal: 13 čer 2020, 22:20
od pavel1tu
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á.

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

Napsal: 14 čer 2020, 06:54
od ondraN
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

Napsal: 14 čer 2020, 13:36
od gilhad
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.

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

Napsal: 14 čer 2020, 17:15
od pavel1tu
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.

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

Napsal: 15 čer 2020, 21:14
od Patrik
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. :-)