Zatížení arduina a generování času

Uživatelský avatar
Dex
Administrátor
Příspěvky: 1526
Registrován: 16 úno 2013, 14:26

Re: Zatížení arduina a generování času

Příspěvek od Dex »

Prozrazovat nic nebudu, ale právě abych to nekomplikoval, tak jsem toto řešení ani nenabízel :)
"all your robots are belong to us"
robodoupe.cz
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Zatížení arduina a generování času

Příspěvek od daton »

No mě je celkem jasné že někdy přeteče počet milisekund od zapnutí systému sice jsem si myslel že to bude dříve jak po 50 dnech ale jo je to možné. Přemýšlím že by to šlo jednoduše obejít tak že až by nastalo 0:00 takby mohlo dojít k resetu počítadla milisekund sice by tím došlo k nějakému nepatrnému zpoždění ale určitě by to šlo. asi nějak takto
if (vterin = 0 and minut =0 and hodin =0) then cas = 0;

Ale nerozumím teto části kodu, co se tím myslí?

spike.send(); //yes, it's that easy.
pgerla
Příspěvky: 400
Registrován: 11 dub 2013, 00:17

Re: Zatížení arduina a generování času

Příspěvek od pgerla »

Daton nevymýšlej kolo. Zapoj externi RTC obvod DS 1307 a zabiješ dvě mouchy jednou ranou. Budeš mít hodiny, datum a bonus 64 bytů EEPROM. Naučíš se ovládat i2c sběrnici.
jova
Příspěvky: 361
Registrován: 16 pro 2013, 11:40

Re: Zatížení arduina a generování času

Příspěvek od jova »

daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Zatížení arduina a generování času

Příspěvek od daton »

Zdravím všechny
Ano jak jsem psal modul 1307 mám a už dříve jsem ho tam chtěl připojit ale je problém s piny na arduinu mám všechny analogové vstupy obsazené sběrem dat ze systému, musím to celé předělat z nana na megu a i tam budu muset s analogovými piny docela dost šetřit protože chci sbírat ještě další data. Ted čekám až mi přijde mega z číny, doma mám jen ještě jedno nano a tam bych mohl udělat nějaké pokusy.
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?
DavidO
Příspěvky: 1138
Registrován: 01 kvě 2013, 21:27

Re: Zatížení arduina a generování času

Příspěvek od DavidO »

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.
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Zatížení arduina a generování času

Příspěvek od daton »

Zdravím
Ano pochopil jsem a už na tom pracuji. Delay už tam nemám´, je tam kod kterého ukázku času jsem dal do vlákna o "generování času na WWW". Ale je tam jen přičtení sekundy po uběhnutí 1000milisekund a více což může být trochu nepříjemné protože to předpokládá že smyčka pojede velmi často a tedy se trefí třeba jen pár milisekund po uplynutí tisíce. To si ale nejsem jisty a ted popíši proč:
V programu využívám knihovnu pro interupt TimerOne.h. Ta zde byla proto aby se jednak řídil proces hodin (delay 1000 tam byl historicky ještě před implementací této knihovny a přerušení). Hodiny se tedy řídily podle tohoto přerušení, které bylo nastaveno na 1 sekundu. \Předpokládal jsem že interupt po sekundě bude přesný a tedy že se bude generovat sekunda naprosto přesně, odvíjená od krystalu stejně jako při funkci millis. No zřejmě vzhledem ke zpoždění programu asi ne. Ale proč jsem tam ten interupt zařadil, no chtěl jsem aby vždy v určitou dobu tedy po skončení jedne sekundy se obnovily data nasbíraná ze vstupů. V hlavní smyčce potom byl kod pro internetovou stránku a nějaké výpočty. To ale nedělalo dobrotu, stránka se zasekávala a zjistil jsem že většinou v místech kde byl kod pro stránku přerušen nějakým rozhodovacím procesem či právě výpočtem. Proto jsem nakonec veškeré výpočty přesunul do interuptu, kde se vykonaly všechny potřebné operace s daty a byly zde připraveny výsledky pro stránku načež se spustila stránka v hlavní smyčce a hodnoty už měla ve většině případů připravené. Tento způsob už způsoboval mnohem menší sekání stránky při načítání ale stejně k zásekům dochází. Refresh stránky jsem dal po 5s což obvykle stačí.
Zde mám ale mezeru protože mi není jasné co dělá arduino v době kdy kod stránky ještě nemá byt refrešován a interupt ještě nenaskočil.
U toho zasekávání stránky si myslím že to asi bude mít souvislost s tím přerušením, pokud se kod stránky začne načítat a nastaně přerušení pak se musí stránka seknout. Nepřišel jsem ale na to jak to udělat abych sesynchronizoval proces iteruptu se stránkou jedině tam interupt nepoužívat, což při funkci millis už by asi šlo.

Ještě dovětek k tomu zatížení a zkoumání strojového času dle výluk signalizovaných na výstupu. To je zajímavý nápad a asi ani ne moc náročný na přepsání nebo spíše zapsání řádků se zapnutím a vypnutím pinu. Možná by to šlo udělat přímo jako výstup na LED diodu a ta by se rozsvěcela pouze když by v kodů byl delay nebo něco podobného naopak zhasínala by se když by byla část s výpočty. Tím by bylo možné přímo opticky zjištovat jak moc je procesor v tu danou chvilku zatížený jejím pomrkáváním.
pgerla
Příspěvky: 400
Registrován: 11 dub 2013, 00:17

Re: Zatížení arduina a generování času

Příspěvek od pgerla »

hmm, praktický smysl měření "zatížení' jednočipu?

co za složitý výpočet bude jednočip dělat, aby to obsluhu zajímalo zda běží na 10, 20, 55, 120% ?

To že ho ve Vašem případě zatěžujete nevhodným algoritmen počítání času ...

I upravená verze s aktualizací po vteřině přes interní čítač je cesta do pekel. Za 50 dní bude tedy nebude měřená vteřina. Funkce IF bude porovnavat špatně :) No byl jste na to už upozorněn a stále si nedáte poradit.
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Zatížení arduina a generování času

Příspěvek od daton »

Dobrý den
Po posledním příspěvku nějak nevím zda jsem zde správně na fóru kde si lidé pomáhají s programováním případně radí s vylepšením nebo zda zde řešíme výčitky či naléhání na to či ono řešení?
Zájem o zatížení je čistě rádoby vědeckým přístupem právě o tom jak zlepšit a zefektivnit chod , případně zjistit jak moc je možné ještě čip zatížit. Možná to lze udělat i jinak či nad tím přemýšlet jinak, ale já se nad tím zamyslel z tohoto konce.
Zda je vhodné generovat hodiny pomocí vlastního kmitočtu arduina to je otázka pokud tam nechci další modul tak netuším jak by se to dalo zařídit jinak. Z webu se mi to zatím sosat nepodařilo.
No a jestli mi ty hodiny půjdou po 10 dnech později o minutu či dvě mi opravdu nevadí budou tam tlačítka na seřízení prozatím mi to dělalo téměř hodinu tak že minuty to je opravdu dobrý výsledek a popravdě protože je to jen orientační čas vypovídající o délce běhu programu nemůsí být zase až tak přesný, čas je totiž v mém systému jen nevýznamnou veličinou jednou z mnoha co arduino sleduje. Ale popravdě podstatně zajímavější je otázka proč se stránky sekají a jak tomu zabránit?
pgerla
Příspěvky: 400
Registrován: 11 dub 2013, 00:17

Re: Zatížení arduina a generování času

Příspěvek od pgerla »

Z čistě vědeckého i praktického hlediska je jednočip (Atmel i jiné) jednojádrový procesor. Tedy vykonává jen JEDEN program, proces, algoritmus ...
Máteli ve funkci Loop počítání času, nemůžete ve stejném okamžiku posílat data přes TCP/IP protokol.
Protože jsou procesy co se musí zpracovat bez odkladu, byl "vymyšlen" systém přerušení - Interupt. To znamená, že se probíhající funkce (loop) pozastaví a spustí se obsluha přerušení, kterou si uživatel může napsat i sám. Pro opakující procesy má Atmega328 tři časovače spouštěcí uživatelem ovlivnitelné přerušení. Vy můžete použít Timer1 na hodiny. Pokud nebude kolidovat s knihovnou pro TCP/IP.

Zatížení hlavního procesu Loop zjistíte tak že si do proměnné budete ukládat kolikrát proběhne za stanovený čas (no a ten nejpřesněji změříte přerušením od Tineru 0/1/2) ... toť celá alchymie.
Odpovědět