CAN: arbitráž bez kolize a bit stuffing
CAN vznikl u Bosche v roce 1986 pro auta a je to jediná sběrnice v téhle kapitole, která byla od začátku navržená pro prostředí, kde to ruší a kde na zprávě záleží. Dvě věci v něm stojí za pochopení, protože obě jsou chytré.
1. Arbitráž: dva uzly začnou naráz a nic se neztratí
Na Ethernetu se při kolizi obě strany odmlčí na náhodnou dobu a zkusí to znovu. Na CANu ke kolizi nedojde, protože sběrnice je nesymetrická: nula přebíjí jedničku. Kdo vysílá jedničku a na sběrnici vidí nulu, ví, že vysílá někdo důležitější, a okamžitě zmlkne.
Důsledky jsou dva a oba jsou velké:
- Priorita je pevná, daná číslem zprávy. Nižší identifikátor = vyšší priorita. To se dá spočítat dopředu, a proto se dá u CANu dokázat, že se zpráva stihne — na Ethernetu ne.
- Nic se nezahazuje. Vítěz pokračuje v téže zprávě, ostatní počkají. Žádný čas se neztratí na opakování.
Odvrácená strana: zpráva s vysokým identifikátorem se na zatížené sběrnici nemusí dostat ke slovu vůbec. Říká se tomu vyhladovění a je to důvod, proč se u návrhu CAN sítě dělá rozbor nejhoršího případu, ne měření průměru.
2. Bit stuffing: hrana se musí objevit
Přijímač si na každé hraně doladí své hodiny. Kdyby přišlo dvacet stejných bitů za sebou, hrana by dvacet bitů nepřišla a hodiny by se rozešly. Proto vysílač po pěti stejných bitech vloží jeden opačný, a příjemce ho zase vyhodí.
Cena je, že délka rámce závisí na datech. Osmibajtový standardní rámec má 108 bitů bez vkládání a až 132 v nejhorším případě — tedy o 22 % víc. Kdo počítá zatížení sběrnice, musí použít to horší číslo, protože zpráva, která se nestihne, se nestihne právě tehdy, když se sejde nejhorší data.
| bez vkládání | nejhorší případ | |
|---|---|---|
| 8 bajtů, standardní ID | 108 bitů | 132 bitů |
| 8 bajtů, rozšířené ID | 128 bitů | ~157 bitů |
| užitečných dat | 64 bitů — režie přes 50 % | |
Ta poslední řádka je dobré vidět: CAN je drahý na režii, a je to vědomá cena za to, že každý rámec nese CRC-15, potvrzení a odolnost.
Chybové čítače: uzel se umí sám odpojit
Každý uzel počítá své chyby. Při 128 se přepne do stavu, kdy už nesmí rušit ostatní, a při 256 se od sběrnice sám odpojí. Je to obrana proti jedinému vadnému uzlu, který by jinak zahltil celou síť opakovanými chybovými rámci — a v autě je to rozdíl mezi „nefunguje jedna věc“ a „nefunguje nic“.