# RTOS 學習筆記 - 2 > 參考資源:[科技下午茶 - RTOS-02](https://www.youtube.com/watch?v=v7_9gKoA5b0&list=PLJvU73y7BpTsNAHgz0KoRtcyq16xflK9K&index=2)。 ## Thread v.s. Task(Process) ### Single Core (1970~1980) - Multitasking(多工處理 / IPC)。 > 任何時刻,僅有 1 個 Task / ISR 正在執行。 - 概念:Create **Task**(main / none Bare-metal)。 ### MMU (1980~1990)  - Process 使用各自的 PTEx。 - Threads 分享 Process 的 PTEx。 ### Multiple Cores (Concurrent) 舉例(64C128T 的 CPU):  > 注意:Concurrent 與 Multitasking 完全不同-Concurrent(多核)環境下,可能會設定 w 個高優先權任務、x 個中優先權任務、y 個低優先權任務和 z 個 ISR 驅動程式,並「**同時執行中**」。 因此,在 Multi-threaded 的場景下,有一些問題油然而生,並需要以對應解法來確保 thread-safe: - **Data Racing** - 解法 1:Atomic Operation - 概念:處理某個任務時,需一次把該處理的處理完(例如:一 8-bit 的 CPU 想做 32-bit 的運算 `A + B = C`,通常要分成 4 輪才能處理完;則 Atomic Operation 即確保該「4 輪」在 Concurrent 環境中,「不會有別的 thread 中途取用 C」)。 - C11 / C18: 1. atomic data type 2. c0 *read-modify-write* c1 3. fetch_OP:`+=` / `-=` / `|=` / `&=` / `^=` 4. `if (!Lock++) test-and-set` - 解法 2:Memory Order  - **Synchronization** - 解法 1:mutex - 解法 2:fence - 解法 3:acquire / release - 如 Cortex-M v8 指令集之 `LDAEX` / `STLEX`。   - 另外,還需考慮 Function Reentrancy 的狀況。 ### Application Resource Threads 分享 Process 的 Resources。 ### FreeRTOS 參照 [官方文檔說明](https://www.freertos.org/Documentation/02-Kernel/04-API-references/01-Task-creation/01-xTaskCreate),並觀察 `xTaskCreate` 函式如下: ```c BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName, const configSTACK_DEPTH_TYPE uxStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pxCreatedTask ); ``` > Create a new **task** and add it to the list of tasks that are ready to run. 根據 UNIX、POSIX 對 Process 及 Thread 的解釋,作者認為 RTOS 之 Task「與 Thread 的概念較符合」。 ## Thread(Task) v.s. Handler(ISR)  FreeRTOS 的 Task 對應到 Cortex-M 的 Thread mode; FreeRTOS 的 ISR 對應到 Cortex-M 的 Handler mode。 ## IPC(Inter-Process Communication)  弔詭的是,若 99 % 的 Task 幾乎都處於 Blocked 狀態,那到底誰要來 Wake-up 他們? 答案即透過 ISR(Event Driven)發生,會間接使某 Task 甦醒,該 Task 再觸發 Tasks 之間的交換。 既然如此,何不透過 ISR,直接將 Wake-up Task 的工作完成? 當然可以,FreeRTOS 有支援可在 ISR 中呼叫的對應 Wake-up 函式。 另外,需探討「ISR 發生後,到 Task Running 狀態」所需的時間(**Latency**)。 ### FreeRTOS IPC Latency 實驗與探討 - FreeRTOS v10.4 - Task **Blocked** by calling system API (1) - Task **Ready** by `xxxFromISR` (2) called by ISR - Task **Run** by exit (3) from system API - Latency Time = (3) - (2) 結果如下: 
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up