LinkLab linka je dohoda, ne drát

Tohle je statická kopie kapitoly pro vyhledávače. Interaktivní verze má animované obrázky, kontrolní otázky a tlačítka, která příklad načtou do kalkulačky.

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.

A 12300100100011ustoupilB 0F000011110000C 32101100100001ustoupilsběrnice00011110000Nula je dominantní: kdo pošle nulu, přebije jedničku.Vyhrál B — nejnižší identifikátor. Nic se nezahodilo a nikdo neopakuje.
Nastav třem uzlům identifikátory a sleduj, kde který ustoupí. Vyhraje nejnižší číslo — a nikdo nic neopakuje, protože vítěz vysílá dál bez přerušení.

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í.

11111 → 111110     00000 → 000001vložený bit nenese informaci

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í ID108 bitů132 bitů
8 bajtů, rozšířené ID128 bitů~157 bitů
užitečných dat64 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“.

Vzorce v této kapitole

stuff — vkládané bity, nejhůř
n_stuff ≤ ⌊(n − 1) / 4⌋ [—] kap. 11