# Real-Time Control System > 副標題: 從控制系統角度看即時概念 筆記整理 by < `cy023` > ###### tags: `Control System` `Real-Time` `RTOS` ## 控制系統 對於控制系統而言,**輸出** / **輸入**==必須在預期的時間點上執行==,否則將影響動態模型的準確性,甚至可能導致系統崩潰。 ![](https://i.imgur.com/dwVV963.png) 在控制系統的實務上,常以 `MCU`, `DSP`, `ASIC` 等,作為數位控制器,且同時具備讀取系統輸入(或讀取回饋訊號)、輸出控制訊號、通訊 ... 等功能。 > 待補充: 系統不即時所造成的後續影響 (案例探討) 能不能解? ## 任務即時性 根據任務響應時間 (Response Time) 需求,分為以下三個種類: - 對**執行時刻**敏感的任務 (Time-sensitive Task): - 需要在特定時間點上觸發執行,如果執行時間不可預測,可能嚴重影響動態系統模型。 - 例如: 取樣、讀取輸入、輸出控制訊號、下命令 ...。 - ![](https://i.imgur.com/2Fc4Zk3.png) > 如何影響? 哪些案例? 能否處理? 相對於 Timer IRQ 延遲固定時間觸發? ... - 需要在**限定時間內**的任務 (Deadline-sensitive Task): - 限期內需完成的任務 - 例如: ??? - ![](https://i.imgur.com/pC7eQH6.png) - 對**即時性不敏感**的任務 (Casual Task): - 又可分為以下兩種 - 必須在該 Time Slot 做完的工作 - 例如: 當個 Time Slot 的資料處理、控制模型計算 ... - 完全不計較即時性 - 例如: UI 顯示資訊 - 有做就好容忍延遲? 容許沒作到? QoS? ... - ![](https://i.imgur.com/0suXDys.png) ## 在 `AVR` 架構微控制器上實作 Bare Metal 多任務系統 ### 1. 任務在時間觸發中斷服務程式 (Timer ISR) 中執行 - 1.1 越快越好,越接近時間觸發點越好 > 上述 Time-sensitive Task > 需要解決兩個 Time-sensitive Task 中斷搶奪同一個時間點執行,如何偵測、排解? - 1.2 在一個時間中斷內到下一個時間中斷發生之前做完就可以 > 上述 Deadline-sensitive Task > 若來不及把該做的都做完?如何檢測?延遲會造成的影響? - 1.3 若計時中斷服務函式執行時間超過中斷週期時間 (overrun),需要有配套檢查機制 解決方式需要從應用面思考,回頭調整中斷頻率或是調整中斷函式執行時間 策略一:將較不緊急的事移到 polling (offload) ![](https://i.imgur.com/Dtbghgq.png) ### 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. 需要考量的中斷碰撞問題 - ![](https://i.imgur.com/vtIfWnU.png) - ![](https://i.imgur.com/7zBs2zy.png) - ![](https://i.imgur.com/aW76JYm.png) - 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?