# 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?
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.