硬性即時作業系統 | 軟性即時作業系統 | |
---|---|---|
簡介 | 也可稱為安全臨界系統(Safety-Critical System),有最迫切的需求,必須在特定期限之前回應事件,保證在它們的期限內完成臨界即時任務。 | 跟硬性即時系統比較起來,限制的範圍比較少,簡單提供一件臨界的即時系統,將在其它的任務上接受優先權並保有優先權直到它完成。 |
工作延遲 | 所有工作都不能夠延遲 | 允許少量的工作延遲,若沒有在回應時間內完成,只是造成系統的效能變差,不會影響系統的執行 |
要求 | 非常嚴苛 | 比較寬鬆 |
Mbed OS RTOS 的物件導向功能包括執行緒管理( thread )、同步處理( synchronization objects )和定時器 ( timer )。它還提供用於附加於特定應用程序 idle hook function 的介面,用來讀取操作系統計數並提供 RTOS 報錯功能。
Hook 是用來與作業系統掛勾進而攔截並處理某些訊息之用。idle hook function 即是由介面觸發後,使程式進入 Idle 狀態的函式。
Program:一群程式碼的集合。
Process:由Program所產生的執行個體(或稱做處理序、進程)。
執行緒(Thread)
是作業系統能夠進行運算排程的最小單位,被包含在行程之中,式行程中的實際運作單位。在 Mbed OS RTOS 中以 thread 的函式庫來設定 thread的運作,而在 main 函式中,因為其為初始化程式本體的函式,所以他的初始排序優先權(os Priority)為osPriorityNormal
。
Firefox:單獨只有firefox.exe這個Process,所有分頁是用Multi-Thread完成。
Chrome:每個分頁都相當於一個執行個體(Multi-Process)。
RTOS函式庫 : https://os.mbed.com/handbook/RTOS
以下為簡單的應用 :
#include "mbed.h"
#include "rtos.h"
DigitalOut led1(LED1);
DigitalOut led2(LED2);
Thread thread;
void led2_thread() {
while (true) {
led2 = !led2;
Thread::wait(1000);
}
}
int main() {
thread.start(led2_thread);
while (true) {
led1 = !led1;
Thread::wait(500);
}
}
The main function is already the first thread scheduled by the rtos
執行緒之間會在以下階段間轉換 :
在執行緒中執行優先權可以有以下幾種可以設定 :
typedef enum {
osPriorityIdle = -3, ///< Priority: idle (lowest)
osPriorityLow = -2, ///< Priority: low
osPriorityBelowNormal = -1, ///< Priority: below normal
osPriorityNormal = 0, ///< Priority: normal (default)
osPriorityAboveNormal = +1, ///< Priority: above normal
osPriorityHigh = +2, ///< Priority: high
osPriorityRealtime = +3, ///< Priority: realtime (highest)
osPriorityError = 0x84, ///< System cannot determine priority or illegal priority.
osPriorityReserved = 0x7FFFFFFF ///< Prevents enum down-size compiler optimization.
} osPriority;
並以以下函式設定優先順序 :
set_priority(osPriority priority)
當然也可以在宣告時便將所有執行緒要設定的參數設定好 :
Thread (osPriority priority=osPriorityNormal, uint32_t stack_size=DEFAULT_STACK_SIZE, unsigned char *stack_pointer=NULL)
//Allocate a new thread without starting execution.
宣告範例
Thread t1(osPriorityHigh);
任何一個執行緒可以被標註為等待 signal 的執行緒。
以下為 Signal
範例程式 :
#include "mbed.h"
#include "rtos.h"
DigitalOut led(LED1);
Thread thread;
void led_thread() {
while (true) {
// Signal flags that are reported as event are automatically cleared.
thread.signal_wait(0x1);
led = !led;
}
}
int main (void) {
thread.start(callback(led_thread));
while (true) {
Thread::wait(1000);
thread.signal_set(0x1);
}
}
請利用上述 RTOS 中的 thread 來完成跑馬燈功能:※必須執行3條以上執行緒
相關語法可以參考 : Thread。
注意:更換狀態LED不是從起始開始,是從上次中斷位置開始
請利用上述 RTOS 中的 Signals 來控制開發版的LED:※必須以Signals觸發Thread
hint:
Serial pc(SERIAL_TX,SERIAL_RX);
while(ture){
if(pc.readable()){
w = pc.getc();
---------------------
.
.
.
}
}
請利用上述 RTOS 中的 Signals 來完成以下功能:※以Signals觸發Thread
超音波測距:https://os.mbed.com/components/HC-SR04/