daton píše: ↑03 pro 2018, 12:12
Ahoj Davide
Moc si cením toho, že mi to tady tak pěkně vysvětluješ, doufám že tě to neomrzí
i když já jsem docela dost protivný s dotazy co???
Bez komentáře.
daton píše: ↑03 pro 2018, 12:12
Ale ted k tomu co jsi mi napsal. Tak že flash jako taková je pamět pro program a tedy pokud by mi docházela tak by mi nemělo F pro data k tisku nijak pomoci protože když bych to napsal před řetězec k tisku tak se to uloží do stejné paměti.... ale pomůže, velikost ve flash se zmenší což při tvém vysvětlení znamená jen jedno uloží se to nějak jinak a úsporněji (je to tak?). Protože jinak bych si to nedovedl vysvětlit.
To je pro mě zajímavé, zatím jsem na to nikdy nenarazil, ale asi si to umím vysvětlit (tak, že když to bude bez F tak se to chová jako statický řetězec, který se musí při nahrávání kódu uložit do Flash, a pak při startu okopírovat z Flash do RAM, no a to kopírování je taky kousek kódu, který se musí někam uložit. Zatímco s tím F se to uloží do Flash, ale při startu se to nikam nekopíruje, protože pak při volání toho tisku se zavolá vlastně jiná funkce, která data pro výstup nebere z RAM ale z Flash. Ta samozřejmě taky musí někde být uložená, ale nejspíš každé přepsání z "ne-F" na "F" o kousek zkrátí výsledný kód)
daton píše: ↑03 pro 2018, 12:12
Myslel jsem totiž že ty řetězce za F se neukládají do flash ale na tu eeprom což je zjevně špatná úvaha.
Ne, ukládají se do Flash a ne do EEPROM. Ta je celá k dispozici tobě.
daton píše: ↑03 pro 2018, 12:12
flash pamět je pamět do které se ukládá program
Ano, a taky hodnota proměnných, kterou při deklaraci proměnné uvedeš. Např.
int odpoved=42;
versus
int nejakaPromenna;
- tak ta univerzální odpověď na základní otázku života, vesmíru a vůbec se musí někam uložit, aby se při zapnutí napájení a startu kontroléru měla odkud vzít a dát do té proměnné (která jinak je v SRAM, jejíž obsah se bez napájení nezachová). U nejakaPromenna se to ukládat nemusí, protože pokud to je globální proměnná nebo statická lokální, z definica jazyka C++ plyne, že se bude inicializovat nulou a tak to není potřeba ukládat, a pokud to je lokální proměnná, tak je na programátorovi, aby si tam něco přiřadil sám a tedy je jedno, co tam při startu bude.
Je dělená jen "logicky", resp. že se v ní najdou jak program, tak proměnné, které jsou už při deklaraci inicializované.
daton píše: ↑03 pro 2018, 12:12
RAM je jasná v ní se - odehrává děj.. nevím jak to popsat výstižněji
Ano.
daton píše: ↑03 pro 2018, 12:12
EEPROM vypálený obsluha samotné platformy arduino
Ne. Aby se nějaká deska tvářila jako Arduino a mohl jsi programovat pomocí těch funkcí jako digitalWrite a tak, tak to zařídí IDE (nebo CLI) na tvém počítači, kdy ke tvému programu ještě přilepí všechny potřebné funkce a přeloží do strojáku pro ten který mikrokontroler. Jiná věc je, jak pak ten přeložený program dostat z počítače do toho mikrokontroleru, a na to je "bootloader", který vždycky při resetu kontroléru
(což zahrnuje jak zmáčknutí tlačítka reset, tak zapnutí napájení a nakonec i příkaz v IDE "nahraj" nebo jak se to tam jmenuje) ověří, jestli mu náhodou někdo nechce poslat nový uživatelův kód. Pokud ano, tak ho postupně přijme, uloží do Flash (od začátku) a pak ho zavolá a tvůj program se tím spustí. Ten bootloader je ale z pohledu mikrokontroleru taky program, a je to udělaný tak, že je přednahraný v paměti Flash podobně jako pak je ten tvůj program, akorát že bootloader je úplně na jejím konci zatímco tvůj program se nahrává od začátku. A v Arduino IDE ta maximální velikost programu už je spočítaná jako velikost celé Flash mínus velikost bootloaderu, čili i kdybys to využil na 100%, tak to ten bootloader nepřepíše.
daton píše: ↑03 pro 2018, 12:12
No ale stále to nevystihuje jak to že se zmenší obsah paměti když použiji to F.
Ano, nevysvětluje, ale jak jsem psal výše, nějakou ideu mám. Pošli mi (asi soukromě) celý ten kód a budu třeba moct tu ideu potvrdit nebo vyvrátit a přijít na jinou.
daton píše: ↑03 pro 2018, 12:12
A ještě jeden dotaz
a pokud neuděláš nějakou kravinu s příliš hlubokým zanořením funkcí,
tohle jak jsem pochopil je když uděláš if v if a dalším if a pak ještě v jenom if tedy se zanoříš 3x. Toto jsi měl na myslí? A jak to tedy zamotá programu hlavu? Je jasné že si musí pamatovat odskok vyřešit podmínku ale ne ona má další odskok a tak dál. to znamená nechat v ram určitou část kodu a začít pracovat s další v odskoku a pak ještě další .. tak jsi to mysle? Je to tedy záběr pro RAM protože se rychle zaplňuje a mohla by přetéci. Normální PC by si obsah ram hodilo do odkládacího prostoru na disk ale co arduino? Také má takovýto prostor (tedy něco jako v linuxu SWAP)?
Dík za vysvětlení
Nene, ifů můžeš nořit kolik chceš. Tam je jasně dané strukturou kódu, kam se má jít, když podmínka je splněná a kam když ne a hlavně čím se má pokračovat potom. Problém je ve volání funkcí (jako je třeba setup nebo loop nebo jiné funkce z knihovny (třeba to println) anebo i libovolná jiná, kterou si sám napíšeš). Tam se musí zapamatovat, kde se má po skončení té funkce pokračovat, a to nemůže vědět ta funkce, protože když ji voláš ze dvou různých míst, tak ta funkce by nevěděla, na které se pak má vrátit. Takže se musí někam uložit "návratová adresa" a to je to, co žere RAM. Zatímco u toho ifu se nikdy "nechodí dovnitř z různých míst".
Kromě toho se taky někam musejí uložit parametry (argumenty) té funkce. Tam to je v případě gcc pro AVR (tj. překladač, co používá Arduino) šikovně udělané, že když jich je málo, tak to místo v RAM nezabírá protože se předají přes registry, ale když jich je hodně nebo to jsou třeba pole nebo tak, tak se zase musejí uložit někam do RAM.