digitalWrite je pomaly a ma dlouhy kod protoze ..

Odpovědět
Vladimir66
Příspěvky: 353
Registrován: 02 dub 2014, 15:30

digitalWrite je pomaly a ma dlouhy kod protoze ..

Příspěvek od Vladimir66 »

Dobre vedet (kdo to jeste nevi)
https://www.peterbeard.co/blog/post/why ... e-so-slow/

a jine zajimave clanky na tomto blogu
-V66
DavidO
Příspěvky: 1018
Registrován: 01 kvě 2013, 21:27

Re: digitalWrite je pomaly a ma dlouhy kod protoze ..

Příspěvek od DavidO »

Ano, ano.
Ono to dost souvisí s tím, že programy neběží nekonečně rychle, ale programátoři to tak často berou. Jedna věc je algoritmická stránka věci, druhá je to, jak to je ve skutečnosti vykonáváno (rychlost, odezva, přesnost...). digitalWrite je klasickou ukázkou :)
pgerla
Příspěvky: 377
Registrován: 11 dub 2013, 00:17

Re: digitalWrite je pomaly a ma dlouhy kod protoze ..

Příspěvek od pgerla »

DavidO píše: 05 lis 2017, 13:42Jedna věc je algoritmická stránka věci, druhá je to, jak to je ve skutečnosti vykonáváno (rychlost, odezva, přesnost...). digitalWrite je klasickou ukázkou :)
digitalWrite je ukázkou toho, že jazyk WIRE v Arduino IDE je navržen, aby byl blbcům vzdorný.

Jinými slovy Optimalizován pro snadné pochopení i u nováčků co si chtějí "zablikat a pohnout servem".

Jazyk si nikde nehraje na Optimalizováno pro Rychlost.

Taky je snažší napsat digitalWrite( 13, HIGH )
než si pamatovat (tuším) PortB - pin 5.
DavidO
Příspěvky: 1018
Registrován: 01 kvě 2013, 21:27

Re: digitalWrite je pomaly a ma dlouhy kod protoze ..

Příspěvek od DavidO »

Arduino (a to jak hardware, tak software) bylo navrženo tak, aby vznikl snadný nástroj pro rychlé prototypování, zaměřený na studenty bez znalostí elektroniky a programování. Tedy ne na vzdornost blbcům. Například je navrženo tak, aby nebylo potřeba vědět nic o různých portech. Místo toho má uživatel k dispozici funkce pro jednotné použití několika digitálních vstupů/výstupů a několika analogových vstupů a nemusí se starat o to, jak se konkrétně ovládají ani jaký konkrétní hardware je použit (různé AVR, ARM, Intel Quark a další). Z toho plyne, že funkce na jejich použití musejí být obecné a ty rozdíly udělat "uvnitř". A následně z toho plyne také to, že oproti přímému přístupu na konkrétní port (nebo jeho pin) nutně jsou pomalejší, ale lidi si to často neuvědomují; na to vedla ta moje poznámka o nekonečné rychlosti - je to jeden příkaz, ale trvá to dlouho. To jsou známá fakta, která si ale řada lidí nemusí uvědomit a mohou z toho být překvapeni nebo to jejich projekt ovlivní až tak, že nefunguje, což může pro začátečníky a méně znalé být velký problém. Je to potřeba opakovaně připomínat, což Vláďa dobře udělal. (pochvalu před nastoupenou jednotkou dostane při vhodné příležitosti)

Jazyk, ve kterém se Arduino programuje, se podle dokumentace jmenuje "Arduino programming language" a vychází z projektu Wiring, ale není to Wiring, i když jeho vývoj těsně sleduje (není to ani Wire - to je v projektu Arduino knihovna pro použití TWI/I2C). Wiring (a Arduino) ale ani není přesně jazyk, jako spíš prostředí a sada nástrojů ("framework"). Projekt Wiring je samostatný, pokud vím stále ho ještě udržuje Hernando Barragán, který jej rozjel za svého pobytu v Itálii 2003-4 a s Arduinem má společného právě jen to, že na tento projekt pak projekt Arduino "navázal" (oficiální formulace; přesnější i když méně příjemné by to bylo spíš "vzali to a až po delší době Barragánovi přiznali původní autorství"). Jazyk, ve kterém se to programuje, řadu "pro začátečníky nedůležitých nebo nesrozumitelných drobností" schovává, řeší je vývojové prostředí, ale je to vlastně C++. Prostředí uživatelův "sketch" (česky asi program, nevím přesně jestli je oficiální překlad) doplní a upraví a kód, který se pak skutečně překládá, je C++ a používá se k tomu běžný překladač C++. Ale to jsou jen drobné nepřesnosti, které lidi často nevnímají a až na řekněme lidský přístup k Barragánovi to není důležité (tedy aspoň pro vývoj).
DavidO
Příspěvky: 1018
Registrován: 01 kvě 2013, 21:27

Re: digitalWrite je pomaly a ma dlouhy kod protoze ..

Příspěvek od DavidO »

pgerla píše: 06 lis 2017, 17:42 Taky je snažší napsat digitalWrite( 13, HIGH )
než si pamatovat (tuším) PortB - pin 5.
A ano, s tímhle souhlasím, je to snazší.
Navíc digitální pin 13 může být na různých "Arduinech" různě. na Uno to je B5, na Mega B7, na Due PB27, Yún snad C7... a o tom to je, uživatel to má snazší, ale něco ho to "stojí".
Uživatelský avatar
gilhad
Příspěvky: 215
Registrován: 29 kvě 2015, 00:36
Kontaktovat uživatele:

Re: digitalWrite je pomaly a ma dlouhy kod protoze ..

Příspěvek od gilhad »

Na Blue Pill s stm32duino to je zase PC13 :)

Na jednu stranu je to vyrazne usnadneni pro jednoduche veci a vyrazne to zvysuje prenositelnost. Na druhou stranu se to snazi osetrit vsechny mozne problemy sveta (a obcas to prehnanou snahou muze nejake i zpusobit) a tudiz ten kod pod tim je nutne velky a kosaty a pokud se to pouziva i v knihovnach, ktere maji obdobny pristup, tak z toho vyroste docela solidni bloatware.

Ale Arduino je cilene zamereno na to byt pro uzivatele jednoduche za kazdou cenu a typicky pro blikani par diodama, pripadne pripojeni dvou jednoduchych senzoru to vic nez staci, cimz se pokryje asi tak 90% potreb skupiny, na kterou je to cileno. A to je uspech.

Pokud ovsem clovek do cilove skupiny nespada (napriklad se neucil programovat jeden semestr na humanitni skole, nebo sam tyden po vecerech), tak pochopitelne muze mit i jine naroky a na ty to cileno proste neni. Ale zase je k dispozici zdrojovy kod, cele se to (po prezvykani hlavicek .ino) v podstate preklada standardnimi nastroji, takze clovek mimo cilovku si to muze dost upravit k obrazu svemu tam, kde mu na tom zalezi (napriklad jak zminuje dotycny autor, tak v kriticke smycce nahradit digitalWrite(4, HIGH); vyrazem PORTD |= B00010000;) a jinak pouzivat prostredi, ktere "se o vsechno samo postara nejak" - napriklad tim, ze pokud zada v setup() prikaz pinMode(pwm_pin, OUTPUT); tak se mu postara, aby na tom dotycnem pinu nebezelo nic, co tam bezet nema (casovace, pwm, byl nastaveny jako output, nikoli input ...)

Nebo se muze postupne na cele Arduino vyabstrahovat a kus po kuse si to prepsat na funkce optimalizovane na rychlost na ukor blbuvzdornosti, prekladat to z prikazoveho radku a jednoho krasneho dne zjistit, ze je tam, kde by byl, kdyby nezacinal s Arduinem, ale s treba s Atmega328p, krystlem, tremi kondenzatory, jednim odporem a PCB s vytazenyma nozickama pro snadnejsi pristup. Coz by puvodni cilovka proste nedala ani za zlate kafe ze starbucku.

Takze kazdy ma moznost si to zkusit po svem, pripadne prechazet mezi svety "easy and slow" Arduina a "fast and hard" AVR po libosti.

Me napriklad na prvnich par pokusu Arduino stacilo, pak me zacal chybet textovy editor a komfort prikazove radky, takze jsem presel na Vim a Makefaile od sudara a tak nejak pozvolne si driftuju k primemu pouzivani portu a preruseni a jinych vychytavek, ale pro rychle prototypovani mi arduino knihovny dosud staci - nahodim ideu, zkusim, co to dela a kdyz to v podstate jde dobre, jen hrozne pomalu, tak se podivam, co se s tim deje dole a pripadne nektere casti prepisu.

(treba ted se chystam ve sve klavesnici misto cyklu prez 8 pinu predratovat zapojeni a cist to naraz jako jeden byte z portu, s tim, ze se mi vlastne zmeni jen jedna deklarace promenne a jeden blok kodu nahradi jeden prikaz prirazeni. Cela omacka okolo, jako vyhodnocovani zmen a debouncing a rozklicovavani tlacitek zustane stejny, protoze to jsou jen vypocty a ty cecko docela umi dobre a pritom je to to same jak v arduinu, tak v cistem cecku)

A treba pripojeni i2c displeje 16x2 je fajn, ze jsem mohl neco nekam jednoduse psat, ale kdyz se podivam do te knihovny a na zapojeni, tak mi jde mraz po zadech, protoze na zarolovani jednoho radku 16 znaku tam ted je radove prez 100 i2c packetu, kde by stacil jeden. A clovek se pak divi proc je to tak pomale :) No, aby se to psalo ryhle prece - jen pridam knihovnu a poslu par zprav objektu a ono to neco nejak samo. Ted se chystam to LCD predelat, ze (prakticky za cenu i2c-lcd konvertoru) tak dam primo jedno arduino, tranzistor, odpor a potak a budu to mit jako chytre i2c zarizeni s prislusnou knihovnou pro snadne ovladani (tedy (takrka) kompatibilni se standardni, ale s dalsima vychytavkama navrch), ktere navic bude to LCD ovladat prez 8 pinu, ne prez 4 (a tudiz mnohem rychleji) a vsechny delaye pro castovani komunikace s LCD a nutne 3-4 inicialkiace si odbude ve vlastni rezii a na i2c bude prebirat packety zrcadlici primo to rozhrani - tedy 1 packet misto 100 a jeste to bude samo cachovat, aby byl zapis co nejrychlejsi.

Navic to dovoli pouzivat i2c na plnou rychlost co zvladne arduino, nikoli jen na zakladni 100.

Ale jako "proof of concept" to nabastlit za jeden vecer v Arduino kodu a na breadbordu a videt, ze to nejak funguje to bylo fajn, udelat to "poradne" bude prace na par tydnu a s pajeckou v ruce, ale vim ze cil je dosazitelny a jake zadrhele cekat a jak to chci dal rozvijet.

Proste brat si z obou svetu to lepsi a vyhodne to zkombinovat :)
Odpovědět