版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、實驗一嵌入式開發(fā)環(huán)境的建立一、實驗?zāi)康耐ㄟ^此實驗系統(tǒng),讀者可以了解嵌入式實時操作系統(tǒng)uC/OS-II的內(nèi)核機制和運行原理。本實驗系統(tǒng)展示了uC/OS-II各方面的管理功能,包括信號量、隊列、內(nèi)存、時鐘等。在各個實驗中具體介紹了uC/OS-II的相關(guān)函數(shù)。讀者在做實驗的同時能夠結(jié)合理論知識加以分析,了解各個函數(shù)的作用和嵌入式應(yīng)用程序的設(shè)計方法,最終對整個uC/OS-II和嵌入式操作系統(tǒng)的應(yīng)用有較為清楚的認識。二、實驗步驟1. 安裝集成開發(fā)環(huán)境LambdaEDU集成開發(fā)環(huán)境 LambdaEDU的安裝文件夾為LambdaEDU ,其中有一個名為“Setup.exe ”的文件,直接雙擊該文件便可啟動安
2、裝過程。具體的安裝指導(dǎo)請看“LambdaEDU 安裝手冊.doc ”文件。當(dāng) LambdaEDU 安裝完畢之后,我們看到的是一個空的界面,現(xiàn)在就開始一步一步地將我們的實驗項目建立并運行起來。2. 建立項目為了我們的實驗運行起來,需要建立 1 個項目基于 x86 虛擬機的標準應(yīng)用項目。通過點擊“文件”、“新建”、“項目”開始根據(jù)向?qū)?chuàng)建一個項目。在隨后出現(xiàn)的對話框中選擇“ Tool/ 標準應(yīng)用項目”,點擊下一步,開始創(chuàng)建一個標準的可執(zhí)行的應(yīng)用程序項目。在隨后出現(xiàn)的對話框中填入項目名稱“ucos_x86_demo”。點擊“下一步”。1/23選擇“ pc386 uC/OS-II應(yīng)用 (x86) ”作
3、為該項目的應(yīng)用框架。點擊“下一步”選擇“ pc386_elf_tra_debug”作為該項目的基本配置。點擊“完成”。2/23新創(chuàng)建的項目“ucos_x86_demo”將會被添加到項目列表。src文件夾下保存了該項目中包含的源文件。ucos2 文件夾中包含了移植到x86 虛擬機的全部代碼。init.c文件是基于ucos2和本虛擬機的一個應(yīng)用程序。在進行ucos2 內(nèi)核實驗中,只需要替換init.c文件,即可。文件名不限,但是文件名中最好不要使用英文符號和數(shù)字以外的其他字符,3/233. 構(gòu)建項目到這里,項目配置全部完成。接下來就可以進行構(gòu)建項目了。第一次構(gòu)建本項目,在此項目上點擊右鍵,選擇“重
4、建BSP 及項目”。即可開始構(gòu)建。之后彈出的對話框顯示了構(gòu)建的進度??梢渣c擊“在后臺運行”,以隱藏該對話框在構(gòu)建的同時,在右下角的“構(gòu)建信息”視圖輸出構(gòu)建過程中的詳細信息:4/23注:“重新構(gòu)建”將本項目中的全部源代碼進行一次完全的編譯和連接,花費時間較多。“構(gòu)建項目”則僅僅將新修改過的源代碼進行編譯和連接,花費時間最少?!爸亟˙SP及項目”,不但要完成“重新構(gòu)建”的全部工作,另外還要編譯與該項目有關(guān)的的LambdaEDU中內(nèi)置的部分代碼,花費時間最多。但是在項目剛建立后,第一次構(gòu)建時需要選擇“重建 BSP 及項目”。以后的構(gòu)建中選擇“重新構(gòu)建”或“構(gòu)建項目”即可。另外,在替換了源代碼中的文件
5、后,需要選擇“重新構(gòu)建”來完成該項目的構(gòu)建。4. 配置虛擬機和目標機代理(1) 制作 X86 啟動盤在 LambdaEDU 中依次點擊“工具”、“Bochs”、“制作虛擬機啟動映象”。5/23對啟動盤進行一些參數(shù)設(shè)置后(如下圖所示),系統(tǒng)將自動為你生成一個PC 虛擬機的啟動盤映像。(2) 配置虛擬機6/23選擇使用的網(wǎng)絡(luò)適配器(網(wǎng)卡)后,點擊“確定”完成配置。注意:如果計算機上有多網(wǎng)卡,請將其他網(wǎng)卡停用(包括 VMware 虛擬機添加的虛擬網(wǎng)卡)。(3) 創(chuàng)建目標機代理配置好虛擬機后,創(chuàng)建目標機代理:點擊 LambdaEDU左下方窗口中綠色的十字符號,在彈出的窗口中選擇“基于 TA 的連接方式
6、”,并點擊“下一步”。在彈出的“新目標機連接配置中”的這些參數(shù),應(yīng)該與之前制作啟動盤時設(shè)置的參數(shù)一致。7/23注意:名字:輸入目標機的名字(缺省是 default ),注意如果和現(xiàn)有目標機重名的話,改個名字。連接類型:默認選擇UDPIP 地址:這里輸入目標機(在本實驗系統(tǒng)中是虛擬機)的IP 地址;最后點擊“確定”,在目標機管理窗口中,可以看到新增加了一個名為default的目標機節(jié)點(4) 調(diào)試應(yīng)用啟動虛擬機。8/23虛擬機啟動后的畫面如下(其中顯示的IP 地址創(chuàng)建虛擬機啟動盤時填入的IP 地址)中設(shè)置的 IP 地址):在成功完成構(gòu)建的項目 ucos_x86_demo 中的“ pc386_el
7、f_tra_debug ”上點擊鼠標右鍵,在彈出的菜單中選擇“調(diào)試”,啟動調(diào)試器調(diào)試生成的程序:9/23第一次進行調(diào)試 / 運行,需要選擇目標機,如下圖,選擇“ Default ”,點擊“確定”,開始向目標機(虛擬機)下載應(yīng)用程序。10/23程序下載完成后,會彈出一個“確認透視圖切換”對話框,選擇“是”,切換到調(diào)試透視圖。調(diào)試的界面如下:點擊綠色的按鈕,全速運行。注意:全速運行后,程序不能夠被暫停和停止。11/23三、實驗過程中遇到的問題及體會在設(shè)置 IP 地址時,要求該IP 地址與本計算機在同一個子網(wǎng)中,同時要求該IP 地址沒有被網(wǎng)絡(luò)上其他計算機使用。此外,通過構(gòu)建開發(fā)環(huán)境,處次體驗到了嵌入
8、式開發(fā)工作的樂趣。12/23實驗二 任務(wù)的基本管理一、實驗?zāi)康?.理解任務(wù)管理的基本原理,了解任務(wù)的各個基本狀態(tài)及其變遷過程;2.掌握uC/OS-II中任務(wù)管理的基本方法(創(chuàng)建、啟動、掛起、解掛任務(wù));3. 熟練使用uC/OS-II任務(wù)管理的基本系統(tǒng)調(diào)用。二、實驗原理及程序結(jié)構(gòu)1. 實驗設(shè)計為了展現(xiàn)任務(wù)的各種基本狀態(tài)及其變遷過程,本實驗設(shè)計了Task0、 Task1 兩個任務(wù):任務(wù)Task0 不斷地掛起自己,再被任務(wù)Task1 解掛,兩個任務(wù)不斷地切換執(zhí)行。通過本實驗,讀者可以清晰地了解到任務(wù)在各個時刻的狀態(tài)以及狀態(tài)變遷的原因。2. 運行流程描述如下:(1)系統(tǒng)經(jīng)歷一系列的初始化過程后進入bo
9、ot_card()函數(shù),在其中調(diào)用ucBsp_init() 進行板級初始化后,調(diào)用main() 函數(shù);(2) main() 函數(shù)調(diào)用OSInit() 函數(shù)對uC/OS-II內(nèi)核進行初始化,調(diào)用OSTaskCreate 創(chuàng)建起始任務(wù)TaskStart;( 3) main() 函數(shù)調(diào)用函數(shù) OSStart()啟動 uC/OS-II 內(nèi)核的運行,開始多任務(wù)的調(diào)度,執(zhí)行當(dāng)前優(yōu)先級最高的就緒任務(wù)TaskStart;( 4) TaskStart 完成如下工作:a、安裝時鐘中斷并初始化時鐘,創(chuàng)建2 個應(yīng)用任務(wù);b、掛起自己 (不再被其它任務(wù)喚醒),系統(tǒng)切換到當(dāng)前優(yōu)先級最高的就緒任務(wù)Task0。之后整個系統(tǒng)的
10、運行流程如下:t1 時刻, Task0 開始執(zhí)行,它運行到t2 時刻掛起自己;t2 時刻,系統(tǒng)調(diào)度處于就緒狀態(tài)的優(yōu)先級最高任務(wù)Task1 執(zhí)行,它在t3 時刻喚醒Task0,后者由于優(yōu)先級較高而搶占CPU;Task0 執(zhí)行到t4 時刻又掛起自己,內(nèi)核調(diào)度Task1 執(zhí)行;Task1 運行至t5 時刻再度喚醒Task0;3. C/OS-中的任務(wù)描述一個任務(wù)通常是一個無限的循環(huán),由于任務(wù)的執(zhí)行是由操作系統(tǒng)內(nèi)核調(diào)度的,因此任務(wù)是絕不會返回的,其返回參數(shù)必須定義成void 。在 C/OS-中,當(dāng)一個運行著的任務(wù)使一個比它優(yōu)先級高的任務(wù)進入了就緒態(tài),當(dāng)前任務(wù)的CPU 使用權(quán)就會被搶占,高優(yōu)先級任務(wù)會立刻
11、得到CPU 的控制權(quán) (在系統(tǒng)允許調(diào)度和任務(wù)切換的前提下)。 C/OS-可以管理多達64 個任務(wù),但目前版本的C/OS- 有兩個任務(wù)已經(jīng)被系統(tǒng)占用了(即空閑任務(wù)和統(tǒng)計任務(wù))。必須給每個任務(wù)賦以不同的優(yōu)先級,任務(wù)的優(yōu)先級號就是任務(wù)編號( ID ),優(yōu)先級可以從 0 到 OS_LOWEST_PR10-2 。優(yōu)先級號越低, 任務(wù)的優(yōu)先級越高。 C/OS-總是運行進入就緒態(tài)的優(yōu)先級最高的任務(wù)。4. 源程序說明(1) TaskStart 任務(wù)TaskStart 任務(wù)負責(zé)安裝操作系統(tǒng)的時鐘中斷服務(wù)例程、初始化操作系統(tǒng)時鐘,并創(chuàng)建所有的應(yīng)用任務(wù):UCOS_CPU_INIT(); /* Install uC/
12、OS-II's clock tick ISR */UCOS_TIMER_START(); /*Timer初始化 */13/23TaskStartCreateTasks(); /* Create all the application tasks */OSTaskSuspend(OS_PRIO_SELF);具體負責(zé)應(yīng)用任務(wù)創(chuàng)建的TaskStartCreateTasks 函數(shù)代碼如下,它創(chuàng)建了兩個應(yīng)用任務(wù)Task0 和 Task1:void TaskStartCreateTasks (void)INT8U i;for (i = 0; i < N_TASKS; i+) / Create
13、 tasksTaskDatai = i; / Each task will display itsown informationOSTaskCreate(Task0, (void *)&TaskData0, &TaskStk0TASK_STK_SIZE - 1, 5); OSTaskCreate(Task1, (void *)&TaskData1, &TaskStk1TASK_STK_SIZE - 1, 6);TaskStart 任務(wù)完成上述操作后將自己掛起,操作系統(tǒng)將調(diào)度當(dāng)前優(yōu)先級最高的應(yīng)用任務(wù)Task0 運行。(2) 應(yīng)用任務(wù)應(yīng)用任務(wù) Task0 運行后將自
14、己掛起,之后操作系統(tǒng)就會調(diào)度處于就緒狀態(tài)的優(yōu)先級最高的任務(wù),具體代碼如下: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); /
15、suspend itself應(yīng)用任務(wù)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");14/23printf("TASK_1 IS RUNNING.nr");printf("*nr&
16、quot;);OSTimeDly(150);err=OSTaskResume(5); /* resume task0 */三、運行及觀察應(yīng)用輸出信息按照本實驗手冊第一部分所描述的方法建立應(yīng)用項目并完成構(gòu)建,當(dāng)我們在LambdaEDU 調(diào)試器的控制下運行構(gòu)建好的程序后, 將看到在 C/OS-內(nèi)核的調(diào)度管理下,兩個應(yīng)用任務(wù)不斷切換執(zhí)行的情形:四、本實驗中用到的C/OS- 相關(guān)函數(shù)4.1 OSTaskCreate()OSTaskCreate()建立一個新任務(wù)。任務(wù)的建立可以在多任務(wù)環(huán)境啟動之前,也可以在正在運行的任務(wù)中建立。 中斷處理程序中不能建立任務(wù)。 一個任務(wù)必須為無限循環(huán)結(jié)構(gòu), 且不能有返回點
17、。OSTaskCreate()是為與先前的C/OS 版本保持兼容,新增的特性在OSTaskCreateExt()函數(shù)中。無論用戶程序中是否產(chǎn)生中斷,在初始化任務(wù)堆棧時,堆棧的結(jié)構(gòu)必須與 CPU 中斷后寄存器入棧的順序結(jié)構(gòu)相同。詳細說明請參考所用處理器的手冊。函數(shù)原型:INT8U OSTaskCreate( void (*task)(void *pd),void *pdata,OS_STK *ptos,15/23INT8U prio);參數(shù)說明:task 是指向任務(wù)代碼首地址的指針。pdata 指向一個數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)用來在建立任務(wù)時向任務(wù)傳遞參數(shù)。ptos 為指向任務(wù)堆棧棧頂?shù)闹羔?。任?wù)堆棧用
18、來保存局部變量,函數(shù)參數(shù),返回地址以及任務(wù)被中斷時的CPU 寄存器內(nèi)容。 任務(wù)堆棧的大小決定于任務(wù)的需要及預(yù)計的中斷嵌套層數(shù)。計算堆棧的大小, 需要知道任務(wù)的局部變量所占的空間,可能產(chǎn)生嵌套調(diào)用的函數(shù),及中斷嵌套所需空間。如果初始化常量OS_STK_GROWTH設(shè)為1,堆棧被設(shè)為從內(nèi)存高地址 向 低 地 址 增 長 , 此時 ptos 應(yīng) 該 指 向任 務(wù)堆 棧 空 間 的 最 高 地 址 。反 之 , 如 果 OS_STK_GROWTH 設(shè)為 0,堆棧將從內(nèi)存的低地址向高地址增長。 prio 為任務(wù)的優(yōu)先級。每個任務(wù)必須有一個唯一的優(yōu)先級作為標識。數(shù)字越小,優(yōu)先級越高。返回值:OSTaskC
19、reate()的返回值為下述之一:OS_NO_ERR :函數(shù)調(diào)用成功。OS_PRIO_EXIST :具有該優(yōu)先級的任務(wù)已經(jīng)存在。OS_PRIO_INV ALID :參數(shù)指定的優(yōu)先級大于OS_LOWEST_PRIO 。OS_NO_MORE_TCB :系統(tǒng)中沒有OS_TCB可以分配給任務(wù)了。注意:任務(wù)堆棧必須聲明為OS_STK類型。在任務(wù)中必須調(diào)用C/OS 提供的下述過程之一:延時等待、任務(wù)掛起、等待事件發(fā)生(等待信號量,消息郵箱、消息隊列),以使其他任務(wù)得到CPU。用戶程序中不能使用優(yōu)先級 0 ,1 ,2 ,3 ,以及 OS_LOWEST_PRIO-3,OS_LOWEST_PRIO-2, OS_
20、LOWEST_PRIO-1, OS_LOWEST_PRIO 。這些優(yōu)先級 C/OS 系統(tǒng)保留,其余的56 個優(yōu)先級提供給應(yīng)用程序。4.2 OSTaskSuspend()OSTaskSuspend ()無條件掛起一個任務(wù)。調(diào)用此函數(shù)的任務(wù)也可以傳遞參數(shù)OS_PRIO_SELF ,掛起調(diào)用任務(wù)本身。當(dāng)前任務(wù)掛起后,只有其他任務(wù)才能喚醒。任務(wù)掛起后,系統(tǒng)會重新進行任務(wù)調(diào)度,運行下一個優(yōu)先級最高的就緒任務(wù)。喚醒掛起任務(wù)需要調(diào)用函數(shù)OSTaskResume()。任務(wù)的掛起是可以疊加到其他操作上的。例如,任務(wù)被掛起時正在進行延時操作,那么任務(wù)的喚醒就需要兩個條件:延時的結(jié)束以及其他任務(wù)的喚醒操作。又如,任
21、務(wù)被掛起時正在等待信號量, 當(dāng)任務(wù)從信號量的等待對列中清除后也不能立即運行,而必須等到被喚醒后。函數(shù)原型:INT8U OSTaskSuspend( INT8U prio);參數(shù)說明:prio 為指定要獲取掛起的任務(wù)優(yōu)先級,也可以指定參數(shù)OS_PRIO_SELF ,掛起任務(wù)本身。此時,下一個優(yōu)先級最高的就緒任務(wù)將運行。返回值:OSTaskSuspend()的返回值為下述之一:OS_NO_ERR :函數(shù)調(diào)用成功。OS_TASK_ SUSPEND_IDLE:試圖掛起C/OS-II中的空閑任務(wù) ( Idle task)。此為非法操作。16/23OS_PRIO_INV ALID:參數(shù)指定的優(yōu)先級大于OS
22、_LOWEST_PRIO或沒有設(shè)定OS_PRIO_SELF的值。OS_TASK_ SUSPEND _PRIO :要掛起的任務(wù)不存在。注意:在程序中OSTaskSuspend()和OSTaskResume()應(yīng)該成對使用。用 OSTaskSuspend()掛起的任務(wù)只能用OSTaskResume ()喚醒。4.3 OSTaskResume()OSTaskResume()喚醒一個用OSTaskSuspend()函數(shù)掛起的任務(wù)。OSTaskResume()也是唯一能“解掛”掛起任務(wù)的函數(shù)。函數(shù)原型:INT8UOSTaskResume ( INT8U prio);參數(shù)說明:prio 指定要喚醒任務(wù)的優(yōu)
23、先級。返回值:OSTaskResume ()的返回值為下述之一:OS_NO_ERR :函數(shù)調(diào)用成功。OS_TASK_RESUME_PRIO :要喚醒的任務(wù)不存在。OS_TASK_NOT_SUSPENDED :要喚醒的任務(wù)不在掛起狀態(tài)。OS_PRIO_INV ALID :參數(shù)指定的優(yōu)先級大于或等于OS_LOWEST_PRIO 。五、實驗過程中遇到的問題及體會實驗過程中體會到了嵌入式開發(fā)的樂趣,對上課老師所講的內(nèi)容有了進一步的認識與理解。17/23.實驗三信號量:哲學(xué)家就餐問題的實現(xiàn)一、實驗?zāi)康恼莆赵诨谇度胧綄崟r操作系統(tǒng) uC/OS-II 的應(yīng)用中,任務(wù)使用信號量的一般原理。通過經(jīng)典的哲學(xué)家就餐
24、實驗,了解如何利用信號量來對共享資源進行互斥訪問。二、實驗原理及程序結(jié)構(gòu)1. 實驗設(shè)計掌握在基于嵌入式實時操作系統(tǒng) uC/OS-II 的應(yīng)用中,任務(wù)使用信號量的一般原理。通過經(jīng)典的哲學(xué)家就餐實驗,了解如何利用信號量來對共享資源進行互斥訪問。2. 源程序說明五個哲學(xué)家任務(wù)(ph1、 ph2、ph3、 ph4、 ph5)主要有兩種過程:思考(即睡眠一段時間)和就餐。 每個哲學(xué)家任務(wù)在就餐前必須申請并獲得一左一右兩支筷子,就餐完畢后釋放這兩支筷子。五個哲學(xué)家圍成一圈, 每兩人之間有一支筷子。 一共有五支筷子,在該實驗中用了五個互斥信號量來代表。每個任務(wù)的代碼都一樣,如下所示:void Task (v
25、oid *pdata)INT8U err;INT8U i;INT8U j;i=*(int *)pdata;j=(i+1) % 5;uC/OS-II實驗指導(dǎo)書-47-for (;)TaskThinking2Hungry(i);OSSemPend(forki, 0, &err);OSSemPend(forkj, 0, &err); /* Acquire semaphores to eat */TaskEat(i);OSSemPost(forkj);OSSemPost(forki); /* Release semaphore */OSTimeDly(200); /* Delay 10
26、 clock tick */操作系統(tǒng)配置修改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 個內(nèi)存塊 */#define OS_MAX_QS 2 /*最多可以使用2 個隊列 */#define OS_MAX_TASKS 8 /*最多可以創(chuàng)建8 個任務(wù) */#define OS_LOWEST_PRIO 14 /* 任務(wù)優(yōu)先級不可以大于 14*/ #define OS_
27、TASK_IDLE_STK_SIZE 1024 /* 空閑任務(wù)堆棧大小 */ #define OS_TASK_STA T_EN 1 /* 是否允許使用統(tǒng)計任務(wù) */18/23.#define OS_TASK_STA T_STK_SIZE 1024 /*統(tǒng)計任務(wù)堆棧大小 */#define OS_FLAG_EN 1 /* 是否允許使用事件標志功能*/#define OS_FLAG_W AIT_CLR_EN 1 /* 是否允許等待清除事件標志*/#define OS_FLAG_ACCEPT_EN 1 /*是否允許使用OSFlagAccept()*/#define OS_FLAG_DEL_EN 1
28、/*是否允許使用 OSFlagDel()*/#define OS_FLAG_QUERY_EN 1 /*是否允許使用OSFlagQuery()*/#define OS_MBOX_EN 0 /* 是否允許使用郵箱功能*/#define OS_MEM_EN 0 /* 是否允許使用內(nèi)存管理的功能*/#define OS_MUTEX_EN 0 /* 是否允許使用互斥信號量的功能*/#define OS_Q_EN 0 /* 是否允許使用隊列功能*/#define OS_SEM_EN 1 /* 是否允許使用信號量功能*/#define OS_SEM_ACCEPT_EN 1 /*是否允許使用OSSemAcce
29、pt()*/#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
30、 /*是否允許使用 OSTaskDel()*/#define OS_TASK_SUSPEND_EN 1 /* 是 否 允 許 使 用 OSTaskSuspend() andOSTaskResume()*/#define OS_TASK_QUERY_EN 1 /*是否允許使用OSTaskQuery()*/#define OS_TIME_DL Y_HMSM_EN 1 /* 是 否 允 許 使 用OSTimeDlyHMSM()*/#define OS_TIME_DL Y_RESUME_EN 1 /*是否允許使用OSTimeDlyResume()*/#define OS_TIME_GET_SET_EN
31、 1 /*是否允許使用OSTimeGet()和OSTimeSet()*/#define OS_SCHED_LOCK_EN 1 /*是 否 允 許 使 用 OSSchedLock() 和OSSchedUnlock()*/#define OS_TICKS_PER_SEC 200 /*設(shè)置每秒之內(nèi)的時鐘節(jié)拍數(shù)目*/三、運行及觀察應(yīng)用輸出信息開始,所有的哲學(xué)家先處于thinking狀態(tài),然后都進入hungry 狀態(tài):后首先獲得兩個信號量的1、3 號哲學(xué)家開始eating,待他們釋放相關(guān)信號量之后,哲學(xué)家 2、 5、 4 獲得所需的信號量并eating:應(yīng)用如此這般地循環(huán)執(zhí)行程序下去19/23.四、本實
32、驗中用到的C/OS- 相關(guān)函數(shù)4.1 OSSemCreate()OSSemCreate()函數(shù)建立并初始化一個信號量。信號量的作用如下:允許一個任務(wù)和其他任務(wù)或者中斷同步取得設(shè)備的使用權(quán)標志事件的發(fā)生函數(shù)原型:OS_EVENT *OSSemCreate ( ( ( WORD value ) ) )參數(shù)說明:value參數(shù)是所建立的信號量的初始值,可以取0 到 65535 之間的任何值。返回值:OSSemCreate()函數(shù)返回指向分配給所建立的信號量的控制塊的指針。如果沒有可用的控制塊, OSSemCreate()函數(shù)返回空指針。注意:必須先建立信號量,然后使用。4.2 OSSemPend()
33、OSSemPend()函數(shù)用于任務(wù)試圖取得設(shè)備的使用權(quán),任務(wù)需要和其他任務(wù)或中斷同步,任務(wù)需要等待特定事件的發(fā)生的場合。如果任務(wù)調(diào)用 OSSemPend()函數(shù)時,信號量的值大于零, OSSemPend()函數(shù)遞減該值并返回該值。如果調(diào)用時信號量等于零,OSSemPend()函數(shù)函數(shù)將任務(wù)加入該信號量的等待隊列。OSSemPend()函數(shù)掛起當(dāng)前任務(wù)直到其他的任務(wù)或中斷置起信號量或超出等待的預(yù)期時間。如果在預(yù)期的時鐘節(jié)拍內(nèi)信號 量 被 置 起 , C/OS- 默 認 最 高 優(yōu) 先 級 的 任 務(wù) 取 得 信 號 量 恢 復(fù) 執(zhí) 行 。 一 個 被OSTaskSuspend()函數(shù)掛起的任務(wù)也可以接受信號量,但這個任務(wù)將一直保持掛起狀態(tài)直到通過調(diào)用OSTaskResume()函數(shù)恢復(fù)任務(wù)的運行。20/23.函數(shù)原型: :Void OSSemPend ( OS_EVNNT *pevent, INT16U timeout, int8u *err ); 參數(shù)說明: : :pevent 是指向信號量的指針。該指針的值在建立該信號量時可以得到。 ( 參考OSSemCreate()函數(shù))。Timeout允許一個任務(wù)在經(jīng)過了指定數(shù)目的時鐘節(jié)拍后還沒有得到需要的信號量時恢復(fù)就緒狀態(tài)。如果該值為零表示任務(wù)將持續(xù)地等待信號量,最大的等待時間為65535 個時鐘節(jié)拍。這個時間長度
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年農(nóng)產(chǎn)品直播銷售員認證模擬試題含答案
- 2026年劇本殺運營公司退款審批流程管理制度
- 金融行業(yè)反欺詐與風(fēng)險管理手冊
- 2026年制造行業(yè)工業(yè)互聯(lián)網(wǎng)升級創(chuàng)新報告
- 【試卷】廣東省揭陽市榕城區(qū)2025-2026學(xué)年八年級上學(xué)期1月期末生物試題
- 2025 小學(xué)五年級道德與法治家鄉(xiāng)自然景觀介紹課件
- 2026年基因編輯技術(shù)倫理報告及未來五至十年醫(yī)療前景報告
- 2026年通信行業(yè)5G技術(shù)發(fā)展報告及創(chuàng)新報告
- 2026年及未來5年中國吲哚美辛膠囊行業(yè)發(fā)展運行現(xiàn)狀及發(fā)展趨勢預(yù)測報告
- 2026年及未來5年中國機用刀片行業(yè)市場前景預(yù)測及投資戰(zhàn)略研究報告
- 2025云南非物質(zhì)文化遺產(chǎn)保護現(xiàn)狀與傳承規(guī)劃研究
- 房地產(chǎn)項目供應(yīng)鏈標準化流程管理
- 工會招聘筆試題型及答案2025年
- 老年人安寧療護護理計劃制定與實施指南
- 線性代數(shù)課件 第6章 二次型 第2節(jié)
- 餐飲餐具消毒安全培訓(xùn)課件
- 心理科治療咨詢方案模板
- 2025年車間核算員考試題及答案
- 2026年高考作文備考之提高議論文的思辨性三大技法
- 南寧市人教版七年級上冊期末生物期末考試試卷及答案
- 項目安全生產(chǎn)管理辦法
評論
0/150
提交評論