?? ——利用實(shí)時(shí)內(nèi)核開(kāi)發(fā)嵌入式多任務(wù)程序.htm
字號(hào):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0060)http://www.21ic.com/new_info/news/files/news/20035911916.asp -->
<HTML><HEAD><TITLE>——利用實(shí)時(shí)內(nèi)核開(kāi)發(fā)嵌入式多任務(wù)程序</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>TD {
FONT-SIZE: 12px
}
INPUT {
FONT-SIZE: 12px; font-fammily: verdana,宋體
}
A:link {
FONT-SIZE: 12px; COLOR: #0000ff; LINE-HEIGHT: 16px; TEXT-DECORATION: underline
}
A:visited {
FONT-SIZE: 12px; COLOR: #660066; LINE-HEIGHT: 16px; TEXT-DECORATION: underline
}
A:hover {
FONT-SIZE: 12px; COLOR: #ff0000; TEXT-DECORATION: underline
}
.unnamed1 {
FONT-SIZE: 12px; FONT-FAMILY: "Arial", "Helvetica", "sans-serif"
}
.white {
FONT-SIZE: 12px; COLOR: #ffffff; LINE-HEIGHT: 16px
}
.b:link {
FONT-SIZE: 12px; COLOR: #3366cc; LINE-HEIGHT: 18px; TEXT-DECORATION: underline
}
.b:visited {
FONT-SIZE: 12px; COLOR: #813f1b; LINE-HEIGHT: 18px; TEXT-DECORATION: none
}
.b:hover {
FONT-SIZE: 12px; COLOR: #ffa037; LINE-HEIGHT: 18px; TEXT-DECORATION: underline
}
.148xg {
FONT-SIZE: 14px; COLOR: #0000ff; LINE-HEIGHT: 14pt; FONT-FAMILY: "宋體"; TEXT-DECORATION: underline
}
.128dt {
FONT-SIZE: 14px; COLOR: #9999cc; LINE-HEIGHT: 14pt; FONT-FAMILY: "宋體"; TEXT-DECORATION: none
}
.heigh150 {
LINE-HEIGHT: 150%
}
</STYLE>
<META content="MSHTML 6.00.2600.0" name=GENERATOR></HEAD>
<BODY text=#000000 bgColor=#ffffff leftMargin=0 topMargin=5>
<TABLE cellSpacing=0 cellPadding=0 width=768 align=center border=0>
<TBODY>
<TR>
<TD align=middle width=168 height=80><IMG
src="——利用實(shí)時(shí)內(nèi)核開(kāi)發(fā)嵌入式多任務(wù)程序.files/21ic.gif"></TD>
<TD width=472>
<SCRIPT language=javascript
src="——利用實(shí)時(shí)內(nèi)核開(kāi)發(fā)嵌入式多任務(wù)程序.files/ads.htm"></SCRIPT>
</TD>
<TD height=80>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=b12 align=middle height=30><FONT
face="Arial, Helvetica, sans-serif" color=#000000>
<SCRIPT language=JavaScript
src="——利用實(shí)時(shí)內(nèi)核開(kāi)發(fā)嵌入式多任務(wù)程序.files/date.js"></SCRIPT>
</FONT></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=1 width=768 align=center border=0>
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=3 width=766 align=left border=0>
<TBODY>
<TR bgColor=#d8d6ba>
<TD width=3 height=20></TD>
<DIV id=Position></DIV>
<TD width=378>
<FORM name=email
action=http://www.21icsearch.com/buzi/mail2/chkemail.asp method=post
target=_blank><B>電子工程周刊:</B> <INPUT class=main
style="BORDER-RIGHT: #0097cf 1px solid; BORDER-TOP: #0097cf 1px solid; BORDER-LEFT: #0097cf 1px solid; BORDER-BOTTOM: #0097cf 1px solid; BACKGROUND-COLOR: #ffffff"
maxLength=255 size=30 value=輸入您的Email name=email> <INPUT class=jbutton type=submit value=訂閱> </TD></FORM>
<DIV></DIV>
<DIV id=Time></DIV>
<DIV id=Image></DIV>
<DIV id=Title></DIV>
<TD width=418>
<MARQUEE onmouseover=this.scrollDelay=99000
onmouseout=this.scrollDelay=80 scrollAmount=2 scrollDelay=80
width="80%"><FONT color=#cc0000><IMG height=12
src="——利用實(shí)時(shí)內(nèi)核開(kāi)發(fā)嵌入式多任務(wù)程序.files/xilan_arrow.gif"
width=16>每周自動(dòng)接收行業(yè)新聞,技術(shù)資料,設(shè)計(jì)文章</FONT></MARQUEE></TD>
<DIV></DIV>
<TD width=9></TD></TR></TBODY></TABLE>
<DIV></DIV>
<DIV id=Time></DIV>
<DIV id=Image></DIV>
<DIV id=Title><TD< td></DIV></TD></TR></TBODY></TABLE></TD></TR></TABLE><BR>
<TABLE cellSpacing=0 cellPadding=0 width=768 align=center border=0>
<TBODY>
<TR>
<TD vAlign=top width=617 height=2>
<TABLE cellSpacing=0 cellPadding=0 width=583 align=center border=0>
<TBODY>
<TR>
<TD align=middle height=31><FONT size=4><B>利用實(shí)時(shí)內(nèi)核開(kāi)發(fā)嵌入式多任務(wù)程序
</B></FONT></TD></TR>
<TR>
<TD align=middle height=15>文章作者:楚育軍 劉守印<BR>文章類(lèi)型:設(shè)計(jì)應(yīng)用
文章加入時(shí)間:2003年5月9日1:19</TD></TR>
<TR>
<TD align=right><FONT color=#cc0000>文章出處:?jiǎn)纹瑱C(jī)與嵌入式系統(tǒng)應(yīng)用</FONT> </TD></TR>
<TR>
<TD height=15>
<HR width="100%" noShade SIZE=1>
</TD></TR>
<TR>
<TD height=15>
<TABLE cellSpacing=0 cellPadding=0 align=center border=0>
<TBODY>
<TR>
<TD></TD></TR></TBODY></TABLE><BR></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=530 align=center border=0>
<TBODY>
<TR>
<TD class=heigh150 height=15>
<DIV id=Content>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<B>摘要:</B></SPAN>嵌入式系統(tǒng)應(yīng)用日益復(fù)雜化,傳統(tǒng)的前臺(tái)/后臺(tái)程序開(kāi)發(fā)機(jī)制已經(jīng)不能滿足需求,目前更多地采用搶占式實(shí)時(shí)內(nèi)核開(kāi)發(fā)嵌入式多任務(wù)系統(tǒng)。實(shí)時(shí)內(nèi)核為多任務(wù)應(yīng)用程序提供最基本和最重要的服務(wù)。本文介紹實(shí)時(shí)內(nèi)核和多任務(wù),并提出利用實(shí)時(shí)內(nèi)核進(jìn)行系統(tǒng)開(kāi)發(fā)時(shí),根據(jù)系統(tǒng)功能合理構(gòu)成任務(wù)的方法。</P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<B>關(guān)鍵詞:</B></SPAN>實(shí)時(shí)內(nèi)核 多任務(wù) 任務(wù)構(gòu)造 嵌入式系統(tǒng)</P>
<P
style="TEXT-INDENT: 30px">隨著嵌入式系統(tǒng)的廣泛使用,傳統(tǒng)的前臺(tái)/后臺(tái)程序開(kāi)發(fā)機(jī)制已經(jīng)不能滿足日益復(fù)雜和多樣化的嵌入式應(yīng)用需求,因而常常采用嵌入式實(shí)時(shí)操作系統(tǒng)內(nèi)核(簡(jiǎn)稱(chēng)實(shí)時(shí)內(nèi)核)開(kāi)發(fā)實(shí)時(shí)多任務(wù)程序。嵌入式實(shí)時(shí)內(nèi)核提供多任務(wù)、任務(wù)管理、時(shí)間管理、任務(wù)間通信和同步、內(nèi)存管理等重要服務(wù),使嵌入式應(yīng)用程序容易設(shè)計(jì)和擴(kuò)展。內(nèi)核是管理微處理器或者微控制器時(shí)間的軟件,確保所有時(shí)間關(guān)鍵的事件盡可能高效地得到處理;允許將系統(tǒng)分成多個(gè)獨(dú)立的任務(wù),每個(gè)任務(wù)處理程序的一部分,從而簡(jiǎn)化系統(tǒng)的設(shè)計(jì)過(guò)程。</P>
<P style="TEXT-INDENT: 0px"><B>一、非搶占式內(nèi)核和搶占式內(nèi)核</B></P>
<P
style="TEXT-INDENT: 30px">實(shí)時(shí)內(nèi)核分為兩種:非搶占式內(nèi)核和搶占式內(nèi)核。這兩種內(nèi)核都由中斷服務(wù)例程(ISR)處理異步事件。在非搶占式內(nèi)核中,一個(gè)ISR使優(yōu)先級(jí)更高的任務(wù)就緒,并不立即將CPU控制權(quán)交給優(yōu)先級(jí)高的任務(wù),而是返回到被中斷的當(dāng)前任務(wù)。只有當(dāng)前任務(wù)執(zhí)行某種操作明確放棄CPU時(shí),優(yōu)先級(jí)高的新任務(wù)才得到CPU控制權(quán)。非搶占式內(nèi)核對(duì)實(shí)時(shí)事件的響應(yīng)時(shí)間不確定,因而極少在實(shí)時(shí)應(yīng)用中使用。圖1所示為非搶占式內(nèi)核程序流程:①低優(yōu)先級(jí)任務(wù)(LPT)執(zhí)行;②低優(yōu)先級(jí)任務(wù)被中斷;③執(zhí)行中斷服務(wù)例程,使高優(yōu)先級(jí)任務(wù)(HPT)就緒;<IMG
height=286 hspace=1 src="——利用實(shí)時(shí)內(nèi)核開(kāi)發(fā)嵌入式多任務(wù)程序.files/3a.gif" width=316
align=right vspace=1
border=0>④中斷服務(wù)例程返回到被中斷的低優(yōu)先級(jí)任務(wù);⑤低優(yōu)先級(jí)任務(wù)繼續(xù)執(zhí)行;⑥低優(yōu)先級(jí)任務(wù)放棄CPU;⑦高優(yōu)先級(jí)任務(wù)運(yùn)行。</P>
<P
style="TEXT-INDENT: 30px">目前在大多數(shù)嵌入式實(shí)時(shí)多任務(wù)系統(tǒng)應(yīng)用中,對(duì)系統(tǒng)實(shí)時(shí)響應(yīng)要求很高,因此采用搶占式內(nèi)核確保時(shí)間關(guān)鍵的任務(wù)最先執(zhí)行,使優(yōu)先級(jí)最高的就緒任務(wù)總是最先得到CPU控制權(quán)。優(yōu)先級(jí)低的當(dāng)前任務(wù)能夠被優(yōu)先級(jí)更高的任務(wù)搶占,暫時(shí)掛起執(zhí)行,將CPU控制權(quán)交給優(yōu)先級(jí)高的任務(wù)。圖2所示為搶占式內(nèi)核程序流程:①低優(yōu)先級(jí)任務(wù)執(zhí)行;②異步事件使任務(wù)中斷;③響應(yīng)異步事件,運(yùn)行中斷服務(wù)例程,使高優(yōu)先級(jí)任務(wù)就緒;④中斷服務(wù)例程返回到高優(yōu)先級(jí)任務(wù);⑤高優(yōu)先級(jí)任務(wù)執(zhí)行,直到它被中斷轉(zhuǎn)向執(zhí)行優(yōu)先級(jí)更高的任務(wù);⑥高優(yōu)先級(jí)任務(wù)結(jié)束,內(nèi)核切換到低優(yōu)先級(jí)任務(wù);⑦低優(yōu)先級(jí)任務(wù)繼續(xù)執(zhí)行。</P>
<P style="TEXT-INDENT: 0px"><B>二、多任務(wù)</B></P>
<P
style="TEXT-INDENT: 30px">利用實(shí)時(shí)內(nèi)核開(kāi)發(fā)嵌入式多任務(wù)系統(tǒng)程序,要根據(jù)明確的設(shè)計(jì)目的確認(rèn)系統(tǒng)功能,將系統(tǒng)功能合理分解,構(gòu)造不同的任務(wù),使每個(gè)任務(wù)負(fù)責(zé)完成應(yīng)用要求的一部分功能;并根據(jù)任務(wù)相對(duì)于其他任務(wù)的重要性決定其優(yōu)先級(jí)。多個(gè)任務(wù)彼此獨(dú)立運(yùn)行,具有獨(dú)立的私有堆棧空間,在被其他進(jìn)程搶占時(shí)能夠保持任務(wù)執(zhí)行線程的上下文。</P>
<P style="TEXT-INDENT: 30px">1.任務(wù)</P>
<P
style="TEXT-INDENT: 30px">任務(wù)是單線程序列指令形成的一個(gè)無(wú)限循環(huán),在系統(tǒng)程序中用函數(shù)表示(如下)。任務(wù)執(zhí)行時(shí)要調(diào)用內(nèi)核提供的服務(wù),以等待某個(gè)事件發(fā)生。事件可以是定時(shí)間,或者是另一個(gè)任務(wù)、一個(gè)中斷服務(wù)例程發(fā)出事件通知。</P>
<P style="TEXT-INDENT: 30px">Void Task (void)</P>
<P style="TEXT-INDENT: 30px">{</P>
<P style="TEXT-INDENT: 30px">While (true) {</P>
<P style="TEXT-INDENT: 30px">Run Application-specific codes;</P>
<P style="TEXT-INDENT: 30px">Wait for event by calling a service
provided by the kernel;</P>
<P style="TEXT-INDENT: 30px">Run Application - specific codes;</P>
<P style="TEXT-INDENT: 30px">}</P>
<P style="TEXT-INDENT: 30px">}</P>
<P style="TEXT-INDENT: 30px">2.任務(wù)管理</P>
<P
style="TEXT-INDENT: 30px">每個(gè)任務(wù)有5種狀態(tài);休眠、就緒、運(yùn)行、等待、中斷。圖3所示為任務(wù)之間的狀態(tài)轉(zhuǎn)換。休眠狀態(tài)的任務(wù)駐留在存儲(chǔ)器中,還未被內(nèi)核使用;就緒狀態(tài)的任務(wù)準(zhǔn)備執(zhí)行,優(yōu)先級(jí)低于當(dāng)前執(zhí)行的任務(wù),沒(méi)有得到CPU控制權(quán);任務(wù)得到CPU控制權(quán)后就處于運(yùn)行狀態(tài);等待事件發(fā)生的任務(wù)處于等待狀態(tài),事件可以是I/O操作完成、<IMG
height=268 hspace=1 src="——利用實(shí)時(shí)內(nèi)核開(kāi)發(fā)嵌入式多任務(wù)程序.files/3b.gif" width=309
align=right vspace=1
border=0>共享資源可以利用、時(shí)鐘脈沖發(fā)生等;任務(wù)執(zhí)行過(guò)程被中斷服務(wù)例程中斷,任務(wù)就處于中斷狀態(tài)。</P>
<P
style="TEXT-INDENT: 30px">實(shí)時(shí)內(nèi)核通過(guò)任務(wù)控制塊(TCB)管理任務(wù)。TCB數(shù)據(jù)結(jié)構(gòu)中包括任務(wù)的狀態(tài)、優(yōu)先、指向任務(wù)棧頂?shù)闹羔槨⒁约捌渌c內(nèi)核有關(guān)的信息。程序調(diào)用內(nèi)核服務(wù)(如調(diào)用內(nèi)核函數(shù)OSTaskCreate)創(chuàng)建任務(wù),為此任務(wù)在內(nèi)存中分配一個(gè)TCB、進(jìn)行初始化,使任務(wù)從休眠狀態(tài)轉(zhuǎn)變到就緒狀態(tài)。任務(wù)可以在多任務(wù)執(zhí)行之前靜態(tài)創(chuàng)建,也可以在多任務(wù)執(zhí)行過(guò)程動(dòng)態(tài)創(chuàng)建。</P>
<P
style="TEXT-INDENT: 30px">內(nèi)核為實(shí)時(shí)多任務(wù)應(yīng)用程序提供任務(wù)調(diào)度和轉(zhuǎn)換、任務(wù)間通信、定時(shí)順等服務(wù),并作為系統(tǒng)調(diào)用提供給任務(wù)使用。實(shí)時(shí)內(nèi)核以事件為基礎(chǔ)、根據(jù)任務(wù)執(zhí)行狀態(tài)對(duì)任務(wù)進(jìn)行切換,任務(wù)的狀態(tài)也隨之相應(yīng)改變。在實(shí)時(shí)多任務(wù)程序中,內(nèi)存中存在多個(gè)任務(wù)控制塊以及各個(gè)任務(wù)獨(dú)立的私有堆棧。進(jìn)行任務(wù)切換首先要保存CPU寄存器內(nèi)容到當(dāng)前任務(wù)堆棧,將堆棧指針保存到當(dāng)前任務(wù)的TCB中,然后從新任務(wù)的TCB中裝載堆棧指針,并將新任務(wù)上下文裝載到CPU寄存器中。這樣就從一個(gè)任務(wù)轉(zhuǎn)換到另一個(gè)任務(wù)運(yùn)行。任務(wù)使用這時(shí)內(nèi)核提供的定時(shí)器系統(tǒng)調(diào)用,可以保持休眠狀態(tài)一段時(shí)間,或者等待一段時(shí)間后成為就緒狀態(tài)。在實(shí)時(shí)嵌入式系統(tǒng)中,外部中斷事件產(chǎn)生的任務(wù)具有高優(yōu)先級(jí),因而以搶占方式獲得CPU控制權(quán)。</P>
<P style="TEXT-INDENT: 0px"><B>三、任務(wù)構(gòu)造</B></P>
<P style="TEXT-INDENT: 30px">1.I/O任務(wù)構(gòu)造</P>
<P
style="TEXT-INDENT: 30px">根據(jù)3種不同的I/O事件;中斷驅(qū)動(dòng)事件、輪詢(xún)事件、輸出事件來(lái)構(gòu)造I/O任務(wù)。輪詢(xún)事件通常由1個(gè)任務(wù)實(shí)現(xiàn),實(shí)時(shí)內(nèi)核以固定周期對(duì)此任務(wù)進(jìn)行調(diào)度,輸出事件常被設(shè)計(jì)為可重入程序而不是任務(wù);中斷驅(qū)動(dòng)事件是一類(lèi)典型的異步事件。</P>
<P
style="TEXT-INDENT: 30px">下面將以1個(gè)簡(jiǎn)單的串行設(shè)備驅(qū)動(dòng)程序來(lái)說(shuō)明I/O分解,突出I/O任務(wù)構(gòu)造的重要特征。此設(shè)備分配得到1個(gè)中斷向量,在3種情況下產(chǎn)生中斷:接收到字符、輸出就緒、設(shè)備出錯(cuò)。因?yàn)椴捎脫屨际絻?nèi)核,在I/O中斷發(fā)生進(jìn)入中斷處理例程以后,程序要保存處理器狀態(tài),并根據(jù)不同的中斷原因進(jìn)行任務(wù)調(diào)度;在中斷處理完成退出中斷處理例程之前,還要恢復(fù)處理器狀態(tài)。</P>
<P style="TEXT-INDENT: 30px">設(shè)備中斷處理:</P>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -