# Controller Area Network / CAN 的基礎介紹
- 支援 Multicast 跟 Broadcast
- Multicast 是人人都可以是某個 message 的發送者
- Broadcast 是人人都可以接收到一個 message
- 低成本
- 「競爭 Contention」的時候有「決定性 Deterministic」的解
- 白話來說就是競爭優先權時可以明確知道誰一定是贏家
- 因為如果是其他常見的協議,例如 WiFi 的 CSMA-CA,發生競爭時是等待「隨機的時間」,因此不能確定誰一定會拿到頻段的使用權
- 基於「優先權」的「仲裁/arbitration」
- 決定誰可以先使用電線來傳 message 的時候是依據「優先權」
- 除了用於汽車,也用於自動化、工控、航空、醫療等等設備上
- 只需要兩條電線
- 速率上看 1Mbps
- 錯誤檢測跟 signaling
## 使用原因
因為 CAN 的以下特點,使得 CAN 歷久不衰
- 便宜且簡單(只要兩條電線)
- Deterministic 且 upper bound 有保障(基於優先權)
- 用了很久依舊可以用
雖然有人享用其他協議(例如 Ethernet)來取代 CAN,但是大多都有成本問題,因此頂多互相競爭,目前不會到取代的程度。
## 更多資訊
- CAN 可以算是 MAC 層
- 也就是主要描述訊息如何進行傳遞
- CAN 不需要 node (或 system) configuration information
- configuration information 例如像「地址」,許多協議會需要知道發送人的「地址」,也就是發送人是誰
- 但是 CAN 不需要,他只要基於優先權作判斷就好
- 也因此具有 Flexibility,想在哪裡加入 node/ECU,就在那裡加入
- Message delivery Multicast Data consistency
# Frame Types
下面介紹 CAN 的 Data Frame 裡面有哪些部分。
CAN Frame 跟 Frame 之間會有 3 個 bit 的 inter-frame spacing。
## Base Data Frame
下面是 Base Data Frame。
| Field name | Length (Bits) | Purpose |
|:---------------------------------:|:-------------:|:--------------------------------------------------------------------------------:|
| Start-of-frame | 1 | Denotes the start of frame transmission |
| Identifier | 11 | A (unique) identifier which also represents the message priority |
| Remote transmission request (RTR) | 1 | Must be dominant (0) for data frames and recessive (1) for remote request frames |
| Identifier extension bit (IDE) | 1 | Must be dominant (0) for base frame format with 11-bit identifiers |
| Reserved bits (r0) | 1 | Reserved bit. Must be dominant (0), but accepted as either dominant or recessive |
| Data length code (DLC) | 4 | Number of bytes of data (0–8 bytes) |
| Data field | 0~64 | Data to be transmitted (length in bytes dictated by DLC field) |
| CRC | 15 | Cyclic redundancy check |
| CRC delimeter | 1 | Must be recessive (1) |
| ACK slot | 1 | Transmitter sends recessive (1) and any receiver can assert a dominant (0) |
| ACK delimeter | 1 | Must be recessive (1) |
| End-of-frame (EOF) | 7 | Must be recessive (1) |
## Extended Data Frame
Extended 的主要差別是在 Identifier 變成有 A 跟 B 兩部分,因為現在的 message 種類越來越多,11 bit 只有 2048 種,已經不夠用了,於是又多加了 18 bit 進去。
| Field name | Length (Bits) | Purpose |
|:---------------------------------:|:-------------:|:--------------------------------------------------------------------------------:|
| Start-of-frame | 1 | Denotes the start of frame transmission |
| Identifier A | 11 | First part of the (unique) identifier which also represents the message priority |
| Substitute remote request (SRR) | 1 | Must be recessive (1) |
| Identifier extension bit (IDE) | 1 | Must be recessive (1) for extended frame format with 29-bit identifiers |
| Identifier B | 18 | Second part of the (unique) identifier which also represents the message priority |
| Remote transmission request (RTR) | 1 | Must be dominant (0) for data frames and recessive (1) for remote request frames |
| Reserved bits (r1, r0) | 2 | Reserved bits which must be set dominant (0), but accepted as either dominant or recessive |
| Data length code (DLC) | 4 | Number of bytes of data (0–8 bytes) |
| Data field | 0~64 | Data to be transmitted (length in bytes dictated by DLC field) |
| CRC | 15 | Cyclic redundancy check |
| CRC delimeter | 1 | Must be recessive (1) |
| ACK slot | 1 | Transmitter sends recessive (1) and any receiver can assert a dominant (0) |
| ACK delimeter | 1 | Must be recessive (1) |
| End-of-frame (EOF) | 7 | Must be recessive (1) |
# Bit Stuffing
CAN 有規定,在傳輸的過程中,如果傳了連續 5 個相同的 bit,那麼下一個 bit 一定要傳一個相反的額外 bit。
例如在傳某個 message 時長得像 ...111111010...,連續傳了 5 個 1 的時候,下一個一定要傳 0,才接著繼續傳剩下的 1010。
會需要這個規定的原因是為了保留來判斷 EOF 。
:::warning
實際上在傳最後 10 個 bit 的 1 的時候就不會有 stuffing 了
:::
# Data Efficiency
在討論 protocol 的時候,一定會討論到的就是傳輸資料的效率,所以我們來看傳出去的 bits 中,究竟有多少比例是真正的資料。
:::info
下面討論的是 Base Data Frame。
:::
## 最長長度
- data field:64 bits
- 是指最多有 64 bits
- other fields:44 bits
- 可以自己去上面加加看
- inter-frame spacing:3 bits
接著考慮到 bit stuffing,來想最極端的情況會多補幾個 bit。
答案是 24 個 bits,最極端的情況就是 11111000011110000....,這種情況下可以發現上一個連續情形補的 bit,會成為下一個連續情形的一部分。
$$
\left\lfloor \frac{64+34-1}{4}\right\rfloor=24
$$
other field 只考慮了 34 bits 是因為最後的 10 個 1 不需要考慮 stuffing。
因此最長長度就是 64 + 44 + 3 + 24 = 135 bit
## 最佳效率
假設並沒有發生 bit stuffing,那麼比率就是:
$$
\frac{64}{64+44+3}=0.576...
$$
## 最差效率
最差效率除了 bit stuffing 拉滿,還有就是傳輸的資料量最少,只有 1 個 bit,此時 data field 依舊需要 8 個 bit 的長度,因為 Data length code (DLC) 只告訴我們需要幾個「bytes」。
$$
\frac{1}{8+44+3+10}=0.0153...
$$
10 就是根據上面 bit stuffing 的公式,算出來的:
$$
\left\lfloor \frac{8+34-1}{4}\right\rfloor=10
$$
# Arbitration
下面介紹 CAN 藉由 Identifier 決定優先順序的過程。
- 首先 CAN 有規定每個 node 會在 Start-of-Frame 時同步,也就是要等到 bus 空閒了,大家才可以開始 Arbitration。
- 開始後,電線就像是個大大的 AND gate,每一個 node 傳上去 1 個 bit 時會全部 AND 起來:
- 如果結果是 0,那麼只要該 bit 是 0 的人就留下來繼續傳下個 bit
- 是 1 的人就只能乖乖閉嘴
- 如果結果是 1 ,那麼大家就繼續傳
可以注意到 bit stuffing 不會影響到這個判決結果,因為如果某個 node 有連續 5 個 0,那麼他的優先權一定是最大的,其他人只有可能跟他一樣大,不會比他大。
連續 5 個 1 也是類似的同樣道理。
# Bit Rate
雖然前面有說傳輸速率最高可達 1Mbps,但是實際上會跟 bus 的長度有關,越長則越慢,因為要等到所有人都收到訊息所需的時間就越長。
例如 25m 的 bus 就是可以達到最大 bit rate 的長度,但是 5000m 的 bus 的 bit rate 只有 10kbps...。
---
# CAN 的時間分析
接著是分析所謂的「最差反應時間」,也就是一種 message 的 instance,從發佈到結束總共所需的最長時間。
## Problem Formulation
message 實際上是具有週期性的,會每隔固定時間發佈一個該 message 的 instance。
所以當我們踩下煞車時,並不是立馬做出煞車的動作,而是要位於煞車區的 ECU 收到有關煞車的 message,並且同時偵測到有踩下煞車,才會真的做出反應,像是發送壓緊碟剎的 message 之類的。
下面是分析時常用的代號:
- message:$\mu_{0},\mu_{1},...,\mu_{n-1}$
- 通常沒特別講的話,$\mu_{0}$ 的優先權最大,可以回顧上面的 identifier
- Unique ID (=priority):$P_{0},P_{1},...,P_{n-1}$
- Transmission Time:$C_{0},C_{1},...,C_{n-1}$
- 這個值可以由傳輸長度除以傳輸速率得到
- Period:$T_{0},T_{1},...,T_{n-1}$
## 前提
- 我們假設從開始到結束的時間一定一樣長,不會有「抖動 jitter」。
- 所有的 message 有無限個 instance
- 所有 message 不一定有對齊
## 限制
在列出公式之前,有以下的限制:
:::warning
最差反應時間不會大於傳輸週期
$$
R_{i}\le T_{i}
$$
:::
- Technical reason
- 如果 $R_{i}>T_{i}$,下面的數學公式不會成立
- Practical reason
- 通常來說一個週期以前的 message 不會比現在的 message 有用
## 公式
公式有兩個部分,下面是第一部分:
$$
R_{i}=Q_{i}+C_{i}
$$
$C_{i}$ 就是自己的傳輸時間。$Q_{i}$ 則是以下第二部分
$$
Q_{i}=B_{i}+\sum_{\forall j,P_{j}<P_{i}}\left\lceil \frac{Q_{j}+\tau}{T_{j}} \right\rceil\times C_{j}
$$
$B_{i}$ 是所謂的 blocking time,他的數值是:
$$
B_{i}=\max_{\forall j P_{j}\ge P_{i}} C_{j}
$$
因為我們的情境下沒有同步,所以會有順位低(或相同)的擋在前面的情況。
>相同是因為有可能前一個同類被一直擋住,最終卡到自己
$\left\lceil \frac{Q_{j}+\tau}{T_{j}}\right\rceil$ 這部分是算在 $Q_{i}$ 的時間內,第 $j$ 種 message 最多可以擋第 $i$ 種幾次,所以後面才會再乘上擋的時間。
$\Sigma$ 裡面整坨又叫做 waiting time。
:::info
$\tau$ 下面會解釋他的存在。總之他是一個常數。
:::
## 計算方法
從公式可以看到,第二部分左右兩側都有 $Q_{i}$,通常解這種問題時常用到的技巧叫做「fix point」演算法。
想要找到 $Q_{i}$ 的值:
- 先將 $Q_{i}$ 設為 $B_{i}$
- 計算公式的右手邊內容得到 RHS
- 如果 RHS + $C_{i}$ > $T_{i}$,直接 stop
- 因為違反 constraint
- 如果 $Q_{i} <$ RHS
- 令 $Q_{i}$ = RHS,然後再次計算 RHS
- 如果 $Q_{i} ==$ RHS
- 找到目標的 $Q_{i}$ 了,可以停止計算(或計算下一個 $Q_{i}$)
- 令 $R_{i}=Q_{i}+C_{i}$
## 回顧限制
1. 為什麼我們會需要 $R_{i}\le T_{i}$ 這個限制?
是因為公式中的這部分:
$$
\sum_{\forall j,P_{j}<P_{i}}\left\lceil \frac{Q_{j}+\tau}{T_{j}} \right\rceil\times C_{j}
$$
是在算第 $i$ 個 task 最多會被擋幾次(擋多久),但如果沒有保證 $R_{i}\le T_{i}$,那麼擋第 $i$ 個 task 的人,就有可能會是自己的同夥(可能是從很早之前一直被擋到現在的同伴)。
2. 公式中為什麼要有 $\tau$?
原因是出在於取 ceiling 的時候,例如 $\left\lceil \frac{100}{25} \right\rceil=4$ 但是為了「保守起見」,我們會希望讓他多算一次,以防一些意外發生,所以如果加上了 $\tau$,那麼上面的答案就會是 5 而不是 4,
---
# Critical Instant Theorem
:::warning
messsage $\mu_{i}$ 的 $R_{i}$是發生在,當所有優先度比他高的 message 跟他同時 release 的時候。
或者說:
如果所有優先度比他高的 message 跟他同時 release,則 messsage $\mu_{i}$ 的 $R_{i}$ 就會發生
:::
這是上面公式背後的理論;這是必要但不充分條件,也就是說:
:::info
如果 messsage $\mu_{i}$ 的 $R_{i}$ 發生,則所有優先度比他高的 message 「不一定」跟他同時 release
:::
當初這個公式是用在 preemptive 的情境,但 CAN 是個 non preemptive 情境,所以我們上面的公式有額外加上 blocking time 的部分。
## 公式證明
其實只要分段討論就可以證明以下情況 $R_{i}$ 不會更差。
- Case 1:如果不是所有較高順位的同時 release,而是有一些較晚 release
- 有可能 $\mu_{i}$ 會比所有 higher priority 較早 release,那麼 $R_{i}$ 可知會變小
- 或者 $\mu_{i}$ 依舊被某些 higher priority 的擋住,但是因為有一部分的人較晚 release,所以有可能「可以擋的次數變少了」
- Case 2:如果不是所有較高順位的同時 release,而是有一些較早 release
- 如果那些較早 release 的,真的太早就 release,讓 bus 在 $\mu_{i}$ release 前就空閒下來,那麼 $R_{i}$ 不會變差
- 或者說此時可以視為退化成 Case 1 的第二種情形
- 如果那些較早 release 的,使得 bus 在 $\mu_{i}$ release 時依舊 busy
- 假設此時的 $R_{i}$ 是最長的
- 這時我們可以把 $\mu_{i}$ release 的時間往前,移到跟那些較早 release 的 message 同時
- $R_{i}$ 就會是原本的值,加上多往前移動的這段,那麼就會跟原本假設 $R_{i}$ 是最長的矛盾
---
# Generalization to Software Tasks
上面的公式其實也可以推廣到 preemptive 的情形,例如 ECU 的 software task。
公式跟上面很像:
$$
R_{i}=C_{i}+\sum_{\forall j,P_{j}<P_{i}}\left\lceil \frac{R_{j}}{T_{j}} \right\rceil\times C_{j}
$$
由於是 preemptive,所以不會有 blocking time,只要你順位比我小我就直接插隊。
也因此不需要 $\tau$,因為不用去在意誰先誰後,~~只要順位低就沒有人權~~,所 ceiling 發生整除時不用有保守的考量。