在傳統(tǒng)的嵌入式系統(tǒng)軟件設(shè)計中,多采用單任務(wù)順序機(jī)制。此機(jī)制的優(yōu)勢在于流程直觀,但它常帶來一個重要的問題--系統(tǒng)安全性差,即程序運(yùn)行中任一環(huán)節(jié)出錯都會導(dǎo)致系統(tǒng)混亂,只能依靠看門狗復(fù)位重新運(yùn)行。在焊縫跟蹤系統(tǒng)中,弧光干擾嚴(yán)重,若存在單任務(wù)順序機(jī)制,雖存在多種硬件高層干擾措施,系統(tǒng)有時仍需頻繁復(fù)位以致無法達(dá)到系統(tǒng)。為此在焊縫軌跡智能跟蹤系統(tǒng)中,作者將實(shí)時嵌放式操作系統(tǒng)uC/OS-II用于單片機(jī)80c196的軟件設(shè)計中,并設(shè)計監(jiān)視任務(wù),較好地解決了該問題。uC/OS-II是一種免費(fèi)的操作系統(tǒng)且源代碼公開,其可靠性已在許多應(yīng)用中得到了證明。
1 系統(tǒng)概述
系統(tǒng)設(shè)計目標(biāo)為:在TIG焊條件下,焊接速度為24cm/min時,焊頭與焊縫偏差小于1mm。
系統(tǒng)的設(shè)計思路為:采用電弧傳感器采集焊頭相對焊縫不同位置時的焊接電流信號,將此信號經(jīng)信號處理得焊頭相對于焊縫的偏差置,此偏差量經(jīng)控制運(yùn)算后得相應(yīng)的控制信號。將此控制信號輸出到電機(jī),從而改變焊頭與焊縫的偏差。
系統(tǒng)的功能塊有信號采集、信號處理、控制運(yùn)算、輸出等。另外由于本系統(tǒng)的弧光干擾嚴(yán)重,為防止程序運(yùn)行中因一個環(huán)節(jié)出錯而導(dǎo)致系統(tǒng)混亂以致無法控制焊頭與焊縫的偏差,本系統(tǒng)設(shè)計了監(jiān)視模塊用來及時糾錯。
系統(tǒng)結(jié)構(gòu)圖如圖1所示,由外而內(nèi)可分三層,分別為硬件電路層、任務(wù)層及操作系統(tǒng)層。
2 硬件電路層設(shè)計
本系統(tǒng)的硬件電路層包括一塊信號采集板和一塊驅(qū)動板。前者的用途在于從電弧傳感器獲取電流信號并將其轉(zhuǎn)換成電壓信號。此電流信號能有效表征焊頭與焊縫的位置關(guān)系,此電壓信號將被任務(wù)層的信號采集任務(wù)獲取。后者的用途在于制任務(wù)層中輸出任務(wù)產(chǎn)生的命令(此命令作用于單片機(jī)輸出口)傳輸?shù)诫姍C(jī),從而改變焊頭和焊縫的偏差。
3 任務(wù)層設(shè)計
3.1 系統(tǒng)任務(wù)層組成及其優(yōu)先權(quán)設(shè)置
系統(tǒng)任務(wù)層并行存在的幾個任務(wù)依其優(yōu)先權(quán)從高到低依次為:監(jiān)視任務(wù)、輸出任務(wù)、控制運(yùn)算任務(wù)、信號處理任務(wù)、信號采集任務(wù)。優(yōu)先權(quán)的設(shè)置由各任務(wù)的執(zhí)行順序以及對系統(tǒng)安全性影響的大小決定。本系統(tǒng)采用靜態(tài)優(yōu)先權(quán),即運(yùn)行過程中任務(wù)優(yōu)先權(quán)不變。
3.2 任務(wù)的狀態(tài)
本系統(tǒng)中各任務(wù)的狀態(tài)有4種:等待態(tài)、就緒態(tài)、運(yùn)行態(tài)以及中斷態(tài)。狀態(tài)的轉(zhuǎn)換關(guān)系如圖2所示。
當(dāng)一個任務(wù)點(diǎn)用CPU時該任務(wù)處于運(yùn)行態(tài),其優(yōu)先權(quán)必較所有就緒態(tài)任務(wù)優(yōu)先權(quán)高。若系統(tǒng)運(yùn)行導(dǎo)致就緒態(tài)某一任務(wù)的優(yōu)行權(quán)高于運(yùn)行態(tài)任務(wù)優(yōu)先僅,則調(diào)用調(diào)度函數(shù),運(yùn)行態(tài)任務(wù)將喪失對CPU的占用權(quán)而轉(zhuǎn)為就緒態(tài),優(yōu)先權(quán)最高的就緒態(tài)任務(wù)轉(zhuǎn)為運(yùn)行態(tài)。某一時刻只能有一個任務(wù)處于運(yùn)行態(tài)。任務(wù)在就緒態(tài)和運(yùn)行態(tài)間的轉(zhuǎn)化被稱為任務(wù)切換。
當(dāng)運(yùn)行態(tài)的任務(wù)期待某一消息時(即別的任務(wù)和該任務(wù)的數(shù)據(jù)傳遞,本設(shè)計中任務(wù)間的數(shù)據(jù)傳遞被稱為消息),該任務(wù)將喪失對CPU的占用權(quán)而轉(zhuǎn)為等待態(tài),等待時間可由系統(tǒng)設(shè)定。若等待時間內(nèi)該任務(wù)收到消息,任務(wù)將轉(zhuǎn)為就緒態(tài),否則將被時間管理函數(shù)強(qiáng)行轉(zhuǎn)為就緒態(tài)。
中斷發(fā)生時運(yùn)行態(tài)的任務(wù)將轉(zhuǎn)入中斷態(tài),喪失對CPU的占用權(quán)。因?yàn)閿嘀锌赡苡邢l(fā)送使等待態(tài)的任務(wù)轉(zhuǎn)入就緒態(tài),故中斷返回后將首先運(yùn)行調(diào)度函數(shù),決定任務(wù)狀態(tài)。
3.3 任務(wù)的構(gòu)成
系統(tǒng)中每個任務(wù)均有以下三部分組成:應(yīng)用程序、任務(wù)堆棧以及任務(wù)控制塊。其中只有應(yīng)用程序被燒入ROM,而任務(wù)本身則置于ROM,待系統(tǒng)運(yùn)行時再予于建立。
任務(wù)堆棧以存儲CPU寄存器內(nèi)容。當(dāng)某任務(wù)由運(yùn)行態(tài)變?yōu)槠渌鼱顟B(tài)時,CPU寄存器內(nèi)容壓入相應(yīng)任務(wù)堆棧,反之則將相應(yīng)任務(wù)堆棧內(nèi)容置入CPU寄存器。
作為系統(tǒng)中定義中一個數(shù)據(jù)結(jié)構(gòu),任務(wù)控制塊的內(nèi)容包括任務(wù)堆棧的地址、任務(wù)當(dāng)前狀態(tài)、任務(wù)優(yōu)先權(quán)等。操作系統(tǒng)通過查詢?nèi)蝿?wù)控制塊內(nèi)容實(shí)現(xiàn)對任務(wù)的管理。
3.4監(jiān)視任務(wù)的設(shè)計
因系統(tǒng)工作環(huán)境干擾強(qiáng)烈,雖已采取多種軟硬件抗干擾措施如光電隔離、軟件陷阱等,仍有可能因瞬間擾動使系統(tǒng)陷入混亂,導(dǎo)致 系統(tǒng)只能依靠看門狗復(fù)位重新運(yùn)行,以致無法實(shí)現(xiàn)設(shè)計目標(biāo)。為此本系統(tǒng)采用監(jiān)視任務(wù)監(jiān)督其它任務(wù)是否正常運(yùn)行,若未能正常運(yùn)行則采取相應(yīng)措施以盡量減少看門狗復(fù)位次數(shù)。
監(jiān)視任務(wù)設(shè)計思路為:被監(jiān)視任務(wù)正常運(yùn)行時其執(zhí)行時間是可預(yù)估的,被監(jiān)視任務(wù)在其即將運(yùn)行完畢時向監(jiān)視任務(wù)發(fā)送消息說明自身運(yùn)行正常。被監(jiān)視任務(wù)運(yùn)行時,監(jiān)視任務(wù)處于等待態(tài),等待被監(jiān)視任務(wù)給它發(fā)送消息,等待時間被設(shè)定為預(yù)計的任務(wù)正常運(yùn)行所需的最大時間。若等待時間內(nèi)監(jiān)視任務(wù)收到消息,則認(rèn)為發(fā)送消息的任務(wù)運(yùn)行正常,依照各任務(wù)執(zhí)行順序的先后下一任務(wù)開始運(yùn)行,監(jiān)視任務(wù)等待下一任務(wù)發(fā)送的消息。若等待時間已過,監(jiān)視任務(wù)仍未收到消息,則系統(tǒng)的時間管理函數(shù)將強(qiáng)行把監(jiān)視任務(wù)為就緒態(tài)。因監(jiān)視任務(wù)的優(yōu)先權(quán)是最高的,它將搶占對CPU的控制權(quán)并采取相應(yīng)的糾錯方案。本系統(tǒng)中針對常見故障建立對策庫,并將之置于ROM,以便實(shí)現(xiàn)應(yīng)用中根據(jù)故障的具體情況采取相應(yīng)措施。
現(xiàn)以信號采集任務(wù)中常出現(xiàn)的一個擾動為例加以介紹。信號采集任務(wù)進(jìn)行信號采集前者先查詢一個標(biāo)志位,該標(biāo)志位顯示焊接是否開始。若該標(biāo)志位置1表明焊接已經(jīng)開始,任務(wù)開始信號采集,否則任務(wù)一直查詢直至該標(biāo)志位置1。若該位在位置時由于瞬間振動導(dǎo)致未能置位成功以致信號采集任務(wù)不斷查詢該標(biāo)志位,將導(dǎo)致系統(tǒng)混亂。若未采用監(jiān)視任務(wù),則系統(tǒng)只能依靠看門狗復(fù)位。在本設(shè)計中由于操作系統(tǒng)的采用,使各任務(wù)的關(guān)系由傳統(tǒng)的順序機(jī)制變成并行機(jī)制。監(jiān)視任務(wù)在預(yù)定的等待時間仍未收到信號采集任務(wù)發(fā)送的消息,被時間管理函數(shù)置為就緒態(tài),且由于其優(yōu)先權(quán)較信號采集任務(wù)高,將獲得CPU的使用權(quán),使信號采集任務(wù)重新運(yùn)行以消除擾動的影響,即刷新看門狗寄存器的值,將信號采集任務(wù)置為就緒態(tài),并將信號采集任務(wù)的任務(wù)堆棧的斷點(diǎn)地址值改為采集任務(wù)起始地址后重新將自身置為等待態(tài)。
4 操作系統(tǒng)層設(shè)計
4.1 任務(wù)建立
因任務(wù)并未常駐ROM,操作系統(tǒng)的首要功能為建立所有任務(wù),將其初始化并置剛建立的任務(wù)為就緒態(tài)。
4.2 消息隊列
4.2.1 消息隊列的結(jié)構(gòu)
本設(shè)計中將任務(wù)間傳送的數(shù)據(jù)稱為消息。因系統(tǒng)中任務(wù)間有多個數(shù)據(jù)傳送,故采用消息隊列。消息隊列實(shí)質(zhì)是一個由指針組成的循環(huán)緩沖區(qū),如圖3所示。
其中osqstart為指向消息隊列起始地址的指針,osqend為消息隊列結(jié)束單元的下一地址的指針,osqstart、osqend使消息隊列構(gòu)成一個循環(huán)的緩沖區(qū)。osqsize為消息隊列的總單元數(shù),該值的大小視任務(wù)的需要而定。osqentry為消息隊列中消息數(shù),其值隨數(shù)據(jù)存取而改變。
osqin為指向消息隊列存入下一條消息的指針。osqout為指向消息隊列取出下一條消息的指針。系統(tǒng)初始化及osqin、osqout到達(dá)osqend時將被調(diào)整指向消息隊列起始地址。系統(tǒng)完成消息隊列創(chuàng)建后即開始對其進(jìn)行初始化,將osqentry置為0,osqin、osqout指向消息隊列起始地址。消息隊列的存取采取先進(jìn)先出的原則,osqin、osqout隨數(shù)據(jù)的存取相應(yīng)改變。
4.2.2 系統(tǒng)中的消息隊列
本系統(tǒng)中共有4個消息隊列,各消息隊列用途分別為:
消息隊列1被信號采集任務(wù)用于發(fā)送消息給信號處理,監(jiān)視任務(wù);消息隊列2被信號處理任務(wù)用于發(fā)送消息給控制運(yùn)算,監(jiān)視任務(wù);消息隊列3被控制運(yùn)行任務(wù)用于發(fā)送消息給輸出任務(wù),監(jiān)視任務(wù);消息隊列4被輸出任務(wù)用于發(fā)送消息給監(jiān)視任務(wù)。
本系統(tǒng)定義數(shù)據(jù)結(jié)構(gòu)--隊列控制塊業(yè)實(shí)現(xiàn)對多個消息隊列的管理,每個消息隊列對應(yīng)一個隊列控制塊。隊列控制埠的內(nèi)容包括指向消息隊列的指針以及該消息隊列對應(yīng)的等任務(wù)。消息存取采取優(yōu)先權(quán)原則,即消息隊列非空時,該消息隊列對應(yīng)的隊列中等待任務(wù)列表內(nèi)優(yōu)先權(quán)最高的任務(wù)先從消息隊列中取消息。因消息發(fā)送可能會導(dǎo)致任務(wù)狀態(tài)的變化,為維護(hù)消息的完整,消息發(fā)送中禁止任務(wù)切換。
因本系統(tǒng)中對消息的存取采取先入先出以及優(yōu)先權(quán)的原則,故各任務(wù)發(fā)送消息至消息隊列的順序?yàn)椋合劝l(fā)送給監(jiān)視任務(wù)的消息,后發(fā)送給其它任務(wù)的消息。各任務(wù)從消息隊列讀取的順序?yàn)椋罕O(jiān)視任務(wù)先讀,其它任務(wù)后讀。
4.3 系統(tǒng)調(diào)度
為保證系統(tǒng)的實(shí)時性,系統(tǒng)采用搶占式內(nèi)核,即優(yōu)先權(quán)高的就緒態(tài)任務(wù)獲得CPU的占有權(quán),優(yōu)先權(quán)低的就緒態(tài)任務(wù)對CPU的控制權(quán)被搶占,從運(yùn)行態(tài)轉(zhuǎn)入就緒態(tài)。此過程由調(diào)度函數(shù)完成。調(diào)度函數(shù)找到就緒態(tài)擁有最高優(yōu)先權(quán)的任務(wù),并將其與運(yùn)行態(tài)任務(wù)的優(yōu)先權(quán)比較,若就緒態(tài)任務(wù)的優(yōu)先權(quán)較高則模擬一次中斷,將當(dāng)前CPU寄存器內(nèi)容壓入運(yùn)行態(tài)任務(wù)堆棧,將就緒態(tài)任務(wù)堆棧內(nèi)容置于CPU寄存器。
本系統(tǒng)采用靜態(tài)優(yōu)先權(quán),若就緒態(tài)中任務(wù)的最高優(yōu)先權(quán)變化,則必有任務(wù)從等待態(tài)轉(zhuǎn)化成就緒態(tài)。而任務(wù)從等待態(tài)轉(zhuǎn)化成就緒態(tài)的前提為有消息產(chǎn)生,故調(diào)用調(diào)度函數(shù)時機(jī)為任務(wù)為消息發(fā)送完成以及中斷返回。
4.4 時間管理函數(shù)
時間管理函數(shù)功能為將等待時間已過的等待態(tài)任務(wù)置位為就緒態(tài),其實(shí)質(zhì)為時鐘中斷的中斷服務(wù)程序。系統(tǒng)運(yùn)行時將監(jiān)視任務(wù)等待時間置為定時器的延時時間,若被監(jiān)視任務(wù)正常運(yùn)行,則等待時間內(nèi)監(jiān)視任務(wù)將從消息隊列收到消息,恢復(fù)運(yùn)行態(tài),將則應(yīng)下一個任務(wù)的等待時間(即監(jiān)視任務(wù)收到下一任務(wù)給它發(fā)送的消息所需時間)置為定時器延時時間。若被監(jiān)視任務(wù)運(yùn)行異常,將產(chǎn)生時鐘中斷,強(qiáng)行將監(jiān)視任務(wù)置就緒態(tài),以便它采取相應(yīng)的糾錯措施。
5 系統(tǒng)運(yùn)行過程分析
系統(tǒng)運(yùn)行首要環(huán)節(jié)為初始化,包括兩部分:第一部分為建立任務(wù),為之分配優(yōu)先權(quán),將其置為就緒態(tài);第二部分為實(shí)現(xiàn)任務(wù)間的數(shù)據(jù)傳遞、建立消息隊列及對應(yīng)的隊列控制塊初始化消息隊列。
系統(tǒng)初始傾聽各任務(wù)即可開始調(diào)度運(yùn)行。剛開始時各任務(wù)均處就緒態(tài),此時監(jiān)視任務(wù)優(yōu)先權(quán)最高,最先運(yùn)行,查詢消息隊列1即信號采集任務(wù)有無給它發(fā)送消息,因消息隊列1為空,監(jiān)視任務(wù)變?yōu)榈却龖B(tài)并確定等待時間。此時輸出任務(wù)在所有就緒態(tài)任務(wù)中優(yōu)先權(quán)最高,可以運(yùn)行,但也因消息隊列2空變?yōu)榈却龖B(tài),依此類推。雖信號采集任務(wù)優(yōu)先權(quán)最低,但其無需等待別的任務(wù)給它發(fā)送消息,故信號采集任務(wù)得到CPU控制權(quán)。若信號采集任務(wù)未能正常運(yùn)行則等待時間過后消息隊列仍這人。時間管理函數(shù)將強(qiáng)行置監(jiān)視任務(wù)為就緒態(tài),因監(jiān)視任務(wù)的優(yōu)先權(quán)高將獲得CPU控制權(quán)并根據(jù)故障情況從對策庫中找出相應(yīng)解決方案。若信號采集任務(wù)正常運(yùn)行則在等待時間內(nèi)發(fā)送消息至消息隊列1,信號處理任務(wù)及監(jiān)視任務(wù)轉(zhuǎn)為就緒態(tài)。因監(jiān)視任務(wù)優(yōu)先權(quán)較高,先從消息隊列1獲取消息以確認(rèn)信號采集任務(wù)運(yùn)行無誤。查詢消息隊列2即信號處理任務(wù)有無給它發(fā)送消息,因信號處理任務(wù)尚未運(yùn)行,消息隊列2為空,監(jiān)視任務(wù)退出運(yùn)行態(tài)轉(zhuǎn)入等待態(tài)并確定等待時間,信號處理任務(wù)獲得對CPU控制權(quán),讀消息并開始運(yùn)行。其余任務(wù)的運(yùn)行依此類似。當(dāng)所有任務(wù)均運(yùn)行一次后所有任務(wù)狀態(tài)為就緒態(tài),開始下一周期的運(yùn)行。
經(jīng)系統(tǒng)實(shí)際運(yùn)行證明,因?qū)崟r嵌入式操作系統(tǒng)uC/OS-II以及監(jiān)視任務(wù)的采用,較好地提高了系統(tǒng)安全性能,有效地減少了復(fù)位次數(shù),達(dá)到了系統(tǒng)設(shè)計目標(biāo)。