網站首頁 個人文件 個人總結 工作總結 述職報告 心得體會 演講稿 講話致辭 實用文 教學資源 企業文化 公文 論文

作業系統實驗報告【精品多篇】

欄目: 實用文精選 / 釋出於: / 人氣:5.88K

作業系統實驗報告【精品多篇】

嵌入式作業系統實驗報告 篇一

實驗一 嵌入式開發環境的建立

一、實驗目的

通過此實驗系統,讀者可以瞭解嵌入式實時作業系統 uC/OS-II 的核心機制和執行原理。本實驗系統展示了 uC/OS-II 各方面的管理功能,包括訊號量、佇列、記憶體、時鐘等。在各個實驗中具體介紹了 uC/OS-II 的相關函式。讀者在做實驗的同時能夠結合理論知識加以分析,瞭解各個函式的作用和嵌入式應用程式的設計方法,最終對整個 uC/OS-II 和嵌入式作業系統的應用有較為清楚的認識。

二、實驗步驟

1、安裝整合開發環境LambdaEDU 整合開發環境LambdaEDU 的安裝資料夾為 LambdaEDU ,其中有一個名為“” 的檔案,直接雙擊該檔案便可啟動安裝過程。具體的安裝指導請看“LambdaEDU 安裝手 冊。doc”檔案。

當 LambdaEDU 安裝完畢之後,我們看到的是一個空的介面,現在就開始一步一步地將 我們的實驗專案建立並執行起來。

2、建立專案

為了我們的實驗執行起來,需要建立1 個專案基於x86 虛擬機器的標準應用專案。通過點 擊“檔案”、“新建”、“專案”開始根據嚮導建立一個專案。

在隨後出現的對話方塊中選擇“Tool/標準應用專案”,點選下一步,開始建立一個標準的 可執行的應用程式專案。

在隨後出現的對話方塊中填入專案名稱“ucos_x86_demo”。點選“下一步”。

選擇“pc386 uC/OS-II 應用(x86)”作為該專案的應用框架。點選“下一步”

選擇“pc386_elf_tra_debug”作為該專案的基本配置。點選“完成”。

新建立的專案“ucos_x86_demo”將會被新增到專案列表。src 資料夾下儲存了該專案中 包含的原始檔。ucos2 資料夾中包含了移植到x86 虛擬機器的全部程式碼。init.c 檔案是基於ucos2 和本虛擬機器的一個應用程式。在進行ucos2 核心實驗中,只需要替換init.c 檔案,即可。文

件名不限,但是檔名中最好不要使用英文符號和數字以外的其他字元, 3. 構建專案

到這裡,專案配置全部完成。接下來就可以進行構建專案了。

第一次構建本專案,在此專案上點選右鍵,選擇“重建BSP 及專案”。即可開始構建。

之後彈出的對話方塊顯示了構建的進度。可以點選“在後臺執行”,以隱藏該對話方塊

在構建的同時,在右下角的“構建資訊”檢視輸出構建過程中的詳細資訊:

注:“重新構建”將本專案中的全部原始碼進行一次完全的編譯和連線,花費時間較多。 “構建專案”則僅僅將新修改過的原始碼進行編譯和連線,花費時間最少。“重建BSP及項 目”,不但要完成“重新構建”的全部工作,另外還要編譯與該專案有關的的LambdaEDU 中內建的部分程式碼,花費時間最多。但是在專案剛建立後,第一次構建時需要選擇“重建 BSP 及專案”。以後的構建中選擇“重新構建”或“構建專案”即可。另外,在替換了源代 碼中的檔案後,需要選擇“重新構建”來完成該專案的構建。

4、配置虛擬機器和目標機代理

(1) 製作X86啟動盤

在 LambdaEDU 中依次點選“工具”、“Bochs”、“製作虛擬機器啟動映象”。 對啟動盤進行一些引數設定後(如下圖所示),系統將自動為你生成一個PC 虛擬機器的 啟動盤映像。

(2) 配置虛擬機器 選擇使用的網路介面卡(網絡卡)後,點選“確定”完成配置。

注意:如果計算機上有多網絡卡,請將其他網絡卡停用(包括 VMware 虛擬機器新增的虛擬 網絡卡)。

(3) 建立目標機代理

配置好虛擬機器後,建立目標機代理:點選LambdaEDU 左下方視窗中綠色的十字元號, 在彈出的視窗中選擇“基於TA 的連線方式”,並點選“下一步”。

在彈出的“新目標機連線配置中”的這些引數,應該與之前製作啟動盤時設定的引數一致。

注意:

名字:輸入目標機的名字(預設是 default),注意如果和現有目標機重名的話,改個名 字。

連線型別:預設選擇 UDP IP地址:這裡輸入目標機(在本實驗系統中是虛擬機器)的 IP地址;

最後點選“確定”,在目標機管理視窗中,可以看到新增加了一個名為default 的目標機 節點

(4) 除錯應用 啟動虛擬機器。

虛擬機器啟動後的畫面如下(其中顯示的IP 地址建立虛擬機器啟動盤時填入的IP 地址)中設定的IP 地址):

在成功完成構建的專案ucos_x86_demo 中的“pc386_elf_tra_debug”上點選滑鼠右鍵,在彈出的選單中選擇“除錯”,啟動偵錯程式除錯生成的程式:

第一次進行除錯/執行,需要選擇目標機,如下圖,選擇“Default”,點選“確定”,開 始向目標機(虛擬機器)下載應用程式。 程式下載完成後,會彈出一個“確認透檢視切換”對話方塊,選擇“是”,切換到除錯透 檢視。

除錯的介面如下:

點選綠色的按鈕,全速執行。

注意:全速執行後,程式不能夠被暫停和停止。

三、實驗過程中遇到的問題及體會

在設定IP地址時,要求該IP地址與本計算機在同一個子網中,同時要求該 IP地址沒有被網路上其他計算機使用。此外,通過構建開發環境,處次體驗到了嵌入式開發工作的樂趣。

實驗二 任務的基本管理

一、實驗目的

1、理解任務管理的基本原理,瞭解任務的各個基本狀態及其變遷過程; 2.掌握 uC/OS-II 中任務管理的基本方法(建立、啟動、掛起、解掛任務); 3. 熟練使用 uC/OS-II 任務管理的基本系統呼叫。

二、實驗原理及程式結構

1、實驗設計

為了展現任務的各種基本狀態及其變遷過程,本實驗設計了 Task0、Task1 兩個任務: 任務 Task0 不斷地掛起自己,再被任務 Task1 解掛,兩個任務不斷地切換執行。通過本實驗,讀者可以清晰地瞭解到任務在各個時刻的狀態以及狀態變遷的原因。 2. 執行流程 描述如下:

(1)系統經歷一系列的初始化過程後進入 boot_card()函式,在其中呼叫 ucBsp_init()進 行板級初始化後,呼叫 main()函式;

(2)main()函式呼叫 OSInit()函式對 uC/OS-II 核心進行初始化,呼叫 OSTaskCreate 創 建起始任務 TaskStart;

(3)main()函式呼叫函式 OSStart()啟動 uC/OS-II 核心的執行,開始多工的排程,執 行當前優先順序最高的就緒任務 TaskStart; (4)TaskStart 完成如下工作:

a、安裝時鐘中斷並初始化時鐘,建立 2 個應用任務;

b、掛起自己(不再被其它任務喚醒),系統切換到當前優先順序最高的就緒任務Task0。之後整個系統的執行流程如下:

 t1 時刻,Task0 開始執行,它執行到 t2 時刻掛起自己;

 t2 時刻,系統排程處於就緒狀態的優先順序最高任務 Task1 執行,它在 t3 時刻喚醒Task0,後者由於優先順序較高而搶佔 CPU;

 Task0 執行到 t4 時刻又掛起自己,核心排程 Task1 執行;  Task1 執行至 t5 時刻再度喚醒 Task0;  ……

3、µC/OS-Ⅱ中的任務描述

一個任務通常是一個無限的迴圈,由於任務的執行是由作業系統核心排程的,因此任務是絕不會返回的,其返回引數必須定義成 void。在μC/OS-Ⅱ中,當一個執行著的任務使一個比它優先順序高的任務進入了就緒態,當前任務的 CPU 使用權就會被搶佔,高優先順序任務會立刻得到 CPU 的控制權(在系統允許排程和任務切換的前提下)。μC/OS-Ⅱ可以管理多達 64 個任務,但目前版本的μC/OS-Ⅱ有兩個任務已經被系統佔用了(即空閒任務和統計任務)。必須給每個任務賦以不同的優先順序,任務的優先順序號就是任務編號(ID),優先順序可以從 0 到 OS_LOWEST_PR10-2。優先順序號越低,任務的優先順序越高。μC/OS-Ⅱ總是執行進入就緒態的優先順序最高的任務。 4. 源程式說明 (1) TaskStart任務

TaskStart 任務負責安裝作業系統的時鐘中斷服務例程、初始化作業系統時鐘,並建立所 有的應用任務:

UCOS_CPU_INIT(); /* Install uC/OS-II's clock tick ISR */ UCOS_TIMER_START(); /*Timer 初始化*/ TaskStartCreateTasks(); /* Create all the application tasks */ OSTaskSuspend(OS_PRIO_SELF);

具體負責應用任務建立的 TaskStartCreateTasks 函式程式碼如下,它建立了兩個應用任務 Task0 和 Task1:

void TaskStartCreateTasks (void) {

INT8U i;

for (i = 0; i

TaskData[i] = i; // Each task will display itsown information }

OSTaskCreate(Task0, (void *)&TaskData[0], &TaskStk[0][TASK_STK_SIZE1], 6); }

TaskStart 任務完成上述操作後將自己掛起,作業系統將排程當前優先順序最高的應用任務Task0 執行。 (2) 應用任務

應用任務 Task0 執行後將自己掛起,之後作業系統就會排程處於就緒狀態的優先順序最高的任務,具體程式碼如下: void Task0 (void *pdata) {

INT8U i; INT8U err; i=*(int *)pdata; for (;;) {

printf(“Application tasks switched %d times!nr”,++count);

printf(“TASK_0 IS RUNNING.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。nr”); printf(“task_1 is suspended!nr”);

printf(“**************************************************nr”); err=OSTaskSuspend(5); // suspend itself } }

應用任務 Task1 執行後將 Task0 喚醒,使其進入到就緒佇列中: void Task1 (void *pdata) {

INT8U i; INT8U err; i=*(int *)pdata; for (;;) {

OSTimeDly(150);

printf(“Application tasks switched %d times!nr”,++count); printf(“task_0 is suspended!nr”); printf(“TASK_1 IS RUNNING.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。nr”); printf(“**************************************************nr”); OSTimeDly(150);

err=OSTaskResume(5); /* resume task0 */ } }

三、執行及觀察應用輸出資訊

按照本實驗手冊第一部分所描述的方法建立應用專案並完成構建 ,當我們在 LambdaEDU 偵錯程式的控制下執行構建好的程式後,將看到在μC/OS-Ⅱ核心的排程管理下, 兩個應用任務不斷切換執行的情形:

四、本實驗中用到的µC/OS-Ⅱ相關函式

4.1 OSTaskCreate()

OSTaskCreate()建立一個新任務。任務的建立可以在多工環境啟動之前,也可以在 正在執行的任務中建立。中斷處理程式中不能建立任務。一個任務必須為無限迴圈結構,且 不能有返回點。

OSTaskCreate()是為與先前的μC/OS 版本保持相容,新增的特性在 OSTaskCreateExt ()函式中。

無論使用者程式中是否產生中斷,在初始化任務堆疊時,堆疊的結構必須與 CPU 中斷後 暫存器入棧的順序結構相同。詳細說明請參考所用處理器的手冊。 函式原型:

INT8U OSTaskCreate( void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio );

引數說明:

task 是指向任務程式碼首地址的指標。

pdata 指向一個數據結構,該結構用來在建立任務時向任務傳遞引數。

ptos 為指向任務堆疊棧頂的指標。任務堆疊用來儲存區域性變數,函式引數,返回地址 以及任務被中斷時的 CPU 暫存器內容。任務堆疊的大小決定於任務的需要及預計的中斷嵌 套層數。計算堆疊的大小,需要知道任務的區域性變數所佔的空間,可能產生巢狀呼叫的函式,及中斷巢狀所需空間。如果初始化常量 OS_STK_GROWTH 設為 1,堆疊被設為從記憶體高地址 向 低 地 址 增 長 , 此時 ptos 應 該 指 向任 務堆 棧 空 間 的 最 高 地 址 。 反 之 , 如 果OS_STK_GROWTH 設為 0,堆疊將從記憶體的低地址向高地址增長。prio 為任務的優先順序。每個任務必須有一個唯一的優先順序作為標識。數字越小,優先順序越高。 返回值:

OSTaskCreate()的返回值為下述之一:  OS_NO_ERR:函式呼叫成功。

 OS_PRIO_EXIST:具有該優先順序的任務已經存在。

 OS_PRIO_INVALID:引數指定的優先順序大於 OS_LOWEST_PRIO。  OS_NO_MORE_TCB:系統中沒有 OS_TCB 可以分配給任務了。 注意:

任務堆疊必須宣告為 OS_STK 型別。

在任務中必須呼叫μC/OS 提供的下述過程之一:延時等待、任務掛起、等待事件發生 (等待訊號量,訊息郵箱、訊息佇列),以使其他任務得到 CPU。 用 戶 程 序 中 不 能 使 用 優 先 級 0 , 1 , 2 , 3 , 以 及 OS_LOWEST_PRIO-3, OS_LOWEST_PRIO-2, OS_LOWEST_PRIO-1, OS_LOWEST_PRIO。這些優先順序μC/OS 系統

保留,其餘的 56 個優先順序提供給應用程式。 4.2 OSTaskSuspend()

OSTaskSuspend () 無條件掛起一個任務 。呼叫此函式的任務也可以傳遞引數

OS_PRIO_SELF,掛起呼叫任務本身。當前任務掛起後,只有其他任務才能喚醒。任務掛起 後,系統會重新進行任務排程,執行下一個優先順序最高的就緒任務。喚醒掛起任務需要呼叫 函式 OSTaskResume ()。

任務的掛起是可以疊加到其他操作上的。例如,任務被掛起時正在進行延時操作,那麼 任務的喚醒就需要兩個條件:延時的結束以及其他任務的喚醒操作。又如,任務被掛起時正 在等待訊號量,當任務從訊號量的等待對列中清除後也不能立即執行,而必須等到被喚醒後。 函式原型:

INT8U OSTaskSuspend( INT8U prio); 引數說明:

prio 為 指定要獲取掛起的任務優先順序,也可以指定引數 OS_PRIO_SELF,掛起任務本 身。此時,下一個優先順序最高的就緒任務將執行。 返回值:

OSTaskSuspend()的返回值為下述之一:  OS_NO_ERR:函式呼叫成功。

 OS_TASK_ SUSPEND_IDLE:試圖掛起 µC/OS-II 中的空閒任務(Idle task)。此為非法操作。

16  OS_PRIO_INVALID :引數指定的優先順序大於 OS_LOWEST_PRIO 或沒有設定  OS_PRIO_SELF 的值。

 OS_TASK_ SUSPEND _PRIO:要掛起的任務不存在。 注意:

在程式中 OSTaskSuspend()和 OSTaskResume ()應該成對使用。 用 OSTaskSuspend()掛起的任務只能用 OSTaskResume ()喚醒。 4.3 OSTaskResume()

OSTaskResume ()喚醒一個用 OSTaskSuspend()函式掛起的任務。OSTaskResume ()也是唯一能“解掛”掛起任務的函式。 函式原型:

INT8UOSTaskResume ( INT8U prio); 引數說明:

prio 指定要喚醒任務的優先順序。 返回值:

OSTaskResume ()的返回值為下述之一:  OS_NO_ERR:函式呼叫成功。

 OS_TASK_RESUME_PRIO:要喚醒的任務不存在。

 OS_TASK_NOT_SUSPENDED:要喚醒的任務不在掛起狀態。

 OS_PRIO_INVALID:引數指定的優先順序大於或等於 OS_LOWEST_PRIO。

五、實驗過程中遇到的問題及體會

實驗過程中體會到了嵌入式開發的樂趣,對上課老師所講的內容有了進一步的認識與理解。 17 實驗三 訊號量:哲學家就餐問題的實現

一、實驗目的

掌握在基於嵌入式實時作業系統 uC/OS-II 的應用中,任務使用訊號量的一般原理。通 過經典的哲學家就餐實驗,瞭解如何利用訊號量來對共享資源進行互斥訪問。

二、實驗原理及程式結構

1、實驗設計

掌握在基於嵌入式實時作業系統 uC/OS-II 的應用中,任務使用訊號量的一般原理。通 過經典的哲學家就餐實驗,瞭解如何利用訊號量來對共享資源進行互斥訪問。 2. 源程式說明

五個哲學家任務(ph1、ph2、ph3、ph4、ph5)主要有兩種過程:思考(即睡眠一段時

間)和就餐。每個哲學家任務在就餐前必須申請並獲得一左一右兩支筷子,就餐完畢後釋放 這兩支筷子。五個哲學家圍成一圈,每兩人之間有一支筷子。一共有五支筷子,在該實驗中 用了五個互斥訊號量來代表。每個任務的程式碼都一樣,如下所示: void Task (void *pdata) {

INT8U err; INT8U i; INT8U j;

i=*(int *)pdata; j=(i+1) % 5;

uC/OS-II 實驗指導書 for (;;) {

TaskThinking2Hungry(i); OSSemPend(fork[i], 0, &err);

OSSemPend(fork[j], 0, &err); /* Acquire semaphores to eat */ TaskEat(i);

OSSemPost(fork[j]);

OSSemPost(fork[i]); /* Release semaphore */ OSTimeDly(200); /* Delay 10 clock tick */ } }

作業系統配置

修改 uC_OS-II/OS_CFG.h: :: :

#define OS_MAX_EVENTS 10 /*最多可以有 10 個事件*/ #define OS_MAX_FLAGS 5 /*最多可以有 5 個事件標誌*/

#define OS_MAX_MEM_PART 5 /*最多可以劃分 5 個記憶體塊*/ #define OS_MAX_QS 2 /*最多可以使用 2 個佇列*/ #define OS_MAX_TASKS 8 /*最多可以建立 8 個任務*/

#define OS_LOWEST_PRIO 14 /*任務優先順序不可以大於 14*/ #define OS_TASK_IDLE_STK_SIZE 1024 /*空閒任務堆疊大小*/ #define OS_TASK_STAT_EN 1 /*是否允許使用統計任務*/ #define OS_TASK_STAT_STK_SIZE 1024 /*統計任務堆疊大小*/ #define OS_FLAG_EN 1 /*是否允許使用事件標誌功能*/

#define OS_FLAG_WAIT_CLR_EN 1 /*是否允許等待清除事件標誌*/ #define OS_FLAG_ACCEPT_EN 1 /*是否允許使用 OSFlagAccept()*/ #define OS_FLAG_DEL_EN 1 /*是否允許使用 OSFlagDel()*/

#define OS_FLAG_QUERY_EN 1 /*是否允許使用 OSFlagQuery()*/ #define OS_MBOX_EN 0 /*是否允許使用郵箱功能*/

#define OS_MEM_EN 0 /*是否允許使用記憶體管理的功能*/

#define OS_MUTEX_EN 0 /*是否允許使用互斥訊號量的功能*/ #define OS_Q_EN 0 /*是否允許使用佇列功能*/ #define OS_SEM_EN 1 /*是否允許使用訊號量功能*/

#define OS_SEM_ACCEPT_EN 1 /*是否允許使用 OSSemAccept()*/ #define OS_SEM_DEL_EN 1 /*是否允許使用OSSemDel() */

#define OS_SEM_QUERY_EN 1 /*是否允許使用OSSemQuery()*/ #define OS_TASK_CHANGE_PRIO_EN 1 /* 是 否 允 許 使 用 OSTaskChangePrio()*/

#define OS_TASK_CREATE_EN 1 /*是否允許使用 OSTaskCreate()*/

#define OS_TASK_CREATE_EXT_EN 1 /*是否允許使用 OSTaskCreateExt()*/ #define OS_TASK_DEL_EN 1 /*是否允許使用 OSTaskDel()*/

#define OS_TASK_SUSPEND_EN 1 /* 是 否 允 許 使 用 OSTaskSuspend() and OSTaskResume()*/

#define OS_TASK_QUERY_EN 1 /*是否允許使用 OSTaskQuery()*/ #define OS_TIME_DLY_HMSM_EN 1 /* 是 否 允 許 使 用 OSTimeDlyHMSM()*/

#define OS_TIME_DLY_RESUME_EN 1 /* 是 否 允 許 使 用 OSTimeDlyResume()*/

#define OS_TIME_GET_SET_EN 1 /* 是否允許使用 OSTimeGet() 和 OSTimeSet()*/

#define OS_SCHED_LOCK_EN 1 /* 是 否 允 許 使 用 OSSchedLock() 和 OSSchedUnlock()*/

#define OS_TICKS_PER_SEC 200 /*設定每秒之內的時鐘節拍數目*/

三、執行及觀察應用輸出資訊

開始,所有的哲學家先處於 thinking 狀態,然後都進入 hungry 狀態:

後首先獲得兩個訊號量的 1、3 號哲學家開始 eating,待他們釋放相關訊號量之後,哲

學家 2、5、4 獲得所需的訊號量並 eating: 應用如此這般地迴圈執行程式下去„„

19

四、本實驗中用到的µC/OS-Ⅱ相關函式

4.1 OSSemCreate()

OSSemCreate()函式建立並初始化一個訊號量。訊號量的作用如下:  允許一個任務和其他任務或者中斷同步  取得裝置的使用權  標誌事件的發生

函式原型:

OS_EVENT *OSSemCreate( (( (WORD value) )) ) 引數說明:

value 引數是所建立的訊號量的初始值,可以取 0 到 65535 之間的任何值。 返回值:

OSSemCreate()函式返回指向分配給所建立的訊號量的控制塊的指標。如果沒有可用的 控制塊,OSSemCreate()函式返回空指標。 注意:

必須先建立訊號量,然後使用。 4.2 OSSemPend()

OSSemPend()函式用於任務試圖取得裝置的使用權,任務需要和其他任務或中斷同

步,任務需要等待特定事件的發生的場合。如果任務呼叫 OSSemPend()函式時,訊號量 的值大於零,OSSemPend()函式遞減該值並返回該值。如果呼叫時訊號量等於零,

OSSemPend()函式函式將任務加入該訊號量的等待佇列。OSSemPend()函式掛起當前 任務直到其他的任務或中斷置起訊號量或超出等待的預期時間。如果在預期的時鐘節拍內信 號量被置起,μC/OS-Ⅱ預設最高優先順序的任務取得訊號量恢復執行。一個被 OSTaskSuspend ()函式掛起的任務也可以接受訊號量,但這個任務將一直保持掛起狀態直到通過呼叫 OSTaskResume()函式恢復任務的執行。 函式原型: :: :

Void OSSemPend ( OS_EVNNT *pevent, INT16U timeout, int8u *err ); 引數說明: :: :

pevent

是指向訊號量的指標。該指標的值在建立該訊號量時可以得到。( 參考 OSSemCreate()函式)。

Timeout

允許一個任務在經過了指定數目的時鐘節拍後還沒有得到需要的訊號量時 恢復就緒狀態。如果該值為零表示任務將持續地等待訊號量,最大的等待時間為 65535 個時

鍾節拍。這個時間長度並不是非常嚴格的,可能存在一個時鐘節拍的誤差。

Err 是指向包含錯誤碼的變數的指標。OSSemPend()函式返回的錯誤碼可能為下述幾 種:

 OS_NO_ERR :訊號量不為零。

 OS_TIMEOUT :訊號量沒有在指定數目的時鐘週期內被設定。

 OS_ERR_PEND_ISR :從中斷呼叫該函式。雖然規定了不允許從中斷呼叫該函式,

但 µC/OS-Ⅱ仍然包含了檢測這種情況的功能。

OS_ERR_EVENT_TYPE :pevent 不是指向訊號量的指標。 返回值: 無 注意:

必須先建立訊號量,然後使用。 不允許從中斷呼叫該函式。

4.3 OSSemPost()

OSSemPost()函式置起指定的訊號量。如果指定的訊號量是零或大於零,OSSemPost () 函式遞增該訊號量並返回。如果有任何任務在等待訊號量,最高優先順序的任務將得到信

號量並進入就緒狀態。任務排程函式將進行任務排程,決定當前執行的任務是否仍然為最高 優先順序的就緒狀態的任務。 函式原型:

INT8U OSSemPost(OS_EVENT *pevent); 引數說明:

pevent

是指向訊號量的指標。該指標的值在建立該訊號量時可以得到。( 參考 OSSemCreate()函式)。 返回值:

OSSemPost()函式的返回值為下述之一: 

OS_NO_ERR :訊號量被成功地設定 

OS_SEM_OVF :訊號量的值溢位

OS_ERR_EVENT_TYPE :pevent 不是指向訊號量的指標 注意:

必須先建立訊號量,然後使用。 4.4 OSTimeDly()

OSTimeDly()將一個任務延時若干個時鐘節拍。如果延時時間大於 0,系統將立即進 行任務排程。延時時間的長度可從 0 到 65535 個時鐘節拍。延時時間 0 表示不進行延時,函

21 數將立即返回呼叫者。延時的具體時間依賴於系統每秒鐘有多少時鐘節拍(由檔案 SO_CFG.H 中的常量 OS_TICKS_PER_SEC 設定)。 函式原型:

void OSTimeDly ( INT16U ticks); 引數說明:

ticks 為要延時的時鐘節拍數。 返回值:

注意:

注意到延時時間 0 表示不進行延時操作,而立即返回呼叫者。為了確保設定的延時時間, 建議使用者設定的時鐘節拍數加 1。例如,希望延時 10 個時鐘節拍,可設定引數為 11。

五、實驗過程中遇到的問題及體會

在實驗前要對該問題進行深入的理解,即五個哲學家任務(ph1、ph2、ph3、ph4、ph5)主要有兩種過程:思考(即睡眠一段時間)和就餐。每個哲學家任務在就餐前必須申請並獲得一左一右兩支筷子,就餐完畢後釋放這兩支筷子。五個哲學家圍成一圈,每兩人之間有一支筷子。只有理解了,才能更好的進行實驗。

22

作業系統實驗報告 篇二

1.實習目的

(一).通過綜合實訓進一步鞏固、深化和擴充套件學生的專業技能。

1.熟練掌握Linux作業系統的安裝及基本配置。

2.熟練掌握Linux系統管理。

3.掌握Linux下使用者和組的管理。

4.掌握Linux下FTP伺服器的管理。

(二)訓練和培養學生獲取資訊和處理資訊的能力,充分培養和提高學生的動手能力,學會通過網站、書籍等方式收集所需的。資料。

(三)培養學生運用所學的知識和技能解決Linux使用、管理過程中所遇到的實際問題的能力及其基本工作素質。

(四)培養學生理論聯絡實際的工作作風、嚴肅認真的科學態度以及獨立工作的能力,樹立自信心。

(五)訓練和培養學上的團隊協作精神與合作能力。

2 實習概況

2.1 實習要求

具體來講,《linux作業系統》課程包括以下實習內容:

(一)獨立完成實訓。

(二)要求熟練掌握Linux作業系統的安裝與基本配置。

(三)熟練掌握Linux系統管理基本方法。

(四)掌握Linux下使用者和組的管理。。

(五)掌握Linux下的FTP伺服器的管理。

2.2 實習時間

20XX年12月16日至20XX年12月20日

2.3 實習基本情況

實習地點:四教學樓 4112、4212、4312、4412

實習環境 :RedHat9軟體

實習內容:掌握linux作業系統

2.4 硬體環境

3 實習內容

3.1 linux安裝 Linux是一類Unix計算機作業系統的統稱。Linux 是以Unix 作業系統為原型的多工、多使用者的系統。可運行於多種硬體平臺:PC、Alpha、SPARC、

POWER PC。 今天實習的主要內容是學習瞭解Linux的安裝過程;Linux登入和退出 ,熟悉Linux作業系統的圖形介面

(一)Linux的安裝過程

1)VMware軟體的安裝

因為我用的是機房的電腦,所以不用安裝VMware軟體。如果要安裝,過程十分簡單,下載完畢,直接“Next”即可完成安裝。

2)虛擬機器的安裝。開啟VMware軟體,單擊“新建虛擬機器”命令根據提示選擇一種要安裝的作業系統,一般選擇典型設定,然後直接按“下一步”即可。需要注意的就是在分割槽的時候需按要求建立合適的分割槽,如下圖所示。

圖3-1-1 選擇分割槽

3)Red Hat Linux 9.0安裝

首先單擊“編輯虛擬機器設定”,改寫映象為“linux9cd1”,然後返回初始介面。點選“啟動該虛擬機器”,便進入到軟體的安裝過程。開始是“歡迎使Red Hat Linux”介面,然後經歷語言選擇、鍵盤配置、滑鼠配置、磁碟分割槽設定、選擇軟體包組、安裝軟體包等操作後,然後是虛擬機器安裝完第一張盤後要進行第二張盤的安裝,如圖3-2經過老師的指點,按住“Ctrl+Alt”,將滑鼠調出,雙擊右下方工作列第一個按鈕,依次選擇第二、三映象,繼續安裝,便安裝成功了。如圖3-3。

作業系統實驗報告 篇三

一、實驗目的

本實驗要求學生模擬作業排程的實現,用高階語言編寫和除錯一個或多個作業排程的模擬程式,瞭解作業排程在作業系統中的作用,以加深對作業排程演算法的理解。

二、實驗內容和要求

1、編寫並排程一個多道程式系統的作業排程模擬程式。

作業排程演算法:採用基於先來先服務的排程演算法。可以參考課本中的方法進行設計。 對於多道程式系統,要假定系統中具有的各種資源及數量、排程作業時必須考慮到每個作業的資源要求。

三、實驗主要儀器裝置和材料

硬體環境:IBM-PC或相容機

軟體環境:C語言程式設計環境

四、實驗原理及設計方案

採用多道程式設計方法的作業系統,在系統中要經常保留多個執行的作業,以提高系統效率。作業排程從系統已接納的暫存在輸入井中的一批作業中挑選出若干個可執行的作業,併為這些被選中的作業分配所需的系統資源。對被選中執行的作業必須按照它們各自的作業說明書規定的步驟進行控制。

採用先來先服務演算法演算法模擬設計作業排程程式。

(1)、作業排程程式負責從輸入井選擇若干個作業進入主存,為它們分配必要的資源,當它們能夠被程序排程選中時,就可佔用處理器執行。作業排程選擇一個作業的必要條件是系統中現有的尚未分配的資源可滿足該作業的資源要求。但有時系統中現有的尚未分配的資源既可滿足某個作業的要求也可滿足其它一些作業的'要求,那麼,作業排程必須按一定的演算法在這些作業中作出選擇。先來先服務演算法是按照作業進入輸入井的先後次序來挑選作業,先進入輸入井的作業優先被挑選,當系統中現有的尚未分配的資源不能滿足先進入輸入井的作業時,那麼順序挑選後面的作業。

(2) 假定某系統可供使用者使用的主存空間共100k,並有5臺磁帶機。

(3)流程圖:

五、結果過程及截圖

讀取檔案來初始化主存,磁帶機的個數,並打印出來。

初始時間是9:00:

按Y執行5分鐘:

按Y執行5分鐘:

按Y執行5分鐘:

多次執行後最後狀態:

六、所遇困難的解決以及心得體會

這個實驗是花的時間最多的一個實驗,第一次做的時候由於理解有些問題,所以做錯了。之後重新做了一遍,收穫還是很多的,遇到了很多的細節問題,例如像是時間化成浮點數和浮點數化成時間等一些問題,從中也暴露了自己的程式設計能力欠缺,之後要多多的寫程式。

七、思考題

1、寫出每種演算法的排程策略,最後比較各種演算法的優缺點。

答:先來先服務演算法是根據作業的進入時間來排序,到達時間短的先執行,優點是實現簡單,缺點是執行時間慢。

短作業優先演算法是根椐作業的估計執行時間來排序,估計執行時間短的先執行,優點是執行時間快,缺點是實現起來比較複雜。

2、選擇排程演算法的依據是什麼?

答:如果作業要求的速度不高,而且作業比較小型,那就最好用先來先服務演算法。

如果作業要求的速度高,作業流程複雜,那就最好用短作業優先演算法。

八、原始碼

#include

#include

#include

#include

#define getjcb() (JCB*)malloc(sizeof(JCB))

typedef struct {//資源的總量

int memory; int tape;

}RESOURCE;

typedef struct JCB {//作業控制塊

char username[20];//使用者名稱

char jobname[10];//作業名

char state;//作業狀態 char atime[5];//到達時間 float rtime;//執行時間 RESOURCE resource;//資源數量 struct JCB*link; }JCB;

RESOURCE source = {100,5};

JCB *pjcb =getjcb();//作業連結串列頭

char nowtime[5];//現在時間,初始時間為9:00

FILE* ignore(FILE *fp)//忽略檔案中的空白符

{

if(feof(fp)) return fp; char ch = fgetc(fp); while (!feof(fp) && (ch == || ch == )){ ch = fgetc(fp); } //if(!feof(fp)) return fp; fseek(fp, -1, SEEK_CUR);

return fp;

}

FILE* findFILE *fp,char c)//在檔案中找到一個字元的位置(讀取檔案時用) {

if(feof(fp)) return fp; char ch = fgetc(fp); while (!feof(fp) && (ch != c)){ } ch = fgetc(fp); fseek(fp, -1, SEEK_CUR); return fp;

}

void destory()//釋放連結串列所佔的記憶體

{

JCB *p = pjcb->link; while(pjcb){ free(pjcb); pjcb = p; if(p) p = p->link;

}

}

float stof(char *time)//把時間轉化為浮點型數

{

float h = 0, m = 0; int i = 0; while(time[i] != :){ h = h*10 + time[i] - 0; } i++; while(time[i] != ){ m = m*10 + time[i] - 0; } i++; i++;

return (h + m/60);

}

char* ftos(double ftime)//把浮點型數值轉化為時間

{

}

float timesub(char *time1, char *time2)//兩個時間相減,得到時間差

{

}

void print()//列印輸出

{

JCB *p = pjcb->link; printf(

p->atime, p->rtime, p->,p->);

}

void sendsource()//為作業分配資源

{

JCB *p; p = pjcb->link; while(p){//為到達的作業排程 p = p->link; }

if(p->state == W && - p->>=0 && - p-> >=0){

} } p = p->link; p->state = R; -= p->; -= p->; printf(

}

void init()//初始化,讀取檔案中的作業資訊

{

FILE *fp; JCB *p= NULL,*q = pjcb ; if((fp = fopen(

} } fp = ignore(fp); p->rtime = 0;//不初始化則會發生錯誤,????? fscanf(fp,

int checkend() //檢查是否所有的作業都已經執行完了

{

JCB *p = pjcb ->link; while(p){ if(p ->state != F){ return 0; } p = p->link; } return 1;

}

void run()//執行作業

{

if(checkend()){//檢查是否所有的作業都已經執行完了 printf(

}

} p = p->link; } p = pjcb ->link; while(p){//計算到達的作業 if( strcmp(nowtime, p->atime) ==0 && p->state == N){ p->state = W; printf(

int main()

{

char ch;

double time =9.00;

}

double step = float(5)/60+0.00001; ftos(9.0); init(); do{ run(); puts(