Arduino a alokace mista pro promenne

David Obdrzalek David.Obdrzalek na mff.cuni.cz
Úterý Říjen 29 10:23:36 CET 2019


Myslím, že tohle NENÍ dobrý způsob.

Proměnná, která se uvnitř funkce (tj. lokální proměnná) deklaruje jako static, musí 
"přežívat" po dobu, kdy neběží funkce, takže se jí někde musí vyhradit místo. 
Naopak proměnná, která není static, se vytvoří ve vhodný čas a po skončení funkce 
se zahodí. To umožňuje překladači takovou proměnnou lépe optimalizovat, protože 
mezi voláním příslušné funkce může prostor využít jinak (a mírně to může i ušetřit 
velikost programu, protože se nemusí dělat ta řežie spojená s případným ukládáním a 
znovuvyzvedáváním dat při skončení funkce a vstupu do ní).  

V principu je jedno, jestli proměnná je v RAM nebo v registru, místo zabírá tak 
jako tak, akorát když bydlí v registru, tak není potřeba ji před nějakou operací 
přesouvat z RAM do registru. To je na AVR (malé Arduino) nutné, operace se 
provádějí jen s tím, co je v registrech. Kvalitní optimalizace by tudíž to, co je 
potřeba často, měla umístit raději do registru, ať už je nebo není ta věc statická. 
Záležet ale bude na prioritách optimalizace a na tom, co všechno by se mělo držet 
někde hodně po ruce, jestli se to vůbec všechno do registrů vejde (a nevím, jaké 
jsou v tomhle směru priority gcc ani co všechno si mašinérie Arduina sežere pro 
běh).  

Pro řešení prvotního problému "budu mít brzo málo místa pro proměnné v RAM" je 
přebarvení proměnných na statické prodle mě přímo závadné. Aspoň tedy pro AVR. 
Daleko účinnější je zamyslet se předně nad textovými řetězci (což už tu padlo) a 
pak nad velikostí používaných typů proměnných, zejména pokud jde o pole - potřebuju 
pole 100 intů anebo mi stačí 100 bajtů (rozdíl: 50B)? atd. a taky nad tím, jestli 
data jsou nebo nejsou konstantní (to už tu taky padlo). Když programátor poskytne 
dostatek kvalitních informací, překladač může udělat opravdu kouzla.  

Využít programovou paměť na 100% nevadí, naopak když by globální proměnné měly 
využít dynamickou paměť na 100%, tak to je průšvih (protože pak nezbyde místo na 
zásobník a lokální proměnné, tedy na volání funkcí vč. obsluhy přerušení). Reálně 
začíná průšvih už dřív, hrubě tak kolem 3/4, ale to dost závisí na programu.  

D.O.

PS: Neplést statické lokální se statickými globálními proměnnými, to je jen poněkud
poťouchlé označení dvou úplně rozdílných vlastností.

On 24 Oct 2019 at 14:17, Jaroslav Lukesh wrote:
> dá se docela dost zbavit dynamicky alokovaného místa použitím prefixu 
> "static" na dynamicky vytvořenou proměnnou
> 
> static int pocitadlo
> 
> udělá prostor v paměti na proměnnou podobně, jako by byla definovaná na 
> začátku. Pak když to přeložíte, zjistíte, kolik všecky ty dynamicky dělané 
> proměnné ve skutečnosti berou a pak optimalizovat dál (musíte ale vědět co
> děláte, ne že to napíšete všude bezhlavě). Samozřejmě F() je pak na ráně
> jako první akce pro zmenšení místa.
> 
> Nevím, jak máte optimalizovaný překlad, používá se -oS na velikost, nebo -o3
> na rychlost. To najdete někde u parametrů platformy jak je složka arduino15, 
> to je první věc na co hrabu, takže nevím jak je to default. UECIDE to má 
> přímo jako volbu v menu.
> 
> ----- Původní zpráva ----- 
> Od: Martin Locker
> 
> RAM je potřeba na ten textový řetězec, standardně se ukládá do RAM jako 
> proměnné. Dá se vynutit jeho uložení do FLASH makrem F().
> 
> 
> Serial.println(F("Retezec ve FLASH"));
> 
> ----- Původní zpráva -----
> Odesilatel: "Jirka Mww" jirka.mww na gmail.com
> 
> nic moc náročného. Při překladu se mi ale začala objevovat hláška, že budu
> mít brzo málo místa pro proměnné v RAM , přitom jich tam zas až tolik
> není.




Další informace o konferenci Hw-list