daton píše:Ale ještě bych se rád vrátil k tomu zatížení procesoru. Jak by se dalo poznat jak moc je arduino vytíženo a na kolik mu ještě zbývá výpočetní výkon, kromě toho že bych tam spustil nějaký speciální program? Chtěl bych vědět jak moc ho stávající program zatěžuje a nemyslím tím obsazení RAM paměti, která asi bude největší brzdou. Lze to vůbec nějak rozumně udělat a zkoušel to už někdo?
Je třeba si uvědomit, že to je oproti PC slaboučký mikrokontroler bez operačního systému. Jeho "výpočetní jádro" stejně jako v každém jiném procesoru buď vykonává nějakou instrukci, anebo je vypnuté (např. uspané), ale oproti třeba PC s Windows/linuxem/MacOS/... tu není ta vrstva operačního systému, která se stará o takové ty věci jako pouštění uživatelských procesů, přepínání, měření výkonu atd.. Navíc v případě Arduina je vypnutí procesoru velmi znepříjemněné, až téměř nemožné (= jde to ale ne jen tak).
Takže jádro pořád vykonává nějaký kód, tj., postupně jednotlivé instrukce, i kdyby to bylo plané vykonávání instrukce NOP (instrukce co nic nedělá, jen trvá nějaký čas).
Když něco napíšeš do loop, tak se ty vykoná a až funkce loop skončí, zase ji to za malou chvilku zase zavolá ("nad" loop je jen nějaká drobná obsluha hardwaru). Pokud chceš vědět něco jako zbylý výpočetní výkon, tak si spočítej všechny delay(), které v loop voláš, to vynásob počtem vykonání loop za třeba minutu, přičti naměřená všechna tvá aktivní čekání na nějakou událost (typu čekání na zmáčknutí tlačítka apod.) a všechna čekání vzniklá v nějakých knihovnách (např. příjem,/posílání dat po seriové lince) a to všechno dohromady je strojový čas, který nevyužíváš. Případně navrch zvaž, jestli by nestačilo vykonávat hlavní smyčku méně často. Pokud to ze zdrojáku programu nevidíš, tak bys to mohl udělat třeba prakticky tak, že by sis před každým zavoláním jakéhokoli čekání nahodil na log. 1 nějaký pin, po návratu shodil na 0 a nějakým externím zařízením (hodiny, data logger, osciloskop) měřil, jak se ti nasbírá za určitý čas doba, kdy to bylo v log. 1 (plus doba toho nahazování a shazování, která by se neměla zanedbat, pokud to je často). Ovšem využít tenhle čekáním promrhaný čas by vyžadovalo v podstatě zásadní předělávku programu, resp. jeho celé koncepce a to není snadná věc.
Řešení, které jsem navrhoval, ti umožní využít libovolné procento výpočetního výkonu pro cokoli. RTC fakt nejsou potřeba, natož když bys musel zjišťovat, jak se takový modul používá. Nebude to zbytečně čekat a když se to jednou za čas dostane k tomu kusu "a ted aktualizace času" tak to v tu chvíli čas sesynchronizuje skoro podle skutečnosti, ať už to je 1000x za vteřinu nebo jednou za 50 dní. A to proto, že kromě toho, že se tam už nevolá delay{1000), tak se to ani nemusí vykonat jednou za vteřinu, protože to zvládne i delší "časoskok" - kdykoli se to zavolá, tak si to čas posune o tolik, kolik uteklo od minule (a ne jen o právě jednu vteřinu).
Troufám si na základě tvého prvního příspěvku v tomto vlákně tvrdit, že ve tvém programu bys tímhle ušetřil 99.3% strojového času, tedy jestli se ti hodiny denně zpožďují o těch 10 minut, protože těch 10 minut za celý den je právě a jen to, co se použije na vykonání nějakého smysluplného kódu.