Použití sériové komunikace v interruptu

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Použití sériové komunikace v interruptu

Příspěvek od ondraN » 18 bře 2020, 19:40

Trochu jsem experimentoval se sériovou komunikací v interruptu (jen tou HW, ne software serial). Obecně se to nedoporučuje, ale už není nějak popsané, zda to jde a za jakých podmínek.
Výsledek mohu shrnout následovně: Jde to, ale musí se dodržet určité podmínky.
V interruptové funkci jsou zakázány interrupty a tím je i znemožněno přijímání a vyslání znaků fyzickou linkou. Ale objektové funkce sériového portu pracují s bufferem. Samotné odeslání nebo přijímáni se provádí až po opuštění interruptové funkce. To musíme mít na paměti, pokud něco posíláme v přerušení, protože se to hned nevyšle, ale jenom zařadí nebo vyjme z fronty. Při vysílání si musíme důsledně pohlídat, zda je ve frontě místo pro znaky, co chceme vyslat (Serial.availableForWrite()). Jinak dojde k zaplnění vysílacího bufferu a bude se čekat na uvolnění, které ale díky zakázaným interruptům nenastane a program vytuhne. U čtení musíme zase kontrolovat, než budeme něco číst, zda je v bufferu nějaký znak (Serial.available()), jinak zase dojde k vytuhnutí, protože se nemůže nic přijmout.
Z toho důvodu tedy rozhodně nepoužívat jiné funkce než read(),write(),peek(). S funkcemi print() a println() opatrně, protože většinou generují více znaků a musíme mít jistotu, že se vejdou do bufferu. A nakonec, pokud v přerušení něco čteme do globálně deklarované proměnné, tak musí být typu volatile.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Použití sériové komunikace v interruptu

Příspěvek od pavel1tu » 18 bře 2020, 20:14

SUPER, díky
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Použití sériové komunikace v interruptu

Příspěvek od gilhad » 18 bře 2020, 20:47

VELKE TLUSTE VAROVANI - TENTO PRISPEVEK NENI URCEN ZACATECNIKUM - neni-li vam jasne nejake slovo ci odstavec, nezkousejte nic, dokud vam to jasne nebude. I tak se da osklive strelit do vlastni nohy.

V interruptove funkci samozrejme jde povolit a vyuzivat interrupty - coz muze mit za nasledek spoustu "zajimavych" efektu, vcetne reentrance. A samozrejme to nezpusobi ukonceni behu te funkce, se vsemi dusledky pro zbytek programu/systemu.

A HW atmegy lze pouzivat i primo, bez knihoven, ktere maji radu omezeni, aby se zacatecnici nestrelili do nohy a LEDky jim blikaly snadno a jednoduse.

Nemluve o BitBangingu, ktery lze taky uspesne provozovat.

A velikost Serial bufferu lze nastavit i vyrazne vyssi, pokud je to nezbytne.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 14 hostů