《單片機(jī)原理及基于單片機(jī)的嵌入式系統(tǒng)設(shè)計(jì)》蔡方凱電子教案_第1頁(yè)
《單片機(jī)原理及基于單片機(jī)的嵌入式系統(tǒng)設(shè)計(jì)》蔡方凱電子教案_第2頁(yè)
《單片機(jī)原理及基于單片機(jī)的嵌入式系統(tǒng)設(shè)計(jì)》蔡方凱電子教案_第3頁(yè)
《單片機(jī)原理及基于單片機(jī)的嵌入式系統(tǒng)設(shè)計(jì)》蔡方凱電子教案_第4頁(yè)
《單片機(jī)原理及基于單片機(jī)的嵌入式系統(tǒng)設(shè)計(jì)》蔡方凱電子教案_第5頁(yè)
已閱讀5頁(yè),還剩71頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第12章嵌入式單片機(jī)技術(shù)

C教程基礎(chǔ)12.1 C51編程基礎(chǔ)12.2 串行通信與定時(shí)程序12.3 嵌入式操作系統(tǒng)嵌入式51系列單片機(jī)的編程語(yǔ)言常用的有二種:匯編語(yǔ)言,C51語(yǔ)言。匯編語(yǔ)言的機(jī)器代碼生成效率高但可讀性不強(qiáng),而C51語(yǔ)言在大多數(shù)情況下其機(jī)器代碼生成效率和匯編語(yǔ)言相當(dāng),但可讀性和可移植性卻遠(yuǎn)遠(yuǎn)超過(guò)匯編語(yǔ)言;而且C51語(yǔ)言還可以嵌入?yún)R編來(lái)解決高時(shí)效性的代碼編寫(xiě)問(wèn)題。中大型的軟件編寫(xiě)用C51語(yǔ)言的開(kāi)發(fā)周期通常要小于匯編語(yǔ)言很多。

C語(yǔ)言的標(biāo)識(shí)符用來(lái)標(biāo)識(shí)源程序中某個(gè)對(duì)象名字。這些對(duì)象可以是函數(shù)、變量、數(shù)組、數(shù)據(jù)類型、存儲(chǔ)方式、語(yǔ)句等。關(guān)鍵字是一類具有固定名稱和特定含義的特殊標(biāo)識(shí)符,有時(shí)又稱為保留字。ANSIC標(biāo)準(zhǔn)一共規(guī)定了32個(gè)關(guān)健字,表12-1按用途列出了ANSIC標(biāo)準(zhǔn)的關(guān)鍵字。

12.1C51編程基礎(chǔ)

12.1.1標(biāo)志符與關(guān)鍵字

表12-1ANSIC標(biāo)準(zhǔn)的關(guān)鍵字

關(guān)鍵字用途說(shuō)明auto存儲(chǔ)器種類聲明用以聲明局部變量,默認(rèn)什為此break程度語(yǔ)句退出最內(nèi)層循環(huán)體case程度語(yǔ)句switch語(yǔ)句中的選擇項(xiàng)char數(shù)據(jù)類型聲明單字節(jié)整型或字符型const存儲(chǔ)類型聲明在程度執(zhí)行中不可修改的變量值continue程度語(yǔ)句轉(zhuǎn)向下一次循環(huán)default程序語(yǔ)句switch語(yǔ)句中的失敗選擇項(xiàng)do程度語(yǔ)句構(gòu)成do...while循環(huán)結(jié)構(gòu)double數(shù)據(jù)類型聲明雙精度浮點(diǎn)數(shù)else程度語(yǔ)句構(gòu)成if...else選擇結(jié)構(gòu)enum數(shù)據(jù)類型聲明枚舉extern存儲(chǔ)種類聲明在其它程度模塊中聲明了的全局變量float數(shù)據(jù)類型聲明單精度浮點(diǎn)數(shù)for程度語(yǔ)句構(gòu)成for循環(huán)結(jié)構(gòu)goto程度語(yǔ)句構(gòu)成goto轉(zhuǎn)移結(jié)構(gòu)if程度語(yǔ)句構(gòu)成if...else選擇結(jié)構(gòu)int數(shù)據(jù)種類聲明基本整型數(shù)long數(shù)據(jù)種類聲明長(zhǎng)整型數(shù)register數(shù)據(jù)種類聲明使用CPU內(nèi)部寄存器的變量return程序語(yǔ)句函數(shù)返回short數(shù)據(jù)種類聲明短整型數(shù)signed數(shù)據(jù)種類聲明有符號(hào)數(shù),二進(jìn)制數(shù)的最高位為符號(hào)位sizeof運(yùn)算符計(jì)算表達(dá)式或數(shù)據(jù)類型的字節(jié)數(shù)static數(shù)據(jù)種類聲明靜態(tài)變量struct數(shù)據(jù)種類聲明結(jié)構(gòu)類型數(shù)據(jù)switch程序語(yǔ)句構(gòu)成switch選擇結(jié)構(gòu)typedef數(shù)據(jù)種類聲明重新進(jìn)行數(shù)據(jù)類型定義union數(shù)據(jù)種類聲明聯(lián)合類型數(shù)據(jù)unsigned數(shù)據(jù)種類聲明無(wú)符號(hào)數(shù)據(jù)void數(shù)據(jù)種類聲明無(wú)類型數(shù)據(jù)volatile數(shù)據(jù)種類聲明聲明該變量在程度執(zhí)行中可被隱含的改變while程度語(yǔ)句構(gòu)成while和...while循環(huán)結(jié)構(gòu)C51編繹器除了支持ANSIC標(biāo)準(zhǔn)的關(guān)鍵字以外,還擴(kuò)展了如表12-2所示的關(guān)鍵字:

表12-2C51編繹器的擴(kuò)展關(guān)鍵字

關(guān)鍵字用途說(shuō)明_at_地址定位為變量進(jìn)行存儲(chǔ)器絕對(duì)空間地址定位alien函數(shù)特殊聲明用以聲明與PL/M51兼容的函數(shù)bdata存儲(chǔ)器類型聲明可位尋址的8051內(nèi)部數(shù)據(jù)存儲(chǔ)器bit位變量聲明聲明一個(gè)位變量或位類型的函數(shù)code存儲(chǔ)器類型聲明8051程度存儲(chǔ)器空間compact存儲(chǔ)器模式指定使用8051外部分頁(yè)尋址數(shù)據(jù)存儲(chǔ)器空間data存儲(chǔ)器類型聲明直接尋址的8051內(nèi)部數(shù)據(jù)存儲(chǔ)器idata存儲(chǔ)器類型聲明間接尋址的8051內(nèi)部數(shù)據(jù)存儲(chǔ)器interrupt中斷函數(shù)聲明定義一個(gè)中斷服務(wù)函數(shù)large存儲(chǔ)器模式指定使用8051外部數(shù)據(jù)存儲(chǔ)器空間pdata存儲(chǔ)器類型聲明分頁(yè)尋址的8051外部數(shù)據(jù)存儲(chǔ)器_priority_多任務(wù)優(yōu)先聲明規(guī)定RTX51或RTX51Tiny的任務(wù)優(yōu)先級(jí)reentrant再入函數(shù)聲明定義一個(gè)再入函數(shù)sbit位變量聲明聲明一個(gè)可位尋址變量sfr特殊功能寄存器聲明聲明一個(gè)8位的特殊功能寄存器sfr16特殊功能寄存器聲明聲明一個(gè)16位的特殊功能寄存器small存儲(chǔ)器模式指定使用8051內(nèi)部數(shù)據(jù)存儲(chǔ)器空間_task_任務(wù)聲明定義實(shí)時(shí)多任務(wù)函數(shù)usang寄存器組定義定義8051的工作寄存器組xdata存儲(chǔ)器類型聲明8051外部數(shù)據(jù)存儲(chǔ)器針對(duì)51系列單片機(jī)各個(gè)可操作部分,C51編繹器定義了如表12-3所示的符號(hào),編程時(shí)寫(xiě)出符號(hào)名,即可操作單片機(jī)對(duì)應(yīng)的部分。

表12-3C51特殊功能寄存器列表符號(hào)地址注釋*ACCE0H累加器*BF0H乘法寄存器*PSWD0H程序狀態(tài)字SP81H堆棧指針DPL82H數(shù)據(jù)存儲(chǔ)器指針低8位DPH83H數(shù)據(jù)存儲(chǔ)器指針高8位*IEA8H中斷允許控制器*IPD8H中斷優(yōu)先控制器*P080H端口0*P190H端口1*P2A0H端口2*P3B0H端口3PCON87H電源控制及波特率選擇*SCON98H串行口控制器SBUF99H串行數(shù)據(jù)緩沖器*TCON88H定時(shí)器控制TMOD89H定時(shí)器方式選擇TL08AH定時(shí)器0低8位TL18BH定時(shí)器1低8位TH08CH定時(shí)器0低8位TH18DH定時(shí)器1高8位帶*號(hào)的特殊功能寄存器都是可以位尋址的寄存器下面舉舉例說(shuō)說(shuō)明特特殊功功能寄寄存器器的操操作方方法。。例1,,欲將將單片片機(jī)P1口口的第第一根根口線線-DIP封裝裝單片片機(jī)第第一管管腳--設(shè)為為報(bào)警警輸出出線,,低電電平報(bào)報(bào)警,,則在在程序序中首首先可可定義義:sbitBJ=P1^0;這就定定義了了一個(gè)個(gè)變量量BJ對(duì)應(yīng)應(yīng)P1口的的第一一根口口線,,sbit聲明明變量量BJ是位位尋址址數(shù)據(jù)據(jù)類型型。需需要報(bào)報(bào)警時(shí)時(shí),使使用語(yǔ)語(yǔ)句::BJ=0;即可令令單片片機(jī)P1口口的第第一根根口線線輸出出低電電平,,完成成報(bào)警警。當(dāng)當(dāng)報(bào)警警完畢畢,需需要撤撤銷報(bào)報(bào)警時(shí)時(shí),使使用如如下語(yǔ)語(yǔ)句即即可恢恢復(fù)到到非報(bào)報(bào)警狀狀態(tài)::BJ=1;例2,,欲將將單片片機(jī)P1口口的第第五根根口線線至第第八根根口線線設(shè)置置為構(gòu)構(gòu)成寬寬度為為4位位的雙雙向數(shù)數(shù)據(jù)總總線,,使之之既可可以接接收數(shù)數(shù)據(jù)又又可以以發(fā)送送數(shù)據(jù)據(jù),則則在程程序中中首先先可做做如下下定義義:sbitMT8880_D0=P1^4;//雙雙向向數(shù)據(jù)據(jù)總線線sbitMT8880_D1=P1^5;//雙雙向向數(shù)據(jù)據(jù)總線線sbitMT8880_D2=P1^6;//雙雙向向數(shù)據(jù)據(jù)總線線sbitMT8880_D3=P1^7;//雙雙向向數(shù)據(jù)據(jù)總線線收數(shù)據(jù)據(jù)時(shí),,令各各口線線為高高,處處于監(jiān)監(jiān)聽(tīng)狀狀態(tài)::MT8880_D0=1;MT8880_D1=1;MT8880_D2=1;MT8880_D3=1;當(dāng)有數(shù)數(shù)據(jù)來(lái)來(lái)時(shí),,使用用如下下語(yǔ)句句判斷斷、接接收數(shù)數(shù)據(jù)::if(MT8880_D3==0&MT8880_D2==0&MT8880_D1==0&MT8880_D0==0)Number_Key=0;if(MT8880_D3==0&MT8880_D2==0&MT8880_D1==0&MT8880_D0==1)Number_Key=1;…….用作輸輸出數(shù)數(shù)據(jù)時(shí)時(shí),直直接寫(xiě)寫(xiě)口線線即可可:MT8880_D0=1;MT8880_D1=0;MT8880_D2=1;MT8880_D3=0;如把這這四根根口線線看作作二進(jìn)進(jìn)制輸輸出,,MT8880_D3是是高位位,則則輸出出了0101,,相當(dāng)當(dāng)于十十進(jìn)制制的5。當(dāng)當(dāng)然,,輸出出前必必須保保證總總線上上的其其它設(shè)設(shè)備處處于監(jiān)監(jiān)聽(tīng)狀狀態(tài),,即非非輸出出狀態(tài)態(tài),否否則會(huì)會(huì)產(chǎn)生生沖突突,因因?yàn)榭偪偩€信信號(hào)是是“與與”的的關(guān)系系,比比如某某根數(shù)數(shù)據(jù)線線被任任一總總線設(shè)設(shè)備置置為邏邏輯0,則則在同同時(shí)其其它設(shè)設(shè)備無(wú)無(wú)法將將其置置為邏邏輯1。12.1.2數(shù)數(shù)據(jù)類類型C51有如如下數(shù)數(shù)據(jù)類類型::表12-4C51編繹繹器能能夠識(shí)識(shí)別的的數(shù)據(jù)據(jù)類型型數(shù)據(jù)類型字符類型長(zhǎng)度值域unsignedchar字符類型單字節(jié)0~255signedchar字符類型單字節(jié)-128~127unsignedint整型雙字節(jié)0~65536unsignedint整型雙字節(jié)-32768~32767unsignedlong長(zhǎng)整型4字節(jié)0~4294967295signedlong長(zhǎng)整型4字節(jié)-2147483648~2147483647float浮點(diǎn)型4字節(jié)±1.175494E-38~±3.4028223E+38*指針型1~3字節(jié)對(duì)象的地址bit位類型位0或1sfr特殊功能寄存器單字節(jié)0~255sfr1616位特殊功能寄存器雙字節(jié)0~65536sbit可尋址位位0或1指針?lè)?hào)"*":表表示方方法是是將"*"前面面冠以以數(shù)據(jù)據(jù)類型型的符符號(hào),,如char*point1表表示point1是是一個(gè)個(gè)字符符型的的指針針變量量。下面給給出幾幾個(gè)例例子,,說(shuō)明明定義義不同同數(shù)據(jù)據(jù)類型型變量量的操操作方方法。。例1,,定義義一個(gè)個(gè)布爾爾型變變量,,則有有:bitFLAG_BF;例2,,定義義一個(gè)個(gè)整型型變量量,則則有::intTime_DU;例3,,定義義一個(gè)個(gè)單字字節(jié)字字符型型變量量,則則有::unsignedcharLOCK_JS;例4,定義一一個(gè)字符型數(shù)數(shù)組,則可在在程序開(kāi)頭聲聲明:typedefunsignedcharNumber[20];這就聲明了一一個(gè)長(zhǎng)度為20字節(jié)的字字符型數(shù)組,,使用賦值語(yǔ)語(yǔ)句:Number[0]=10將值10填入入該數(shù)組第一一個(gè)字節(jié)。使使用賦值語(yǔ)句句:Number[1]=15將值15填入入該數(shù)組第二二個(gè)字節(jié)。使使用賦值語(yǔ)句句:MyVar==Number[3]將該數(shù)組的第第四個(gè)字節(jié)賦賦給變量MyVar。例5,欲定義義一個(gè)結(jié)構(gòu)型型變量,則有有:structReadArray{unsignedcharNumber[20];intSerial[5];}READARRAY;給結(jié)構(gòu)變量賦賦值可使用如如下語(yǔ)句:READARRAY.Number[0]=’a’;READARRAY.Number[1]=’b’;READARRAY.Number[2]=’c’;…READARRAY.Serial[3]=32;…12.1.3常量常量的值在程程序執(zhí)行過(guò)程程中不能改變變。常量的數(shù)數(shù)據(jù)類型有整整型、浮點(diǎn)型型、字符型和和字符串型等等。分別說(shuō)明明如下:1.整型常量整型常量就是是整型常數(shù),可表示為:·十進(jìn)制整數(shù)數(shù):如12、、-5678、0等?!なM(jìn)制整整數(shù):十六進(jìn)進(jìn)制數(shù)據(jù)以0x開(kāi)頭,數(shù)數(shù)據(jù)為0~9及a~f。。·長(zhǎng)整數(shù):在在數(shù)字后面加加一個(gè)字母L長(zhǎng)整數(shù),如如2048L、0123L、0xff00L等等。2.浮點(diǎn)型型常量浮點(diǎn)型常量有有十進(jìn)制形式式和指數(shù)表示示形式?!なM(jìn)制表示示形式又稱為為定點(diǎn)表示形形式,由數(shù)字字和小數(shù)點(diǎn)組組成。如0.3141是是十進(jìn)制數(shù)表表示形式的浮浮點(diǎn)型常量。。3.字符型型常量字符型常量是是單引號(hào)內(nèi)的的字符,如'a','b'等。對(duì)于于不可顯示的的控制字符,,可以在該字字符前面加一一個(gè)反斜杠"\"組成轉(zhuǎn)轉(zhuǎn)義字符。利利用轉(zhuǎn)義字符符可以完成一一些特殊功能能和輸出時(shí)的的格式控制。。常用轉(zhuǎn)義字字符如表12-5所示。。表12-5常常用轉(zhuǎn)義字符符表轉(zhuǎn)義字符含義16進(jìn)制數(shù)形式\0空字符(NULL)0x00\n換行符(LF)0x0A\r回車(chē)符(CR)0x0D\t水平制表符(HT)0x09\b退格符(BS)0x08\f換頁(yè)符(FF)0x0C\'單引號(hào)0x27\"雙引號(hào)0x22\\反斜杠0x5C4.字符串串型常量字符串型常量量由雙引號(hào)““”內(nèi)的字符符組成,如““ABCD””、“$1234”等都都是字符串常常量。當(dāng)雙引引號(hào)內(nèi)的字符符個(gè)數(shù)為0時(shí)時(shí),稱為空串串常量。字符符串常量首尾尾的雙引號(hào)是是界限符,當(dāng)當(dāng)需要表示雙雙引號(hào)字符串串時(shí),可用雙雙引號(hào)轉(zhuǎn)義字字符來(lái)表示為為:“\”““。C語(yǔ)言在在存儲(chǔ)字符串串常量時(shí),要要在字符串的的尾部加一個(gè)個(gè)轉(zhuǎn)義字符\0作為該字字符串常量的的結(jié)束符。因因此不要將字字符常量與字字符串常量混混淆,如字符符常量’a‘‘與字符串常常量”a“是是不一樣的。。為了某些編程程需要,常常常在程序開(kāi)頭頭使用如下語(yǔ)語(yǔ)句定義常量量:#definePI3.14這樣,在程序序中出現(xiàn)常量量PI時(shí),編編譯器會(huì)自動(dòng)動(dòng)用浮點(diǎn)數(shù)3.14代替替。12.1.4變量及其存存儲(chǔ)模式變量是一種在在程序執(zhí)行過(guò)過(guò)程中,其值值能夠不斷變變化的量。使使用一個(gè)變量量之前,必須須進(jìn)行定義,,用一個(gè)標(biāo)識(shí)識(shí)符作為變量量名并指出它它的數(shù)據(jù)類型型和存儲(chǔ)格式式,以便編繹繹系統(tǒng)為它分分配相應(yīng)的存存儲(chǔ)單元。在在C51中對(duì)對(duì)變量進(jìn)行定定義的格式如如下:[存儲(chǔ)器種類類]數(shù)據(jù)類型型[存儲(chǔ)器類類型]變量名名表其中,"存儲(chǔ)儲(chǔ)器種類"和和"存儲(chǔ)器類類型"是可選選項(xiàng)。變量的的存儲(chǔ)器種類類有四種:自自動(dòng)(auto)、外部部(extern)、靜靜態(tài)(static)和和寄存器(register)。定定義變量時(shí)如如果省略存儲(chǔ)儲(chǔ)器種類選項(xiàng)項(xiàng),則該變量量格式為自動(dòng)動(dòng)(auto)。定義一一個(gè)變量時(shí),,C51編繹繹器允許說(shuō)明明變量的存儲(chǔ)儲(chǔ)器類型。KeilC51編繹器對(duì)對(duì)于每個(gè)變量量可以準(zhǔn)確地地賦予其存儲(chǔ)儲(chǔ)器類型,使使之能夠在單單片機(jī)系統(tǒng)內(nèi)內(nèi)準(zhǔn)確地定位位。表12-6列出了CC51編繹器器所能識(shí)別的的存儲(chǔ)器類型型。表12-6C51編繹繹器所能識(shí)別別的存儲(chǔ)器類類型存儲(chǔ)器類型說(shuō)明DATA直接尋址的片內(nèi)數(shù)據(jù)存儲(chǔ)器,訪問(wèn)速度最快BDATA可位尋址的片內(nèi)數(shù)據(jù)存儲(chǔ)器,允許位與字節(jié)混合訪問(wèn)IDATA間接訪問(wèn)的片內(nèi)數(shù)據(jù)存儲(chǔ)器,允許訪問(wèn)全部片內(nèi)地址PDATA分頁(yè)尋址的片外數(shù)據(jù)存儲(chǔ)器,用MOVX@Ri指令訪問(wèn)XDATA片外數(shù)據(jù)存儲(chǔ)器,用MOVX@DPTR指令訪問(wèn)CODE程序存儲(chǔ)器,用MOVC@A+DPTR指令訪問(wèn)8051具有有一些特殊功功能寄存器,,如定時(shí)器方方式控制寄存存器TMOD、中斷允許許控制寄存器器IE等。C51編繹器器擴(kuò)充了關(guān)鍵鍵字sfr和和sfr16,以便在C語(yǔ)言源程序序中直接對(duì)特特殊功能寄存存器進(jìn)行定義義。定義方法法如下:sfrP0=0x80;/*定義義I/O口P0,其地址址為0x80*/對(duì)于定時(shí)器T2,可采用用如下方法的的方法來(lái)定義義:sfr16T2=0xCC;/*定義TIMER2,其其地址為T(mén)2L=0xCC,T2H=0xCD*/T2為特殊功功能寄存器名名,等號(hào)后面面是它的低字字節(jié)地址,其其高字節(jié)地址址必須在物理理上直接位于于低字節(jié)之后后。訪問(wèn)特殊功能能寄存器中的的某位,用擴(kuò)擴(kuò)充關(guān)鍵字sbit,1.sbit位變量名=位地址這種方法將位位的絕對(duì)地址址賦給位變量量,位地址必必須位于0x80~0xFF之間。。例如:sbitY=0xD7;2.sbit位變量名=特殊功能寄寄存器名^位位位置當(dāng)可位尋址位位位于特殊功功能寄存器中中時(shí),可采用用這種方法。。"位位置"是一個(gè)0~7之間的常常數(shù)。例如::sfrPSW=0xD0;sbitCY=PSW^7;3.sbit位變量名=字節(jié)地址^位位置以一常數(shù)作為為基址,常常數(shù)在0x80~0xFF之間。"位位置"是是一個(gè)0~7之間的常數(shù)數(shù)。例如:sbitCY=0xD0^7;需要注意的是是,sbit是一個(gè)獨(dú)立立的關(guān)鍵字,,不要將它與與關(guān)鍵字bit相混淆。。關(guān)鍵字bit是C51編繹器的一一種擴(kuò)充數(shù)據(jù)據(jù)類型,用來(lái)來(lái)定義一個(gè)普普通位變量,,它的值是二二進(jìn)制數(shù)的0或1。例如如:staticbitdirection_bit/*定義一個(gè)靜靜態(tài)位變量direction_bit*/12.1.5用typedef重新新定義數(shù)據(jù)類類型在C51語(yǔ)言言程序中,用用戶還可以根根據(jù)自己的需需要對(duì)數(shù)據(jù)類類型重新定義義。其方法如如下:typedefintIntnew;/*定義Intnew為為新的整型數(shù)數(shù)據(jù)類型名*/Intnewi,j;/*將i,j定義為為Intnew型變量*/一般而言,用用typedef定義的的新數(shù)據(jù)類型型用大寫(xiě)字母母,以便與C語(yǔ)言中原有有的數(shù)據(jù)類型型相區(qū)別。12.1.6運(yùn)算符與表表達(dá)式運(yùn)算符是完成成某種特定運(yùn)運(yùn)算的符號(hào),,表達(dá)式則是是由運(yùn)算符及及運(yùn)算對(duì)換所所組成的具有有特定含義的的式子。C語(yǔ)語(yǔ)言是一種表表達(dá)式語(yǔ)言,,在任意一個(gè)個(gè)表達(dá)式后面面加一個(gè)分號(hào)號(hào)";"就構(gòu)構(gòu)成了一個(gè)表表達(dá)式語(yǔ)句。。運(yùn)算符按其在在表達(dá)式中所所起的作用,,可分為:賦賦值運(yùn)算符、、算術(shù)運(yùn)算符符、增量與減減量運(yùn)算符、、關(guān)系運(yùn)算符符、邏輯運(yùn)算算符、位運(yùn)算算符、復(fù)合運(yùn)運(yùn)算符、逗號(hào)號(hào)運(yùn)算符、條條件運(yùn)算符、、指針和地址址運(yùn)算符、強(qiáng)強(qiáng)制類型轉(zhuǎn)換換運(yùn)算符和sizeof運(yùn)算符等。。"="在C中中賦值運(yùn)算符符,如,x=10。示例例如下:a=0xFF;//將常數(shù)十十六進(jìn)制數(shù)FF賦于變量量aC51中的算算術(shù)運(yùn)算符有有如下幾個(gè),,其中只有取取正值和取負(fù)負(fù)值運(yùn)算符是是單目運(yùn)算符符,其它是雙雙目運(yùn)算符::+加或取正正值運(yùn)算符-減或取負(fù)負(fù)值運(yùn)算符*乘運(yùn)算符符/除運(yùn)算符符%取余運(yùn)算算符如:a+b*(10-a),(x+9)/(y-a)兩浮點(diǎn)數(shù)相除除,其結(jié)果為為浮點(diǎn)數(shù),如如10.0/20.0所所得值為0.5,兩個(gè)整整數(shù)相除時(shí),,所得值就是是整數(shù),如7/3,值為為2。C的運(yùn)運(yùn)算符有優(yōu)先先級(jí)和結(jié)合性性,可用括號(hào)號(hào)"()"來(lái)來(lái)改變優(yōu)先級(jí)級(jí)。12.2串行行通信與定時(shí)時(shí)程序下面給出1個(gè)個(gè)C51完整整程序,該例例子包含對(duì)定定時(shí)器、中斷斷和串行通信信的處理。該該程序運(yùn)行在在AT89C51單片機(jī)機(jī)上,該單片片機(jī)安裝在一一臺(tái)下位機(jī)上上,該下位機(jī)機(jī)接收從PSTN公共電電話網(wǎng)傳來(lái)的的數(shù)據(jù),然后后存儲(chǔ)轉(zhuǎn)發(fā)給給PC機(jī)。。12.3嵌入入式操作系統(tǒng)統(tǒng)12.3.1嵌入式操作作系統(tǒng)簡(jiǎn)介提高開(kāi)發(fā)效率率僅僅依靠編編程語(yǔ)言還不不夠,應(yīng)該要要建立自己的的開(kāi)發(fā)平臺(tái)。。嵌入式實(shí)時(shí)時(shí)操作系統(tǒng)((RTOS))就是一個(gè)很很好的嵌入式式軟件的開(kāi)發(fā)發(fā)平臺(tái)。使用用RTOS是是大勢(shì)所趨。。RTOS和一一般的操作系系統(tǒng)有何區(qū)別別?我們平時(shí)時(shí)熟悉的DOS、Windows、、Linux等操作系統(tǒng)統(tǒng)都是通用操操作系統(tǒng),它它們針對(duì)的是是PC或是工工作站。為了了最大幅度地地兼容各種軟軟硬件產(chǎn)品,,通用操作系系統(tǒng)一般面面面俱到、體積積龐大。而RTOS很很不一樣。嵌嵌入式系統(tǒng)中中的硬件資源源環(huán)境一般比比較苛刻,嵌嵌入式微處理理器和微控制制器的內(nèi)存一一般都不大,,要在如此緊緊張的資源下下完成復(fù)雜的的功能,這就就要求嵌入式式系統(tǒng)軟件必必須盡量的小小巧、穩(wěn)定和和高效。目前廣泛用于于各種嵌入式式智能設(shè)備的的嵌入式操作作系統(tǒng)有美國(guó)國(guó)加州的集成成系統(tǒng)公司推推出的pSOSystem,簡(jiǎn)稱pSOS。pSOS是是高高性性能能、、模模塊塊化化的的OS,,針針對(duì)對(duì)嵌嵌入入式式微微處處理理器器量量身身打打造造。。該該系系統(tǒng)統(tǒng)提提供供了了多多任任務(wù)務(wù)處處理理環(huán)環(huán)境境。。pSOS采采用用模模塊塊化化體體系系結(jié)結(jié)構(gòu)構(gòu),,包包括括一一個(gè)個(gè)實(shí)實(shí)時(shí)時(shí)多多任任務(wù)務(wù)核核心心和和一一系系列列軟軟件件部部件件、、連連接接庫(kù)庫(kù)。。系系統(tǒng)統(tǒng)中中的的每每個(gè)個(gè)部部分分都都是是封封閉閉式式的的,,相相互互之之間間既既獨(dú)獨(dú)立立又又密密切切協(xié)協(xié)作作。。開(kāi)開(kāi)發(fā)發(fā)人人員員可可以以根根據(jù)據(jù)不不同同的的應(yīng)應(yīng)用用需需求求來(lái)來(lái)制制定定操操作作系系統(tǒng)統(tǒng)的的功功能能和和所所需需要要的的內(nèi)內(nèi)存存大大小小。。pSOS的的主主要要組組成成部部分分有有::實(shí)實(shí)時(shí)時(shí)多多任任務(wù)務(wù)核核心心pSOS++、、TCP/IP協(xié)協(xié)議議堆堆棧棧pNA++、、遠(yuǎn)遠(yuǎn)程程過(guò)過(guò)程程調(diào)調(diào)用用庫(kù)庫(kù)pRPC++、、文文件件系系統(tǒng)統(tǒng)管管理理pHILE++、、ANSIC標(biāo)標(biāo)準(zhǔn)準(zhǔn)庫(kù)庫(kù)pREPC++、、調(diào)調(diào)試試功功能能模模塊塊pROBE++、、系系統(tǒng)統(tǒng)信信息息實(shí)實(shí)時(shí)時(shí)分分析析工工具具pMONT++等等等等。。pSOS有有如如下下特特征征::支支持持多多種種CPU和和驅(qū)驅(qū)動(dòng)動(dòng)器器硬硬件件產(chǎn)產(chǎn)品品;;集集成成了了網(wǎng)網(wǎng)絡(luò)絡(luò)技技術(shù)術(shù),,對(duì)對(duì)TCP/IP協(xié)協(xié)議議支支持持;;多多處處理理器器支支持持;;文文件件系系統(tǒng)統(tǒng)支支持持包包括括ISO9660、、MS--DOS兼兼容容文文件件系系統(tǒng)統(tǒng)和和高高性性能能嵌嵌入入式式文文件件系系統(tǒng)統(tǒng)。。另外,WindowsCE.Net也是是一個(gè)應(yīng)應(yīng)用較廣廣泛的實(shí)實(shí)時(shí)嵌入入式操作作系統(tǒng),,它是微微軟第一一個(gè)能夠夠全面支支持中文文的WindowsCE操操作系統(tǒng)統(tǒng),適用用于快速速構(gòu)建新新一代內(nèi)內(nèi)存少體體積小的的智能設(shè)設(shè)備,WindowsCE.NET也為為構(gòu)建智智能移動(dòng)動(dòng)設(shè)備的的開(kāi)發(fā)人人員提供供了新一一代的功功能強(qiáng)大大嵌入式式系統(tǒng)平平臺(tái)。WindowsCE.NET提供供了對(duì)無(wú)無(wú)線技術(shù)術(shù)的支持持,例如如藍(lán)牙技技術(shù)和零零配置的的802.11,它還還提供了了全面的的多媒體體和Web瀏覽覽體驗(yàn)。。WindowsCE.NET支支持各種種處理器器產(chǎn)品家家族,包包括x86、Xscale、、ARM、MIPS和和SH系系列?;?1單片機(jī)機(jī)的RTOS中中,有名名氣的有有KeilC51所所帶的RTXFull和RTXTiny,μμC/OSII。RTX51是一一個(gè)用于于8051系列列單片機(jī)機(jī)的多任任務(wù)實(shí)時(shí)時(shí)操作系系統(tǒng)。有有兩個(gè)不不同的版版本可用用。RTX51Full使使用四個(gè)個(gè)任務(wù)優(yōu)優(yōu)先權(quán)完完成同時(shí)時(shí)存在時(shí)時(shí)間片輪輪轉(zhuǎn)調(diào)度度和搶先先的任務(wù)務(wù)切換。。RTX51工工作在與與中斷功功能相似似的狀態(tài)態(tài)下,信信號(hào)和信信息可以以通過(guò)郵郵箱系統(tǒng)統(tǒng)在任務(wù)務(wù)之間互互相傳遞遞。開(kāi)發(fā)發(fā)者可以以從一存存儲(chǔ)池中中分配和和釋放內(nèi)內(nèi)存;可可以強(qiáng)迫迫一個(gè)任任務(wù)等待待中斷、、超時(shí),,或者是是從另一一個(gè)任務(wù)務(wù)或中斷斷發(fā)出信信號(hào)、信信息。RTX51Tiny是一個(gè)個(gè)RTX51的子集集,可以以很容易易地在沒(méi)沒(méi)有任何何外部存存儲(chǔ)器的的單片8051系統(tǒng)上上運(yùn)轉(zhuǎn);;它僅支支持時(shí)間間片輪轉(zhuǎn)轉(zhuǎn)任務(wù)切切換和使使用信號(hào)號(hào)進(jìn)行任任務(wù)切換換,不支支持搶占占式的任任務(wù)切換換,不包包括消息息隊(duì)列,,沒(méi)有存存儲(chǔ)器池池分配程程序。μC/OSII是著名名的、源源碼公開(kāi)開(kāi)的實(shí)時(shí)時(shí)內(nèi)核,,可用于于各類8位、16位和和32位位單片機(jī)機(jī)或DSP。從從μC/OS算算起,該該內(nèi)核已已有10余年應(yīng)應(yīng)用史,,并在諸諸多領(lǐng)域域得到廣廣泛應(yīng)用用。μC/OSII是是一個(gè)完完整、可可移植、、可固化化和可剪剪裁的占占先式實(shí)實(shí)時(shí)多任任務(wù)內(nèi)核核。μC/OSII是是用ANSI的的C語(yǔ)言言編寫(xiě)的的,包含含一小部部分匯編編代碼,,使之可可以供不不同架構(gòu)構(gòu)的微處處理器使使用。至至今,從從8位到到64位位,μC/OSII已已在超過(guò)過(guò)40種種不同架架構(gòu)的微微處理器器上運(yùn)行行。8051系列一一般只有有很少的的ROM和RAM,如如AT89C52只有有8KBFlash和256字字節(jié)RAM。但但RTX51Full自身身代碼有有6K多字節(jié)節(jié),且需需要大量量外部RAM,,不利于于學(xué)習(xí)。。RTXTiny雖雖然小((自身占占用900多字字節(jié)ROM),,但是任任務(wù)沒(méi)有有優(yōu)先級(jí)級(jí)和中斷斷管理,,無(wú)源代代碼,不不實(shí)用,,也不利利于學(xué)習(xí)習(xí)。而μμC/OSII有源代代碼,有有配套圖圖書(shū),利利于學(xué)習(xí)習(xí),但規(guī)規(guī)模太大大,又需需要大量量外部RAM,,而且所所有函數(shù)數(shù)都必須須是可重重入函數(shù)數(shù),用在在8051系列列這類小小片內(nèi)RAM的的單片機(jī)機(jī)上有點(diǎn)點(diǎn)勉強(qiáng)。。除了上述3種嵌入式式操作系統(tǒng)統(tǒng),還有廣廣州周立功功公司開(kāi)發(fā)發(fā)的SmallRTOS51,它使使用了RTX51Tiny的堆棧管管理機(jī)制,,并像μC/OSII一樣是是搶占式的的。雖然它它為51系系列單片機(jī)機(jī)編寫(xiě),但但比較容易易移植到其其他CPU上。目前前SmallRTOS51的所有版版本均可以以免費(fèi)在任任何領(lǐng)域使使用。12.3.2實(shí)時(shí)嵌嵌入式操作作系統(tǒng)分析析所謂操作系系統(tǒng),無(wú)非非就是處理理不同硬件件差異的接接口,或者者說(shuō)隱蔽硬硬件,使用用戶不必和和硬件打交交道,讓?xiě)?yīng)應(yīng)用程序可可以在上面面操作。通通過(guò)由操作作系統(tǒng)提供供出來(lái)的系系統(tǒng)接口來(lái)來(lái)寫(xiě)應(yīng)用程程序,無(wú)須須考慮硬件件問(wèn)題。嵌入式操作作系統(tǒng)是將將所有程序序,包括操操作系統(tǒng)、、驅(qū)動(dòng)程序序、應(yīng)用程程序等程序序代碼全部部都燒進(jìn)一一個(gè)ROM里面執(zhí)行行,操作系系統(tǒng)在其中中的角色比比較像函數(shù)數(shù)庫(kù)。操作系統(tǒng)主主要負(fù)責(zé)三三件事:內(nèi)內(nèi)存管理、、任務(wù)管理理、外圍資資源管理。。這三項(xiàng)機(jī)機(jī)制提供給給應(yīng)用程序序開(kāi)發(fā)者很很多的好處處,但是在在嵌入式系系統(tǒng)中并非非絕對(duì)必要要,如果系系統(tǒng)很簡(jiǎn)單單,可以根根本不用操操作系統(tǒng),,但對(duì)復(fù)雜雜的應(yīng)用程程序,有個(gè)個(gè)操作系統(tǒng)統(tǒng)幫忙會(huì)省省很多麻煩煩。嵌入式式操作系統(tǒng)統(tǒng)核心通常常很小,往往往只有4到20K。下面我我們來(lái)看看看這三項(xiàng)管管理機(jī)制。。內(nèi)存管理簡(jiǎn)單方式內(nèi)內(nèi)存管理不不提供任何何內(nèi)存管理理機(jī)制,但但也有好處處,用戶自自行管理內(nèi)內(nèi)存,用錯(cuò)錯(cuò)了系統(tǒng)就就宕機(jī)了,,系統(tǒng)只維維護(hù)一個(gè)已已經(jīng)配置的的空間的頂頂部指針。。位映像方式式內(nèi)存管理理是將可以以使用的內(nèi)內(nèi)存總空間間分成固定定大小的塊塊,系統(tǒng)本本身維護(hù)一一個(gè)內(nèi)存使使用位映像像來(lái)記錄內(nèi)內(nèi)存的使用用方式。在在內(nèi)存使用用位映像中中,每一個(gè)個(gè)位表示一一個(gè)64bytes大小內(nèi)存存塊的使用用情況,當(dāng)當(dāng)位等于0時(shí)表示已已經(jīng)有人用用過(guò)了,當(dāng)當(dāng)位值等于于1時(shí)表示示沒(méi)有分配配。標(biāo)簽邊界內(nèi)內(nèi)存管理方方式中,系系統(tǒng)會(huì)維護(hù)護(hù)一個(gè)頂部部指針指向向可用的內(nèi)內(nèi)存塊頂端端。當(dāng)用戶戶要求分配配內(nèi)存時(shí),,如果申請(qǐng)請(qǐng)的空間比比較小,比比如要存放放某個(gè)運(yùn)算算中的中間間變量,有有一個(gè)小空空間塊可供供分配,該該小空間塊塊以位映像像方式來(lái)管管理。系統(tǒng)統(tǒng)先在小空空間尋找有有無(wú)可用內(nèi)內(nèi)存,若有有則分配,,若沒(méi)有則則轉(zhuǎn)到調(diào)用用頂端指針針指向的地地址去尋找找。如果用用戶要求分分配的內(nèi)存存空間大,,就直接利利用頂端指指針去尋找找可用的內(nèi)內(nèi)存塊。內(nèi)存分區(qū)((memorypartitionmethod))管理方式式是將內(nèi)存存分成多個(gè)個(gè)區(qū)域,并并給每個(gè)區(qū)區(qū)域一個(gè)識(shí)識(shí)別碼(ID),在在每個(gè)區(qū)域域中包含幾幾個(gè)大小相相等的區(qū)塊塊(block)。。當(dāng)用戶申申請(qǐng)內(nèi)存時(shí)時(shí),只要告告訴系統(tǒng)區(qū)區(qū)域識(shí)別碼碼,系統(tǒng)就就會(huì)從相應(yīng)應(yīng)的區(qū)域中中取出一塊塊可用的區(qū)區(qū)塊給用戶戶。例如下下表所示::表12-7內(nèi)存存分區(qū)表第幾分區(qū)分區(qū)號(hào)區(qū)塊數(shù)目塊尺寸1-412501652100326-8315064945012810-165104K如果給定分分區(qū)號(hào)為2,現(xiàn)在在在第5分區(qū)區(qū)中的100個(gè)區(qū)塊塊還沒(méi)有使使用的話,,就拿到3K左右內(nèi)內(nèi)存。任務(wù)管理實(shí)時(shí)嵌入式式操作系統(tǒng)統(tǒng)的核心內(nèi)內(nèi)容就是對(duì)對(duì)任務(wù)的調(diào)調(diào)度、管理理。多任務(wù)(Multitasking)在一個(gè)操作作系統(tǒng)內(nèi)部部,內(nèi)核[kernel]是最最核心的部部件。從表面上看看,允許用用戶并發(fā)訪訪問(wèn)計(jì)算機(jī)機(jī)。多個(gè)用用戶似乎可可以并行執(zhí)執(zhí)行多個(gè)程程序。在操操作系統(tǒng)的的控制下,,每個(gè)正在在執(zhí)行的程程序就是一一個(gè)任務(wù)。。如果一個(gè)個(gè)操作系統(tǒng)統(tǒng)能夠以這這種方法執(zhí)執(zhí)行多個(gè)任任務(wù),這就就叫做多任任務(wù)。多任務(wù)操作作系統(tǒng)的使使用可以簡(jiǎn)簡(jiǎn)化應(yīng)用程程序的設(shè)計(jì)計(jì):

1..

操作系系統(tǒng)的多任任務(wù)和任務(wù)務(wù)間通信的的機(jī)制允許許復(fù)雜的應(yīng)應(yīng)用程序被被分成一系系列更小的的和更多的的可以管理理的任務(wù)。。2.

程序序的劃分讓讓軟件測(cè)試試更容易,團(tuán)隊(duì)工工作分解,也有利于于代碼復(fù)用用。3.

復(fù)雜雜的定時(shí)和和先后順序序的細(xì)節(jié)可可以從應(yīng)應(yīng)用程序代代碼中刪刪除。這成成為操作系系統(tǒng)的職責(zé)責(zé)。一個(gè)多任務(wù)務(wù)操作系統(tǒng)統(tǒng)可以使它它看起來(lái)好好像每個(gè)任任務(wù)并行執(zhí)執(zhí)行一樣。。這可以下下面的示意意圖來(lái)描述述。它顯示示了有關(guān)時(shí)時(shí)間的3個(gè)個(gè)任務(wù)的執(zhí)執(zhí)行模式。。任務(wù)名用用顏色標(biāo)注注出來(lái),寫(xiě)寫(xiě)在左手邊邊。時(shí)間從從左到右增增加,相應(yīng)應(yīng)的顏色的的線條顯顯示該任務(wù)務(wù)在某個(gè)特特殊時(shí)間正正在執(zhí)行。。上面的圖圖演示的的是用戶所所覺(jué)察到的的并行執(zhí)行行模式,下下面的圖是是實(shí)際的多多任務(wù)執(zhí)行行模式。圖12-2圖12-3所有可用的的任務(wù)都好好像在執(zhí)行行,但實(shí)際際上在任何何一個(gè)時(shí)刻刻都只有一一個(gè)任務(wù)在在執(zhí)行,其其它任務(wù)被被掛起,這這也就是時(shí)時(shí)分復(fù)用的的概念。調(diào)度調(diào)度器(scheduler)是內(nèi)核核中負(fù)責(zé)決決定在某個(gè)個(gè)特殊時(shí)間間哪個(gè)任務(wù)務(wù)應(yīng)該執(zhí)行行的部分。。下圖是內(nèi)內(nèi)核調(diào)度任任務(wù)的狀態(tài)態(tài)轉(zhuǎn)換圖。。圖12-4其中,停止止指任務(wù)已已經(jīng)執(zhí)行完完的狀態(tài);;就緒指任任務(wù)滿足所所有啟動(dòng)條條件后進(jìn)入入的狀態(tài),,掛起指當(dāng)當(dāng)該任務(wù)需需要等待某某一事件發(fā)發(fā)生。內(nèi)核核可以在任任務(wù)的運(yùn)行行期間,可可能會(huì)掛起起/恢復(fù)該該任務(wù)許多多次,之后后才能完成成該任務(wù)并并進(jìn)入停止止?fàn)顟B(tài)。除了被RTOS內(nèi)核核無(wú)意的掛掛起外,一一個(gè)任務(wù)還還可以自己己掛起自己己。如果一一個(gè)任務(wù)想想延遲一段段固定的時(shí)時(shí)間,或者者等待某個(gè)個(gè)資源可用用,或者等等待一個(gè)事事件出現(xiàn)(比如一個(gè)個(gè)鍵按下)。一個(gè)阻阻塞或者睡睡眠的任務(wù)務(wù)是不能執(zhí)執(zhí)行的,不不會(huì)為它分分配任何處處理時(shí)間。。圖12-5上圖中提到到的編號(hào):1)

任務(wù)務(wù)1正在運(yùn)運(yùn)行;2)

t2時(shí)刻,內(nèi)內(nèi)核掛起任任務(wù)1;3)

緊接接著,恢復(fù)復(fù)/開(kāi)始執(zhí)執(zhí)行任務(wù)2;4)

任務(wù)務(wù)2正在執(zhí)執(zhí)行,它工工作于獨(dú)占占訪問(wèn)方式式,它鎖定定一個(gè)處理理器外設(shè);;5)

t3時(shí)刻,內(nèi)內(nèi)核掛起任任務(wù)2;6)

緊接接著,恢復(fù)復(fù)任務(wù)3;;7)

任務(wù)務(wù)3試圖訪訪問(wèn)同樣的的處理器外外設(shè),發(fā)現(xiàn)現(xiàn)它被鎖定定,任務(wù)3不能繼續(xù)續(xù),所以自自己掛起自自己;8)

內(nèi)核核恢復(fù)任務(wù)務(wù)1;9)

接下下來(lái),任務(wù)務(wù)2在9處處執(zhí)行。它它完成了對(duì)對(duì)處理器外外設(shè)的訪問(wèn)問(wèn),所以解解鎖它;10)再再下來(lái),任任務(wù)3在10處執(zhí)行行。它發(fā)現(xiàn)現(xiàn)現(xiàn)在可以以訪問(wèn)處理理器外設(shè)了了,于是開(kāi)開(kāi)始執(zhí)行,,直到被內(nèi)內(nèi)核掛起。。調(diào)度策略是是調(diào)度器用用來(lái)決定哪哪個(gè)任務(wù)在在哪個(gè)時(shí)間間點(diǎn)執(zhí)行的的算法,也也常被稱為為排程算法法。一個(gè)非非實(shí)時(shí)多用用戶系統(tǒng)的的策略很可可能分配給給每個(gè)任務(wù)務(wù)一個(gè)"公公平"的處處理器時(shí)間間片,即采采用均分的的原則。用用在實(shí)時(shí)系系統(tǒng)/嵌入入式系統(tǒng)的的策略會(huì)更更復(fù)雜,一一般都屬于于先占式優(yōu)優(yōu)先權(quán)調(diào)度度策略,就就是先搶先先贏再加上上優(yōu)先權(quán)排排列來(lái)改善善。普遍有有四種方式式,我們分分別討論如如下:FCFS((firstcomefirstservicescheduling))策略,在在該策略下下,最先提提出服務(wù)要要求的執(zhí)行行線程會(huì)最最先分配到到CPU資資源,直到到結(jié)束或自自動(dòng)放棄。。PFS(priorityfirstscheduling)策略根根據(jù)任務(wù)的的優(yōu)先權(quán)來(lái)來(lái)決定分配配CPU資資源的先后后,若是優(yōu)優(yōu)先權(quán)相同同,則采用用FCFS調(diào)度策略略來(lái)決定任任務(wù)的先后后順序。RRS((round-robinscheduling))策策略略將將就就緒緒狀狀態(tài)態(tài)的的任任務(wù)務(wù)當(dāng)當(dāng)作作一一個(gè)個(gè)環(huán)環(huán)狀狀任任務(wù)務(wù),,將將其其放放入入循循環(huán)環(huán)隊(duì)隊(duì)列列中中處處理理,,每每一一個(gè)個(gè)執(zhí)執(zhí)行行線線程程具具有有一一個(gè)個(gè)時(shí)時(shí)間間片片的的值值,,以以記記錄錄可可以以使使用用CPU多多少少時(shí)時(shí)間間,,每每一一次次時(shí)時(shí)間間中中斷斷跑跑起起來(lái)來(lái),,時(shí)時(shí)間間片片值值就就減減一一,,當(dāng)當(dāng)時(shí)時(shí)間間片片值值用用完完之之后后,,就就會(huì)會(huì)切切換換到到另另外外一一個(gè)個(gè)任任務(wù)務(wù)。。PFRRS((priorityfirstwithroundscheduling))就就是是PFS加加上上RRS,,優(yōu)優(yōu)先先權(quán)權(quán)有有高高低低的的時(shí)時(shí)候候,,采采用用PFS,,若若優(yōu)優(yōu)先先權(quán)權(quán)相相同同,,則則采采用用RRS輪輪流流執(zhí)執(zhí)行行。。執(zhí)行行調(diào)調(diào)度度策策略略呢呢可可以以在在每每一一個(gè)個(gè)時(shí)時(shí)間間中中斷斷的的時(shí)時(shí)候候,,每每一一個(gè)個(gè)標(biāo)標(biāo)記記((tick))開(kāi)開(kāi)始始運(yùn)運(yùn)行行的的時(shí)時(shí)候候執(zhí)執(zhí)行行,,但但這這樣樣太太頻頻繁繁;;也也可可以以在在一一個(gè)個(gè)任任務(wù)務(wù)執(zhí)執(zhí)行行完完((即即時(shí)時(shí)間間片片值值為為零零))的的時(shí)時(shí)候候執(zhí)執(zhí)行行調(diào)調(diào)度度策策略略;;另另外外,,還還有有調(diào)調(diào)用用exit、、sleep、、waitevent、、giveupCPU等等時(shí)時(shí)候候,,都都會(huì)會(huì)去去執(zhí)執(zhí)行行調(diào)調(diào)度度策策略略。。實(shí)時(shí)時(shí)調(diào)調(diào)度度下面面的的圖圖演演示示多多任任務(wù)務(wù)是是如如何何被被時(shí)時(shí)實(shí)實(shí)操操作作系系統(tǒng)統(tǒng)調(diào)調(diào)度度的的。。假假設(shè)設(shè)RTOS自自己己已已經(jīng)經(jīng)建建立立了了一一個(gè)個(gè)空空閑閑任任務(wù)務(wù)idletask,,它它只只在在沒(méi)沒(méi)有有其其他他任任務(wù)務(wù)執(zhí)執(zhí)行行的的時(shí)時(shí)候候才才被被執(zhí)執(zhí)行行。。RTOSidletask總總是是處處于于可可以以執(zhí)執(zhí)行行的的狀狀態(tài)態(tài)((它它不不會(huì)會(huì)因因?yàn)闉榈鹊却馔庠O(shè)設(shè)資資源源而而被被阻阻塞塞,而而是是處處于于一一種種隨隨時(shí)時(shí)待待命命的的狀狀態(tài)態(tài))),,通通常??湛臻e閑任任務(wù)務(wù)就就是是檢檢查查整整個(gè)個(gè)系系統(tǒng)統(tǒng)還還有有哪哪些些資資源源應(yīng)應(yīng)該該回回收收或或是是該該做做些些默默認(rèn)認(rèn)的的系系統(tǒng)統(tǒng)動(dòng)動(dòng)作作。。圖12-6下面面來(lái)來(lái)看看看看上上圖圖所所示示的的多多任任務(wù)務(wù)實(shí)實(shí)時(shí)時(shí)調(diào)調(diào)度度過(guò)過(guò)程程::1.初初始始狀狀態(tài)態(tài),,定定時(shí)時(shí)器器控控制制任任務(wù)務(wù)vControlTask和和處處理理鼠鼠標(biāo)標(biāo)任任務(wù)務(wù)vMouseHandlerTask都都不不能能被被執(zhí)執(zhí)行行,,vControlTask等等待待合合適適的的時(shí)時(shí)間間開(kāi)開(kāi)始始新新的的控控制制循循環(huán)環(huán),,vMouseHandlerTask等等待待鼠鼠標(biāo)標(biāo)按按下下。。處處理理器器時(shí)時(shí)間間分分配配給給RTOS的的idletask。。2.在在t1時(shí)時(shí)刻刻,,一一個(gè)個(gè)鼠鼠標(biāo)標(biāo)鍵鍵按按下下,,事事件件發(fā)發(fā)生生,,VMouseHandlerTask任任務(wù)務(wù)現(xiàn)現(xiàn)在在可可以以執(zhí)執(zhí)行行,,它它比比RTOS的的idletask有有更更高高的的優(yōu)優(yōu)先先級(jí)級(jí),,所所以以處處理理器器分分配配時(shí)時(shí)間間給給它它。。3.在在t2時(shí)時(shí)刻,,vMouseHandlerTask已已經(jīng)完完成了了對(duì)按按鍵的的處理理,并并更新新了顯顯示輸輸出。。它不不能繼繼續(xù),,直到到下一一次鼠鼠標(biāo)鍵鍵被按按下,,所以以必須須掛起起它自自己。。RTOSidletask被恢恢復(fù)執(zhí)執(zhí)行。。4.在在t3時(shí)時(shí)刻,,一個(gè)個(gè)定時(shí)時(shí)器事事件預(yù)預(yù)示可可以執(zhí)執(zhí)行下下一個(gè)個(gè)控制制循環(huán)環(huán)了。。VControlTask現(xiàn)在在可以以執(zhí)行行,作作為最最高優(yōu)優(yōu)先級(jí)級(jí)的任任務(wù)被被立刻刻分配配到處處理器器時(shí)間間。5.在在t3和和t4之間間,當(dāng)當(dāng)vControlTask任務(wù)務(wù)還在在執(zhí)行行的時(shí)時(shí)候,,一個(gè)個(gè)鼠標(biāo)標(biāo)鍵按按下。。MouseHandlerTask不能能被執(zhí)執(zhí)行,,因?yàn)闉樗鼪](méi)沒(méi)有vControlTask的的優(yōu)先先級(jí)高高。不不能分分配到到任何何處理理器時(shí)時(shí)間。。6.在在t4時(shí)時(shí)刻,,vControlTask完成成了控控制循循環(huán)的的處理理,不不能夠夠重新新開(kāi)始始,直直到下下一個(gè)個(gè)時(shí)間間事件件出現(xiàn)現(xiàn),所所以它它自己己掛起起自己己。而而vMouseHandlerTask現(xiàn)現(xiàn)在是是最高高優(yōu)先先級(jí)的的任務(wù)務(wù),可可以運(yùn)運(yùn)行了了,所所以,,為了了處理理先前前的鼠鼠標(biāo)鍵鍵輸入入事件件,分分配到到了處處理器器時(shí)間間。7.在在t5時(shí)時(shí)刻,,鼠標(biāo)標(biāo)鍵已已經(jīng)被被處理理。VMouseHandlerTask為了了等待待下一一個(gè)鼠鼠標(biāo)鍵鍵事件件,掛掛起自自己。。現(xiàn)在在,兩兩個(gè)任任務(wù)再再度不不能執(zhí)執(zhí)行。。RTOSidletask分配配到時(shí)時(shí)間。。8.在在t5和和t6之間間,一一個(gè)定定時(shí)器器事件件被處處理,,但是是沒(méi)有有更多多的鼠鼠標(biāo)事事件出出現(xiàn)。。9.下下一一個(gè)鼠鼠標(biāo)鍵鍵按下下出現(xiàn)現(xiàn)在t6時(shí)時(shí)刻,,但在在vMouseHandlerTask完完成處處理鍵鍵之前前,一一個(gè)定定時(shí)器器事件件出現(xiàn)現(xiàn)了。?,F(xiàn)在在兩個(gè)個(gè)任務(wù)務(wù)都能能被執(zhí)執(zhí)行,,而vControlTask比比vMouseHandlerTask有有更更多的的優(yōu)先先級(jí),,所以以vMouseHandlerTask在在它完完成處處理鍵鍵盤(pán)之之前就就被掛掛起了了。VControlTask分分配到到處理理器時(shí)時(shí)間。。10.在在t8時(shí)刻刻,vControlTask完完成處處理控控制循循環(huán),,掛起起自己己以等等待下下一個(gè)個(gè)事件件。VMouseHandlerTask再次次成為為最高高優(yōu)先先級(jí)的的任務(wù)務(wù),能能夠運(yùn)運(yùn)行,,所以以分配配到處處理器器時(shí)間間,從從而鼠鼠標(biāo)鍵鍵按下下事件件處理理能夠夠完成成。11.在在t9時(shí)刻刻,vMouseHandlerTask已經(jīng)經(jīng)完成成了對(duì)對(duì)按鍵鍵的處處理,,并更更新了了顯示示輸出出。它它不能能繼續(xù)續(xù),直直到下下一次次鼠標(biāo)標(biāo)鍵被被按下下,所所以必必須掛掛起它它自己己。RTOSidletask又又被恢恢復(fù)執(zhí)執(zhí)行。。系統(tǒng)時(shí)時(shí)鐘節(jié)節(jié)拍中中斷系統(tǒng)時(shí)時(shí)鐘節(jié)節(jié)拍中中斷是是一種種任務(wù)務(wù)間切切換的的方法法,一一般稱稱之為為RTOS的TICK((標(biāo)記記),一般般用tickcount變變量來(lái)來(lái)度量量時(shí)間間。定定時(shí)器器中斷斷(RTOStickinterrupt)用用嚴(yán)嚴(yán)格的的時(shí)間間精度度來(lái)增增加tickcount,,允許許實(shí)時(shí)時(shí)內(nèi)核核用一一個(gè)指指定的的定時(shí)時(shí)器中中斷頻頻率精精度來(lái)來(lái)測(cè)量量時(shí)間間。每每次tickcount增增加后后,實(shí)實(shí)時(shí)內(nèi)內(nèi)核檢檢查查現(xiàn)在在是否否解除除阻塞塞或者者喚醒醒一個(gè)個(gè)任務(wù)務(wù)。一一個(gè)比比被中中斷的的任務(wù)務(wù)有更更

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論