基于ucos任務(wù)管理的開水器設(shè)計(jì)與實(shí)現(xiàn)_第1頁
基于ucos任務(wù)管理的開水器設(shè)計(jì)與實(shí)現(xiàn)_第2頁
基于ucos任務(wù)管理的開水器設(shè)計(jì)與實(shí)現(xiàn)_第3頁
基于ucos任務(wù)管理的開水器設(shè)計(jì)與實(shí)現(xiàn)_第4頁
基于ucos任務(wù)管理的開水器設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、1. C/OS-II 嵌入式操作系統(tǒng)簡介C/OS-的功能十分強(qiáng)大,它支持56 個(gè)用戶任務(wù)。其內(nèi)核為占先式,支持信號量、郵箱、消息隊(duì)列等多種常用的進(jìn)程間通信機(jī)制,現(xiàn)已成功的應(yīng)用到各種商業(yè)嵌入式系統(tǒng)中,是一個(gè)成熟穩(wěn)定的實(shí)時(shí)內(nèi)核。更為重要的一點(diǎn)是與大多商用RTOS 不同,C/OS-公開所有的源代碼,而且C/OS-90%的代碼使用標(biāo)準(zhǔn)的ANSI C 語言書寫,程序可讀性強(qiáng)、移植性好;它可免費(fèi)獲得,即使商業(yè)應(yīng)用也只收取少量的許可費(fèi)用。同時(shí)C/OS-是一個(gè)占先式的內(nèi)核,即已經(jīng)準(zhǔn)備就緒的高優(yōu)先級任務(wù)可以剝奪正在運(yùn)行的低優(yōu)先級任務(wù)的使用權(quán)。這個(gè)特點(diǎn)使得它的實(shí)時(shí)性比非占先式的內(nèi)核要好。通常都是在中斷服務(wù)程序中使

2、高優(yōu)先級任務(wù)進(jìn)入就緒態(tài)(例如使用發(fā)送信號的方法),退出中斷服務(wù)程序后,將進(jìn)行任務(wù)切換,高優(yōu)先級任務(wù)被執(zhí)行。以51 單片機(jī)為例,比較一下就可以發(fā)現(xiàn)這樣做的好處。假如需要用中斷方式采集一批數(shù)據(jù)并進(jìn)行處理,在傳統(tǒng)的編程方法中不能在中斷服務(wù)程序中進(jìn)行復(fù)雜的數(shù)據(jù)處理,因?yàn)檫@會使得關(guān)中斷時(shí)間過長。所以經(jīng)常采用的方法是置一標(biāo)志位,然后退出中斷。由于主程序是循環(huán)執(zhí)行的,所以它總有機(jī)會檢測到這一標(biāo)志并轉(zhuǎn)到數(shù)據(jù)處理程序中去。但是因?yàn)闊o法確定發(fā)生中斷時(shí)程序到底執(zhí)行到了什么地方,也就無法判斷要經(jīng)過多長時(shí)間數(shù)據(jù)處理程序才會執(zhí)行,中斷響應(yīng)時(shí)間無法確定,系統(tǒng)的實(shí)時(shí)性不強(qiáng)。如果使用C/OS-,只要把數(shù)據(jù)處理程序的優(yōu)先級設(shè)定的

3、高一些并在中斷服務(wù)程序中使它進(jìn)入就緒態(tài),中斷結(jié)束后數(shù)據(jù)處理程序就會被立即執(zhí)行。這樣可以把中斷響應(yīng)時(shí)間限制在一定的范圍內(nèi)。對于一些對中斷響應(yīng)時(shí)間有嚴(yán)格要求的系統(tǒng),這是必不可少的。但是如果數(shù)據(jù)處理程序簡單,這樣做就未必合適。因?yàn)镃/OS-要求在中斷服務(wù)程序末尾使用函數(shù)以判斷是否進(jìn)行任務(wù)切換,這需要花費(fèi)一定的時(shí)間。C/OS-和大家所熟知的Windows 等分時(shí)操作系統(tǒng)不同,它不支持時(shí)間片輪轉(zhuǎn)法。它是一個(gè)基于優(yōu)先級的實(shí)時(shí)操作系統(tǒng)。每一個(gè)任務(wù)必須具有不同的優(yōu)先級(分析它的源碼會發(fā)現(xiàn),C/OS-把任務(wù)的優(yōu)先級當(dāng)作任務(wù)的標(biāo)識來使用,如果優(yōu)先級相同,任務(wù)將無法區(qū)分)。進(jìn)入就緒態(tài)的優(yōu)先級最高的任務(wù)首先得到的使用

4、權(quán),只有等它交出的使用權(quán)后,其他任務(wù)才可以被執(zhí)行。所以只能說它是多任務(wù),不能說是多進(jìn)程,至少不是人們所熟悉的那種多進(jìn)程。C/OS-的這種特性是好是壞,主要看從什么角度來判斷了。顯而易見,如果只考慮實(shí)時(shí)性,它當(dāng)然比分時(shí)系統(tǒng)好,它可以保證重要任務(wù)總是優(yōu)先占有。但是在應(yīng)用系統(tǒng)中,重要任務(wù)畢竟是有限的,這就使得劃分其他任務(wù)的優(yōu)先權(quán)變成了一個(gè)讓人費(fèi)神的問題。另外,有些任務(wù)交替執(zhí)行反而對用戶更有利。例如,用單片機(jī)控制兩小塊顯示屏?xí)r,無論是編程者還是使用者肯定希望它們同時(shí)工作,而不是顯示完一塊顯示屏的信息以后再顯示另一塊顯示屏的信息。這時(shí)候,要是C/OS-既能支持優(yōu)先級法又能支持時(shí)間片輪轉(zhuǎn)法就更好了。C/O

5、S-對共享資源提供了保護(hù)機(jī)制。正如前文所述,C/OS-是一個(gè)支持多任務(wù)的操作系統(tǒng)。一個(gè)完整的程序可以劃分成幾個(gè)任務(wù),不同的任務(wù)執(zhí)行不同的功能。這樣,一個(gè)任務(wù)就相當(dāng)于模塊化設(shè)計(jì)中的一個(gè)子模塊。在任務(wù)中添加代碼時(shí),只要不是共享資源就不必?fù)?dān)心互相之間有影響。對于共享資源(例如串口),C/OS-也提供了很好的解決辦法。一般情況下使用的是信號量的方法。簡單地說,先創(chuàng)建一個(gè)信號量并對它進(jìn)行初始化。當(dāng)一個(gè)任務(wù)需要使用一個(gè)共享資源時(shí),它必須先申請得到這個(gè)信號量。而一旦它得到了此信號量,那就只有等它使用完了該資源,信號量才會被釋放。在這個(gè)過程中即使有優(yōu)先權(quán)更高的任務(wù)進(jìn)入了就緒態(tài),因?yàn)闊o法得到此信號量,也不能使用

6、該資源。這個(gè)特點(diǎn)的好處顯而易見,這里還拿傳統(tǒng)的單片機(jī)程序來做比較。當(dāng)顯示屏正在顯示信息的時(shí)候,外部產(chǎn)生了一個(gè)中斷,而在中斷服務(wù)程序中需要顯示屏顯示其他信息。這樣,退出中斷服務(wù)程序后,原有的信息就可能被破壞了。而在C/OS-中采用信號量的方法時(shí),只有顯示屏把原有信息顯示完畢后才可以顯示新信息,從而可以避免這個(gè)問題。不過,采用這種方法是以犧牲系待統(tǒng)的實(shí)時(shí)性為代價(jià)的。如果顯示原有信息需要耗費(fèi)大量時(shí)間,系統(tǒng)只好等。從結(jié)果上看,等于延長了中斷響應(yīng)時(shí)間,這對于未顯示信息是報(bào)警信息的情況,無疑是致命的。發(fā)生這種情況,在C/OS-中稱為優(yōu)先級反轉(zhuǎn)。簡單地說,就是高優(yōu)先級任務(wù)必須等待低優(yōu)先級任務(wù)的完成。在上述情

7、況下,在兩個(gè)任務(wù)之間發(fā)生優(yōu)先級反轉(zhuǎn)是無法避免的。所以使用C/OS-時(shí),必須對所開發(fā)的系統(tǒng)了解清楚,才能選擇對某種共享資源是否使用信號量。2.嵌入式系統(tǒng)編程語言的選擇和其他語言相比,C語言已經(jīng)成為嵌入式程序員的語言了。因?yàn)閷τ谝粋€(gè)給定的項(xiàng)目來說,選擇一種語言對成功的開發(fā)是如此的重要,所以,當(dāng)一種語言被證明可以同時(shí)適于8 位和64 位處理器,適用于字節(jié)、千字節(jié)甚至兆字節(jié)的系統(tǒng)時(shí),這種語言一定會被程序員所廣泛采用的。C語言做到了這一定,相對于其他語言C是有很多優(yōu)勢的。它小而易學(xué),在今天幾乎每一種處理器都有C 的編譯器,同時(shí)還擁有相當(dāng)多的有經(jīng)驗(yàn)的C 程序員。更重要的是,C語言是和處理器無關(guān)的,這就能夠

8、讓程序員可以著眼于算法和應(yīng)用而不用考慮特定處理器結(jié)構(gòu)的細(xì)節(jié)語言與其他語言比如Pascal 和FORTRAN 區(qū)別開的地方就是,C語言是一個(gè)非?!暗图墶钡母呒壵Z言,C語言給與嵌入式程序員很大程度的直接控制硬件的能力,卻不會失去高級語言帶來的好處?!暗图墶钡膬?nèi)在本質(zhì)是這個(gè)語言創(chuàng)建者的明顯目的。很少有其他高級語言可以像C一樣,為幾乎所有的處理器生成經(jīng)湊的、高效的代碼,同時(shí)只有C與與程序員方便地和底層硬件打交道。當(dāng)然,C語言并不是嵌入式程序言使用的唯一的語言。至少還有其他三種值得詳細(xì)說明一下,即匯編語言、C+語言和Ada 語言。在早期的時(shí)候,嵌入式軟件只能用目標(biāo)處理器的匯編語言來書寫。這樣早市程序員可

9、以完全控制處理器和其它硬件,當(dāng)然也是有代價(jià)的。除了更高的軟件開發(fā)費(fèi)用和缺乏移植性,匯編語言還有很多缺點(diǎn)。匯編語言現(xiàn)在只用作高級語言的附件,通產(chǎn)只用在那些必須要求極高效率或非常緊湊,或者是其他方法無法編寫的小段代碼里。C+使C語言的面向?qū)ο蟮某谇度胧匠绦騿T中變得越來越流行。他的核心語言特性和C語言完全一樣,但是C+提供了更好的數(shù)據(jù)抽象和面向?qū)ο笮问降木幊坦δ?。這些新的特性對軟件開發(fā)人員非常有幫助,但是部分特性會降低可執(zhí)行程序的性能,所以C+在大的開發(fā)隊(duì)伍利用的最為普遍,在那里對程序員的幫助要比程序效率的損失更為重要。Ada 也是一種面向?qū)ο蟮恼Z言。不過和C+完全不同。Ada 開始是美國國

10、防部為了開發(fā)面向任務(wù)的軍用軟件而設(shè)計(jì)的。盡管它曾兩次被接納為國際標(biāo)準(zhǔn)(Ada83 和Ada95),但是Ada 從來沒有在防務(wù)和航空領(lǐng)域之外獲得足夠的應(yīng)用。即使是這些領(lǐng)地這幾年也在逐漸喪失,這是一件很不幸的事情,因?yàn)榕cC+比起來,Ada 有很多特性可以簡化嵌入式軟件的開發(fā)工作。3.需求分析 本次實(shí)驗(yàn)采用的原型為北研樓一樓的開水器; 在開水器通電之后,開水器自動將水燒開,并將容量及溫度等情況通過LED燈顯示,以提醒用戶。當(dāng)用戶打開開關(guān)放出一定量的開水之后,開水器的容量會減少,伴隨著水量的減少,水的溫度也會降低。此時(shí),開水器將會注水并且將水燒開,然后再次將開水器的狀態(tài)表現(xiàn)在LED的亮和關(guān)上。 因而可

11、以分為:電源容量控制模塊、溫度容量控制模塊、開關(guān)容量控制模塊、LED顯示容量控制模塊、容量控制模塊。4.系統(tǒng)整體設(shè)計(jì)系統(tǒng)體系結(jié)構(gòu)是系統(tǒng)整體結(jié)構(gòu)的一個(gè)計(jì)劃,用于描述如何實(shí)現(xiàn)在需求分析和規(guī)格說明中提出的功能的,而后用于設(shè)計(jì)搭建整個(gè)體系結(jié)構(gòu)的構(gòu)件。整個(gè)系統(tǒng)的結(jié)構(gòu)框圖如下圖所示:5.系統(tǒng)軟件設(shè)計(jì)C/OS-軟硬件體系統(tǒng),其系統(tǒng)結(jié)構(gòu)如下圖 上圖說明了C/OS-的軟硬件體系結(jié)構(gòu)。應(yīng)用程序處于整個(gè)系統(tǒng)的頂層,每個(gè)任務(wù)都可以認(rèn)為自己獨(dú)占了CPU,因而可以設(shè)計(jì)成為一個(gè)無限循環(huán)。C/OS-與處理器無關(guān)的的代碼體C/OS-的系統(tǒng)服務(wù),應(yīng)用程序可以使用這些API 函數(shù)進(jìn)行內(nèi)存管理、任務(wù)間通信及創(chuàng)建、刪除任務(wù)等。大部分的

12、C/OS-代碼時(shí)使用 ANSI C 語言書寫的,因此C/OS-的可移植性好。然而仍需要使用C 語言和匯編語言協(xié)議協(xié)處理器相關(guān)代碼。6.具體設(shè)計(jì):首先進(jìn)行函數(shù)的聲明以及宏定義:#defineTASK_STK_SIZE 512 / Size of each tasks stacks (# of WORDs)#defineN_TASKS 5 / 5個(gè)任務(wù)#defineTASK_START_ID 10/ Application tasks IDs#defineTASK_START_PRIO 11/ Application tasks priorities#defineTASK_POWER_PRIO12

13、 /電源任務(wù)#defineTASK_TEMP_PRIO13 /溫度采集任務(wù)#defineTASK_ONOFF_PRIO15 /開關(guān)任務(wù)#defineTASK_LED_PRIO16 /LED顯示任務(wù)#defineTASK_CAPA_PRIO14 /容量檢測任務(wù)OS_STKTaskStkN_TASKSTASK_STK_SIZE;/ Tasks stacksOS_STKTaskStartStkTASK_STK_SIZE;/ TaskStart task stackINT8UTaskDataN_TASKS;/ Parameters to pass to each task聲明部分: voidTask_

14、power(void *pdata); / Function prototypes of tasksvoidTask_temp(void *pdata); voidTask_getwater(void *pdata); voidTask_led(void *pdata); voidTask_capa(void *pdata); voidTaskStart(void *pdata);/ Function prototypes of Startup taskvoidTaskStartCreateTasks(void);/ Function prototypes of creat taskinton

15、off=1;inttemp=1;intpower=1;intcapa=1;int c_capa=100;int c_temp=100;在main中建立一個(gè)起始任務(wù)TaskStart(void *pdata)#if OS_CRITICAL_METHOD = 3 OS_CPU_SR cpu_sr;cpu_sr = cpu_sr;#endifpdata = pdata;UCOS_TIMER_START();TaskStartCreateTasks();OSTaskSuspend(OS_PRIO_SELF);用TaskStartCreateTasks函數(shù)建立5個(gè)任務(wù),任務(wù)名分別為:voidTask_p

16、ower(void *pdata); (電源管理模塊)voidTask_temp(void *pdata); (溫度控制模塊)voidTask_getwater(void *pdata); (開關(guān)模塊)voidTask_led(void *pdata); (LED管理模塊)voidTask_capa(void *pdata); (容量控制模塊)創(chuàng)建任務(wù):OSTaskCreate(Task_power, (void *)&TaskData0, &TaskStk0TASK_STK_SIZE - 1, TASK_POWER_PRIO);-創(chuàng)建電源管理任務(wù)OSTaskCreate(Task_led,

17、(void *)&TaskData0, &TaskStk3TASK_STK_SIZE - 1, TASK_LED_PRIO);- 創(chuàng)建溫度控制任務(wù)OSTaskCreate(Task_temp, (void *)&TaskData1, &TaskStk1TASK_STK_SIZE - 1, TASK_TEMP_PRIO);- 創(chuàng)建開關(guān)控制任務(wù) OSTaskCreate(Task_capa, (void *)&TaskData0, &TaskStk4TASK_STK_SIZE - 1, TASK_CAPA_PRIO);- 創(chuàng)建LED管理任務(wù)OSTaskCreate(Task_getwater, (

18、void *)&TaskData0, &TaskStk2TASK_STK_SIZE - 1, TASK_ONOFF_PRIO);- 創(chuàng)建容量控制任務(wù) 7.1電源管理任務(wù)以下程序?yàn)榫唧w函數(shù)的代碼:voidTask_power(void *pdata)INT8U i; i=*(int *)pdata;if(power)if(init_sys()!= 1)printf(something is error!nr);/如果電源接通就初始化系統(tǒng)printf(power is on!nr); else printf(power is off!nr); OSTaskSuspend(TASK_POWER_PR

19、IO);7.2創(chuàng)建溫度控制任務(wù)以下程序?yàn)閷?shí)現(xiàn)函數(shù)的代碼:void Task_temp (void *pdata)INT8U i; i=*(int *)pdata; for(;)if(power)if(temp)printf(temp is 100 C!nr);temp=0;elseprintf(temp is down 100 C!nr);temp=1;c_temp=+10;OSTaskSuspend(TASK_TEMP_PRIO); 7.3開關(guān)控制任務(wù)以下程序?yàn)殚_關(guān)控制函數(shù)的代碼:void Task_getwater (void *pdata)INT8U i; i=*(int *)pdata

20、; for(;) onoff=1; printf(now get water !nr); c_capa=-10; capa=0; c_temp=-10; temp=0; onoff=0; OSTaskSuspend(TASK_ONOFF_PRIO); 7.4LED顯示控制任務(wù)以下程序?yàn)榫唧w函數(shù)的代碼:void Task_led (void *pdata)INT8U i; i=*(int *)pdata; for(;)if(power)switch(temp) case 1:printf(led0 is on !nr);printf(led1 is off !nr);printf(temp is 100 !nr);break; case 0:printf(led0 is off !nr);printf(led1 is on !nr);printf(temp is down 100 !nr)

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論