《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > VxWorks下的任務(wù)監(jiān)控方法及應(yīng)用
VxWorks下的任務(wù)監(jiān)控方法及應(yīng)用
嵌入式在線
摘要: VxWorks下的任務(wù)監(jiān)控方法及應(yīng)用,1 VxWorks交叉開發(fā)模式 在VxWorks下應(yīng)用軟件開發(fā)時(shí)采用交叉開發(fā)模式,宿主機(jī)通常是普通的PC機(jī),,目標(biāo)機(jī)就是應(yīng)用程序真實(shí)的運(yùn)行的硬件平臺(tái);集成開發(fā)環(huán)境Tornado位于宿主機(jī),用戶通過(guò)Tornado開發(fā)環(huán)境完成代碼編寫
Abstract:
Key words :

1 VxWorks交叉開發(fā)模式
    在VxWorks下應(yīng)用軟件開發(fā)時(shí)采用交叉開發(fā)模式,宿主機(jī)通常是普通的PC機(jī),,目標(biāo)機(jī)就是應(yīng)用程序真實(shí)的運(yùn)行的硬件平臺(tái);集成開發(fā)環(huán)境Tornado位于宿主機(jī),,用戶通過(guò)Tornado開發(fā)環(huán)境完成代碼編寫,、編譯、鏈接,,宿主機(jī)與目標(biāo)機(jī)通過(guò)分別位于其上的Target Server和Target Agent實(shí)現(xiàn)信息交互,,物理連接往往是串口或者網(wǎng)絡(luò),在開發(fā)調(diào)試過(guò)程中,,用戶將編譯鏈接后的目標(biāo)代碼通過(guò)Target Server加載到目標(biāo)機(jī)上運(yùn)行,,可以通過(guò)Tornado下的Shell、Debugger,、Browser以及Windview等工具監(jiān)控目標(biāo)機(jī)上應(yīng)用程序任務(wù)的運(yùn)行情況,,應(yīng)用程序使用printf語(yǔ)句打印的調(diào)試信息回送到宿主機(jī),借助打印信息和Tornado提供的各種調(diào)試工具,,開發(fā)者可以監(jiān)控任務(wù)的運(yùn)行情況,,當(dāng)某個(gè)任務(wù)出錯(cuò)時(shí),可以通過(guò)各種輸出信息分析問(wèn)題原因,。
    但是一旦完成開發(fā)投入實(shí)際試驗(yàn)使用,, 由于實(shí)際使用環(huán)境和當(dāng)初的開發(fā)調(diào)試環(huán)境有較大的區(qū)別,難免會(huì)出現(xiàn)各種異常情況,,比較常見(jiàn)的異常就是任務(wù)掛起,,在這種情況下開發(fā)者往往無(wú)法像在地面調(diào)試時(shí)那樣可以外接調(diào)試電纜捕獲異常信息, 以確定發(fā)生異常的任務(wù),,也無(wú)法捕獲開發(fā)者在開發(fā)過(guò)程中的輔助打印信息,這種情況在戰(zhàn)斗機(jī)機(jī)載軟件尤為常見(jiàn),?;赩xWorks的應(yīng)用軟件大多采用多任務(wù)方式,無(wú)法像以前沒(méi)有操作系統(tǒng)的嵌入式系統(tǒng)那樣,,通過(guò)硬件看門狗電路,,在軟件運(yùn)行出錯(cuò)時(shí)自動(dòng)重啟恢復(fù)軟件運(yùn)行,一個(gè)任務(wù)出錯(cuò)往往并不會(huì)引起操作系統(tǒng)重啟,,用戶通過(guò)上層很難判斷應(yīng)用軟件運(yùn)行是否正常,。因此需要建立軟件看門狗機(jī)制,監(jiān)控任務(wù)運(yùn)行情況,在出現(xiàn)異常時(shí)記錄必要的異常信息,,自動(dòng)重啟設(shè)備,。同時(shí),需像開發(fā)階段那樣記錄輸出信息,,以輔助分析異常原因,。

2 系統(tǒng)輸出信息捕獲
    在VxWorks下系統(tǒng)輸出信息包括:標(biāo)準(zhǔn)輸出(STD_OUT,文件描述為1)和標(biāo)準(zhǔn)錯(cuò)誤輸出(STD_ERR,,文件描述為2),。使用printf、IogMsg語(yǔ)句等輸出的信息,,以及用戶和操作系統(tǒng)其他的打印輸出信息均通過(guò)STD_OUT輸出,,而STD_ERR則是在系統(tǒng)出錯(cuò)時(shí)使用,例如:
data access
Exception current instruction address:0x00072054
Machine Status Register:0x0000b030
Data Access Register:0xeeeeeef2
Condition Register:0x22000040
Data storage interrupt Register:0x0000b030
Task:0x1c9e50 "RadarProc"
    上面的打印信息是任務(wù)“RadarProc”出錯(cuò)時(shí)操作系統(tǒng)輸出的錯(cuò)誤信息,,通過(guò)STD_ERR文件描述符輸出的,。
    STD_OUT和STD_ERR可以分別輸出,但是通常情況下它們均定向到控制臺(tái)(consoleFd),,即在交叉開發(fā)模式下通過(guò)目標(biāo)機(jī)Target Agent和宿主機(jī)的Target Server輸出到串口或者網(wǎng)絡(luò),。在VxWorks下操作系統(tǒng)提供ioGIobalStdSet接口函數(shù)支持輸出重定向,函數(shù)原型:
void ioGIobaIStdSet(int stdFd,int newFd)
    其中stdFd為STD_OUT(1)或者STD_ERR(2),,newFd為重定向的文件描述符,。利用這個(gè)函數(shù)就可以實(shí)現(xiàn)系統(tǒng)輸出信息的捕獲,具體方法如下:
FILE* printf_stream = fopen("/ide0/log.txt","a+" ):
ioGlobalStdSet(STD_OUT,fileno(printf_stream)),;
ioGlobalStdSet(STD_ERR,fileno(printf_stream)),;
    在上面的代碼中,在設(shè)備/ide0(電子盤)上打開名為log.txt的文件,,打開方式為追加式,,將STD_OUT和STD_ERR重定向到printf_stream 指向的文件。需要注意的是,,不能像平常那樣關(guān)閉printf_stream 文件指針,,這樣就可以將系統(tǒng)的所有輸出信息保存在文件log.txt中。

3 任務(wù)監(jiān)控
3.1任務(wù)狀態(tài)
    VxWorks下任務(wù)有四種基本狀態(tài):READY,、PEND,、DELAY、SUSPEND,,在用戶不使用Shell命令人為改變?nèi)蝿?wù)狀態(tài)前提下,,如果狀態(tài)中出現(xiàn)SUSPEND,就說(shuō)明該任務(wù)已經(jīng)出錯(cuò),。

3.2任務(wù)監(jiān)控設(shè)計(jì)
    任務(wù)監(jiān)控需要周期性的監(jiān)測(cè)操作系統(tǒng)中所有運(yùn)行的任務(wù)狀態(tài),,發(fā)現(xiàn)某任務(wù)出錯(cuò)時(shí)記錄任務(wù)的相關(guān)基本信息,,并自動(dòng)重啟。任務(wù)監(jiān)控必須兩個(gè)操作系統(tǒng)接口函數(shù):
int taskIdListGet(int idList[],int maxTasks)
STATUS taskStatusString(int tid,char* pString)
    taskIdListGet函數(shù)可以獲得當(dāng)前操作系統(tǒng)中運(yùn)行的所有任務(wù),,idList存放獲取的任務(wù)id的數(shù)組,,maxTasks為數(shù)組大小。taskStatusString獲取任務(wù)狀態(tài)名稱,,tid是任務(wù)id,,pString為任務(wù)狀態(tài)名稱。
    在發(fā)現(xiàn)時(shí)任務(wù)出錯(cuò)時(shí)通過(guò)回調(diào)函數(shù)告訴用戶出錯(cuò)任務(wù)情況,,出錯(cuò)任務(wù)數(shù)據(jù)結(jié)構(gòu):
struct TroubleTaskStruct
{
int taskID,;//出錯(cuò)任務(wù)id
char taskName[256];//任務(wù)名稱
char taskState[32],;//任務(wù)狀態(tài)
};
回調(diào)函數(shù)原型:
typedef void (*TroubleTaskFuncPtr)(const TroubleTaskStruct troubleTaskVector,,int troubleTaskNum);

4 結(jié)束語(yǔ)
    嵌入式系統(tǒng)應(yīng)用軟件完成開發(fā)調(diào)試后,在隨后的試驗(yàn)階段很難象調(diào)試階段那樣得到任務(wù)狀態(tài)等輸出信息,,一旦出現(xiàn)任務(wù)異常,,因?yàn)槿狈Πl(fā)生異常時(shí)的相關(guān)信息,很難判斷和分析問(wèn)題,,給解決問(wèn)題帶來(lái)很大難度,,使用任務(wù)監(jiān)控和系統(tǒng)信息捕獲技術(shù)可以有效地解決此類問(wèn)題。

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載,。