# Real-Time Control System
> 副標題: 從控制系統角度看即時概念
筆記整理 by < `cy023` >
###### tags: `Control System` `Real-Time` `RTOS`
## 控制系統
對於控制系統而言,**輸出** / **輸入**==必須在預期的時間點上執行==,否則將影響動態模型的準確性,甚至可能導致系統崩潰。

在控制系統的實務上,常以 `MCU`, `DSP`, `ASIC` 等,作為數位控制器,且同時具備讀取系統輸入(或讀取回饋訊號)、輸出控制訊號、通訊 ... 等功能。
> 待補充: 系統不即時所造成的後續影響 (案例探討) 能不能解?
## 任務即時性
根據任務響應時間 (Response Time) 需求,分為以下三個種類:
- 對**執行時刻**敏感的任務 (Time-sensitive Task):
- 需要在特定時間點上觸發執行,如果執行時間不可預測,可能嚴重影響動態系統模型。
- 例如: 取樣、讀取輸入、輸出控制訊號、下命令 ...。
- 
> 如何影響? 哪些案例? 能否處理? 相對於 Timer IRQ 延遲固定時間觸發? ...
- 需要在**限定時間內**的任務 (Deadline-sensitive Task):
- 限期內需完成的任務
- 例如: ???
- 
- 對**即時性不敏感**的任務 (Casual Task):
- 又可分為以下兩種
- 必須在該 Time Slot 做完的工作
- 例如: 當個 Time Slot 的資料處理、控制模型計算 ...
- 完全不計較即時性
- 例如: UI 顯示資訊
- 有做就好容忍延遲? 容許沒作到? QoS? ...
- 
## 在 `AVR` 架構微控制器上實作 Bare Metal 多任務系統
### 1. 任務在時間觸發中斷服務程式 (Timer ISR) 中執行
- 1.1 越快越好,越接近時間觸發點越好
> 上述 Time-sensitive Task
> 需要解決兩個 Time-sensitive Task 中斷搶奪同一個時間點執行,如何偵測、排解?
- 1.2 在一個時間中斷內到下一個時間中斷發生之前做完就可以
> 上述 Deadline-sensitive Task
> 若來不及把該做的都做完?如何檢測?延遲會造成的影響?
- 1.3 若計時中斷服務函式執行時間超過中斷週期時間 (overrun),需要有配套檢查機制
解決方式需要從應用面思考,回頭調整中斷頻率或是調整中斷函式執行時間
策略一:將較不緊急的事移到 polling (offload)

### 2. 任務在事件觸發中斷服務函式 (Event ISR, 例如通訊中斷、ADC 中斷) 中執行,不必放在時間中斷服務函式 (Timer ISR)
- 2.1 任務在**事件觸發中斷服務函式**中完成
:::spoiler pseudo code
```c
int main()
{
// ...
while (1) {
// ...
}
}
ISR (vect_1)
{
// ...
task1();
// ...
}
ISR (vect_2)
{
// ...
task2();
// ...
}
ISR (vect_3)
{
// ...
task3();
// ...
}
```
:::
- 2.2 在**事件觸發中斷服務函式中立起中斷旗標**,任務會在**檢查到對應旗標立起**時才執行 (interrupt flag 機制)
:::spoiler pseudo code
```c
bool flag1 = false, flag2 = false, flag3 = false;
int main()
{
// ...
while (1) {
if (flag1) {
task1();
flag1 = false;
}
if (flag2) {
task1();
flag1 = false;
}
if (flag3) {
task1();
flag1 = false;
}
}
}
ISR (vect_1)
{
// ...
flag1 = true;
// ...
}
ISR (vect_2)
{
// ...
flag2 = true;
// ...
}
ISR (vect_3)
{
// ...
flag3 = true;
// ...
}
```
:::
- 2.3. **由其他任務立起中斷旗標**,觸發對應任務,任務會在**檢查到對應旗標立起**時才執行 (interrupt flag 機制)
> 例如: task1 觸發 task2 執行
:::spoiler pseudo code
```c
bool flag1 = false, flag2 = false;
int main()
{
// ...
while (1) {
if (flag2) {
task2();
}
}
}
void task1(void *para_p)
{
flag2 = true;
// ...
}
void task2(void *para_p)
{
flag2 = false;
// ...
}
ISR (vect_1)
{
task1();
}
```
:::
- 2.4. 需要考量的中斷碰撞問題
- 
- 
- 
- 2.5. 延伸議題
- 任務同步 (synchronization)
- Mutex
- Semaphore
### 3. 全部依順序執行的迴圈, 沒有 overrun 的問題, 執行的頻率因整體工作量而變, 被執行的時間點與時間中斷的點之間沒有必然的關係
- 輪詢 Polling
:::spoiler pseudo code
```c
int main()
{
// ...
while (1) {
task1();
task2();
task3();
// ...
}
}
```
:::
### 4. 其他議題
- critical section 處理
- atomic operation 實作
- ...
- time jitter 影響
> 目前認為是硬體問題,需要探討對於系統所造成的影響,以及思考在軟體實作上能夠如何減少 time jitter 對系統的影響 (更新:好像沒那麼單純 :) 讀一些資料再來補充 ... )
> [Real-time Operating System Timing Jitter and its Impact on Motor Control](https://tsapps.nist.gov/publication/get_pdf.cfm?pub_id=822661)
> [RTOS Scheduler Implementation in Hardware and Software for Real Time Applications](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=1630765)
> [hthreads: A Hardware/Software Co-Designed Multithreaded RTOS Kernel](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=1612697)
- uniformity
> 這啥東東
- 硬即時 vs. 軟即時
## 在 `AVR` 架構微控制器上,引進==排程觀念==實作多任務系統 (C4M-RTOS)
- C4MRTOS 系統實作前提:
- 根據將任務分為
- Timer 中斷服務函式
- 其他中斷 (通訊中斷、ADC 中斷 ...) 服務函式
- 一般函式
- 協同排程 (cooperative scheduling),任務不能被搶佔 (preemption)
- **不具巢狀中斷**功能 (中斷不能中斷中斷)
- 需要考慮**中斷碰撞** (interrupt collision) 造成的影響
### Hardware Interrupt
> to-do
### Pipeline Executor
> to-do
### Frequency Reduce Executor
> to-do
### `step` 函式設計
> to-do
### `lay` 函式設計
> to-do
## 在 `ARM` 架構 (ARM Cortex-M4F 系列) 微控制器上實作 Bare Metal 多任務系統
- 系統實作前提:
- SysTick, NVIC, PendSV, SVC
- Exception model
- ...
- \[探討] : 為何需要巢狀中斷?不會讓系統的中斷越混亂嗎?Trade-off?