540 likes | 676 Views
第七章. 嵌入式作業系統. 本章學習重點. 嵌入式作業系統原理 即時排程演算法 WinCE 、 Symbian 、 VxWorks 和 Nucleus 嵌入式作業系統介紹. 嵌入式作業系統架構的演進. 嵌入式作業系統特色. 記憶體空間需求小且整體效率高 良好的省電功能 與 PC 溝通的功能 開放應用程式撰寫環境與動態載入應用程式 通訊功能. 行程與執行緒. 為了方便管理應用程式,嵌入式作業系統會分別以一個執行單位來看待一項工作或是一個程式,這個執行單位在不同的嵌入式作業系統中會有不同的名稱與意義,大多為 行程與執行緒. A single
E N D
第七章 嵌入式作業系統 嵌入式系統導論, 探矽工作室
嵌入式系統導論, 探矽工作室 本章學習重點 • 嵌入式作業系統原理 • 即時排程演算法 • WinCE、Symbian、VxWorks和Nucleus嵌入式作業系統介紹
嵌入式系統導論, 探矽工作室 嵌入式作業系統架構的演進
嵌入式系統導論, 探矽工作室 嵌入式作業系統特色 • 記憶體空間需求小且整體效率高 • 良好的省電功能 • 與PC溝通的功能 • 開放應用程式撰寫環境與動態載入應用程式 • 通訊功能
嵌入式系統導論, 探矽工作室 行程與執行緒 • 為了方便管理應用程式,嵌入式作業系統會分別以一個執行單位來看待一項工作或是一個程式,這個執行單位在不同的嵌入式作業系統中會有不同的名稱與意義,大多為行程與執行緒
嵌入式系統導論, 探矽工作室 A single execution unit main() { ….. a_task(); ….. } void a_task() { ….. } 應用程式執行單位
嵌入式系統導論, 探矽工作室 Process 1 /* program 1*/ main() { program1(); } void program1() { } /* program 2*/ main() { program2(); } void program2 () { } Process 2 /* program 3*/ main() { program3(); } void program3() { } Process 3 Process 4 /* program 4*/ main() { program4(); } void program4() { } 行程代表著不同的應用程式
嵌入式系統導論, 探矽工作室 行程(process)/ 執行緒(thread)/工作(task) • 通常作業系統會配給行程(process)裡一塊記憶體空間,放著該行程所有的程式碼與資料,以及一些系統服務的紀錄資料,例如檔案開啟的紀錄表、虛擬記憶對應表等,當然還包含了該行程每次執行時,微處理機的執行狀態 • 但對於這個行程內的執行緒(thread)/工作(task)而言,分配到的可能是位於該行程內的一段記憶體空間,紀錄著該執行緒/工作的程式碼與資料,以及每次微處理機的執行狀態,而那些屬於全域性的紀錄資料,並不會複製到每一個執行緒/工作內,像是上述的檔案開啟的紀錄表、虛擬記憶對應表等。
嵌入式系統導論, 探矽工作室 Memory CPU Process 1 data, code Program counter Process 2 data, code Register Files Process 3 data, code Process 4 data, code Process 1 record Process 2 record Process 3 record Process 4 record 行程、記憶體與微處理器的關係
嵌入式系統導論, 探矽工作室 Memory CPU Status in Thread 1 of Process 1 Process 1 code, data Program counter Register Files CPU Status in Thread 2 of Process 1 Program counter Process 1 record Register Files 執行緒/工作、記憶體與微處理器的關係
嵌入式系統導論, 探矽工作室 執行緒的狀態
嵌入式系統導論, 探矽工作室 µC/OS-II’s Task Control Block 資料結構 typedef struct os_tcb { OS_STK *OSTCBStkPtr; #if OS_TASK_CREATE_EXT_EN void *OSTCBExtPtr; OS_STK *OSTCBStkBottom; INT32U OSTCBStkSize; INT16U OSTCBOpt; INT16U OSTCBId; #endif struct os_tcb *OSTCBNext; struct os_tcb *OSTCBPrev; #if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN OS_EVENT *OSTCBEventPtr; #endif #if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_ EN void *OSTCBMsg; #endif INT16U OSTCBDly; INT8U OSTCBStat; INT8U OSTCBPrio; INT8U OSTCBX; INT8U OSTCBY; INT8U OSTCBBitX INT8U OSTCBBitY; #if OS_TASK_DEL_EN BOOLEAN OSTCBDelReq; #endif } OS_TCB;
嵌入式系統導論, 探矽工作室 排程 • 排程可以說是作業系統核心中最重要工作之一,因為CPU只有一個,所以在一個多工的系統中,核心必須適當的安排分配每個程式的執行時間,讓整各系統看起來就像是有許許多多的程式同時在執行一樣。通常核心會以分時(Time Slicing)的觀念來讓大家共享CPU資源。把CPU執行的時間,分成一段段的,每個程式就分配到這些時間來執行任務。這一段一段的時間,在不同的作業系統中,有的長,可能是200個分時,有的短,也有只有20個分時,有的是固定的,也有可以調整的,而每一段的執行時間到了,就必須輪替換下一個程式執行,那要輪到哪一個,就必須要由核心的排程器來決定。
嵌入式系統導論, 探矽工作室 Process 1 Process 2 Process 4 Process 3 排程
嵌入式系統導論, 探矽工作室 排程演算法 • First Come First Service Scheduling (FCFS) • Priority First Scheduling • Round-Robin Scheduling • Priority First with Round-Robin Scheduling
嵌入式系統導論, 探矽工作室 排程時機 • 在被動的情況下,行程或是執行緒被切換,這個時機就是在每一個時間中斷的時候。決定是否排程以及排程器的程式碼,通常會放在計時器的中斷服務函式裡。 • 行程或執行緒主動呼叫作業系統的系統服務。有些系統服務會讓行程或是執行緒本身的狀態改變,如exit、sleep、wait event、wait semaphore等,或是give up CPU的系統呼叫時候,都會去呼叫排程機制。
嵌入式系統導論, 探矽工作室 即時系統 • Real time in operating systems: the ability of the operating system to provide a required level of service in a bounded response time.
嵌入式系統導論, 探矽工作室 固定式優先權排程法-Rate Monotonic Scheduling • 「執行週期越短,則優先權較高」的排列方式,這是因為在比率單調排程法(RMS)認為,執行週期越短的任務,表示其即時性需求越高,因此優先權也需要設定越高,以符合系統要求。因此,在系統開發階段,設計者就必須考量系統環境與應用條件,設定各行程的的執行時間與執行週期,一旦決定後,系統在執行過程中,這些優先權將不在改變,所以稱為固定式優先權排程演算法。
嵌入式系統導論, 探矽工作室 RMS範例 Interval Execution 6 2 12 3 4 1
嵌入式系統導論, 探矽工作室 RMS scheduler 範例程式 void RMA_Scheduler(int current) { int i; … … process[current].state == READY; for ( i = 0; i < Total_Processes; i ++ ) if (process[i].state == READY) { process[i].state == RUNNING; break; } } … … }
嵌入式系統導論, 探矽工作室 動態優先權排程法-Earliest Deadline First Scheduling • 在即時系統系統中另外一個著名的排程演算法為動態優先權排程法(Earliest Deadline First Scheduling )。EDF排程演算法顧名思義,就是哪個行程的「執行期限越靠近,則相對的優先權也會調高」。所以在這個系統中的執行優先權,都需隨時調整,因此EDF是一個動態調整優先權的排程演算法。
嵌入式系統導論, 探矽工作室 P3 P2 P1 5 10 15 0 EDF範例 Deadline Interval Execution 4 1 8 5 2 12 3 1 6
嵌入式系統導論, 探矽工作室 EDF scheduler 範例程式 void EDF_Scheduler(int current) { int i; … … process[current].state == READY; calculate_deadline(&process); arrange_priority_order(); for (i = 0; i < Total_Processes; i ++ ) if (process[i].state == READY) { process[i].state == RUNNING; break; } } … … }
嵌入式系統導論, 探矽工作室 本文切換 • 當透過作業系統的排程器的選擇機制,決定下一個CPU的使用權是交給那一個工作來執行之後,作業系統就必須要做切換的動作。有個專有名詞來描述這種切換的動作,稱為本文切換(context switch)。 • 做本文切換的時候,必須要將目前的工作狀態(task context)全部記錄起來,包括了程式指標(program counter/instruction pointer)、堆疊指標(stack pointer)及所有微處理器的其他暫存器內容。
嵌入式系統導論, 探矽工作室 µC/OS 本文切換(context switch) 步驟一
嵌入式系統導論, 探矽工作室 µC/OS本文切換(context switch) 步驟二
嵌入式系統導論, 探矽工作室 µC/OS 本文切換(context switch) 步驟三
嵌入式系統導論, 探矽工作室 µC/OS本文切換(context switch) 步驟四
嵌入式系統導論, 探矽工作室 µC/OS 本文切換(context switch) 步驟五
嵌入式系統導論, 探矽工作室 µC/OS 本文切換(context switch) 步驟六
嵌入式系統導論, 探矽工作室 µC/OS本文切換(context switch) 步驟七
嵌入式系統導論, 探矽工作室 µC/OS本文切換(context switch) 步驟八
嵌入式系統導論, 探矽工作室 µC/OS本文切換(context switch) 步驟九
嵌入式系統導論, 探矽工作室 內部行程通訊 • 在有些特殊需求的時候,會有至少一個以上的行程(process)來完成單一應用程式。但這些不同的行程或是執行緒享有的系統資源往往是獨立的,無法直接分享,因此作業系統核心必須要提供所謂的內部行程通訊IPC(Inter-Process Communication),讓這些不同的行程間可以互相交換訊息,也可以藉此知道彼此的意圖來做出相對應的行為
嵌入式系統導論, 探矽工作室 內部行程通訊方法 • 透過作業系統中的記憶體子系統,也就是一般所說的共用記憶體(share memory)。 Mail Box、Message Queue也是利用相同的觀念所設計出來的通訊機制。 • 透過作業系統中的檔案系統。 • 透過作業系統所提供的虛擬溝通機制 。例如管道(pipe)。 • 透過作業系統所提供的信號(signal)機制 。
嵌入式系統導論, 探矽工作室 共用記憶體機制
嵌入式系統導論, 探矽工作室 檔案系統共用機制
嵌入式系統導論, 探矽工作室 作業系統提供的虛擬溝通管道
嵌入式系統導論, 探矽工作室 信號型態的行程間通訊
嵌入式系統導論, 探矽工作室 管理記憶體 • Bit Map Method • 鏈結(link list)記憶體 • Tag-Boundary Method • Memory Partition Method
嵌入式系統導論, 探矽工作室 A B C D 8 16 24 32 Memory regions 11111100 00111000 Bitmap 01111111 11111000 Bit Map Method
嵌入式系統導論, 探矽工作室 A B C D 8 16 24 32 Memory regions A 0 6 - 6 4 B 10 3 - 13 4 C 17 9 D 26 3 - 29 3 鏈結(link list)記憶體
嵌入式系統導論, 探矽工作室 Tag-Boundary Method
嵌入式系統導論, 探矽工作室 Memory Partition Method
嵌入式系統導論, 探矽工作室 記憶體配置 • 最先合適(First-Fit)、最佳合適(Best-Fit)和最差合適(Worst-Fit) • buddy system • 就是將一塊較大的記憶體空間,再以二冪次方的方式,分為許多大小為1、2、4、8、…、n的小區塊,然後配給應用程式適當大小,並用串列的方式紀錄。
嵌入式系統導論, 探矽工作室 buddy system
嵌入式系統導論, 探矽工作室 虛擬記憶體
嵌入式系統導論, 探矽工作室 微處理器支援不同頁大小(page size)的架構
嵌入式系統導論, 探矽工作室 記憶體回收 • 資源回收演算法主要的精神,在找出已配置的實體分頁(frame),並更新page-table的內容。資源回收包括行程層級(process-level)和執行緒層級(thread-level)兩種層次。行程層級比較容易,基本上只要參考page-table directory,就可取得page-table所在位置,再根據page-table內容逐一歸還已使用的分頁即可。 • 有些屬於process的資源會被紀錄在kernel裡。所以,在執行行程層級資源回收之前,必須先執行執行緒層級資源回收,保證kernel裡沒有屬於該process的資料。執行緒層級的資源回收比較麻煩,因為配置的記憶體之間會有相依性,因此處理動態配置的記憶體,必須要記錄配置的區塊都會紀錄由誰所配置,這個動作比較複雜而且耗時。
嵌入式系統導論, 探矽工作室 WinCE .Net