vxworks任務(wù)管理-哈爾濱工業(yè)大學(xué)備課講稿課件_第1頁
vxworks任務(wù)管理-哈爾濱工業(yè)大學(xué)備課講稿課件_第2頁
vxworks任務(wù)管理-哈爾濱工業(yè)大學(xué)備課講稿課件_第3頁
vxworks任務(wù)管理-哈爾濱工業(yè)大學(xué)備課講稿課件_第4頁
vxworks任務(wù)管理-哈爾濱工業(yè)大學(xué)備課講稿課件_第5頁
已閱讀5頁,還剩249頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

嵌入式操作系統(tǒng)第3章VxWorks任務(wù)管理1、VxWorks下的任務(wù)2、VxWorks下任務(wù)控制及任務(wù)編程3、VxWorks任務(wù)調(diào)度嵌入式操作系統(tǒng)第3章VxWorks任務(wù)管理1、VxWor嵌入式操作系統(tǒng)?重點(diǎn)掌握–VxWorks下任務(wù)的特點(diǎn)–VxWorks提供的任務(wù)控制函數(shù)及應(yīng)用–VxWorks提供的任務(wù)調(diào)度策略及應(yīng)用嵌入式操作系統(tǒng)?重點(diǎn)掌握–VxWorks下任務(wù)的特點(diǎn)嵌入式操作系統(tǒng)1、VxWorks下任務(wù)的特點(diǎn)任務(wù)運(yùn)行的地址空間任務(wù)結(jié)構(gòu)任務(wù)的標(biāo)識任務(wù)的狀態(tài)及狀態(tài)轉(zhuǎn)換任務(wù)的上下文切換嵌入式操作系統(tǒng)1、VxWorks下任務(wù)的特點(diǎn)任務(wù)運(yùn)行的地址嵌入式操作系統(tǒng)?VxWorks中的wind內(nèi)核為VxWorks提供了

一個高性能的實(shí)時多任務(wù)操作環(huán)境–任務(wù)管理、任務(wù)創(chuàng)建、任務(wù)調(diào)度、時鐘、中斷、內(nèi)存管理?在VxWorks中,每個明顯獨(dú)立的程序在運(yùn)行時稱之為任務(wù)嵌入式操作系統(tǒng)?VxWorks中的wind內(nèi)核為VxWor嵌入式操作系統(tǒng)cobble.c?四個任務(wù)–第一個任務(wù)tCosmos模擬一個中斷服務(wù)程序生成新數(shù)據(jù)——cosmos()–第二個任務(wù)tSchlep收集數(shù)據(jù)——schlep()–第三個任務(wù)tCrunch處理數(shù)據(jù),完成計算并求出一個結(jié)果——crunch()–第四個任務(wù)tMonitor監(jiān)視結(jié)果值,當(dāng)結(jié)果超出安全范圍時,向屏幕打印報警信息——

monitor()?子函數(shù)——nodeAdd(),nodeScrap()嵌入式操作系統(tǒng)cobble.c?四個任務(wù)–第一個任務(wù)tC嵌入式操作系統(tǒng)1.1任務(wù)運(yùn)行的地址空間?VxWorks操作系統(tǒng)采取線性單一實(shí)地址空

間模式,所有任務(wù)都運(yùn)行在同一地址空間,不區(qū)分用戶態(tài)和核心態(tài)嵌入式操作系統(tǒng)1.1任務(wù)運(yùn)行的地址空間?VxWorks操嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)?VxWorks下任務(wù)具有如下特點(diǎn):–任務(wù)切換時不需要進(jìn)行虛擬地址空間切換–任務(wù)間可以直接共享變量,不需要通過內(nèi)核在不同的地址空間復(fù)制數(shù)據(jù)–系統(tǒng)調(diào)用時不需要在核心態(tài)和用戶態(tài)之間切換,相當(dāng)于直接的函數(shù)調(diào)用嵌入式操作系統(tǒng)?VxWorks下任務(wù)具有如下特點(diǎn):–任務(wù)嵌入式操作系統(tǒng)?!由于沒有訪問內(nèi)存任何約束和保護(hù),因而對代碼質(zhì)量提出了更高的要求?當(dāng)選用VxVMI時,每個任務(wù)各自的地址空間需要進(jìn)行虛擬地址到物理地址的轉(zhuǎn)換嵌入式操作系統(tǒng)?!由于沒有訪問內(nèi)存任何約束和保護(hù),因而對代嵌入式操作系統(tǒng)1.2任務(wù)的結(jié)構(gòu)data段數(shù)據(jù)段bss段TCB代碼段堆棧段不需要進(jìn)行用戶、內(nèi)核的區(qū)分嵌入式操作系統(tǒng)1.2任務(wù)的結(jié)構(gòu)data段數(shù)據(jù)段bss段TC嵌入式操作系統(tǒng)TCB?TCB用來描述一個任務(wù),每一任務(wù)都與一

個TCB關(guān)聯(lián)?TCB用windTcb結(jié)構(gòu)體來描述–VxWorks的taskLib庫中定義(taskLib.h)嵌入式操作系統(tǒng)TCB?TCB用來描述一個任務(wù),每一任務(wù)都與嵌入式操作系統(tǒng)?TCB中上下文信息包含的具體內(nèi)容:–程序執(zhí)行點(diǎn)(PC)–CPU狀態(tài),包括各種處理器特定的寄存器–––––棧任務(wù)的狀態(tài)延遲定時器時間片定時器I/O操作分配的標(biāo)準(zhǔn)輸入/輸出,標(biāo)準(zhǔn)錯誤輸出操作嵌入式操作系統(tǒng)?TCB中上下文信息包含的具體內(nèi)容:–程序嵌入式操作系統(tǒng)–––––––內(nèi)核控制結(jié)構(gòu)信號處理信息錯誤信息調(diào)試和性能監(jiān)視狀態(tài)任務(wù)變量(可選)浮點(diǎn)上下文(可選)可擴(kuò)展項(xiàng)(可選)嵌入式操作系統(tǒng)–內(nèi)核控制結(jié)構(gòu)嵌入式操作系統(tǒng)錯誤信息?在VxWorks中有一個全局變量errno來存放系統(tǒng)最近的錯誤狀態(tài)值?每個任務(wù)TCB中都記錄有一個全局errno副本—errostatus,屬于任務(wù)上下文的一部分?ISR也使用獨(dú)立的errno,但是ISR沒有

TCB,內(nèi)核為ISR在中斷棧中保存和恢復(fù)

errno嵌入式操作系統(tǒng)錯誤信息?在VxWorks中有一個全局變量e嵌入式操作系統(tǒng)?errno的值由4個字節(jié)表示,2個高字節(jié)表示

產(chǎn)生錯誤的模塊組件編碼,2個低字節(jié)表示錯誤編號–如0x110001,表示內(nèi)存不足?VxWorks提供errnoLib庫用于獲取和設(shè)置

任務(wù)和中斷的錯誤狀態(tài)值嵌入式操作系統(tǒng)?errno的值由4個字節(jié)表示,2個高字節(jié)表嵌入式操作系統(tǒng)任務(wù)變量?當(dāng)多個任務(wù)需要同一全局變量或靜態(tài)變量提供不同的值時,VxWorks提供任務(wù)變量機(jī)制來切換全局變量?任務(wù)變量機(jī)制允許在任務(wù)上下文中定義自己的私有變量,隨著上下文切換而切換嵌入式操作系統(tǒng)任務(wù)變量?當(dāng)多個任務(wù)需要同一全局變量或靜態(tài)變嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)?每個任務(wù)變量允許存放一個4字節(jié)的值typedefstructtaskVar/*TASK_VAR*/{structtaskVar*next;int*address;intvalue;}TASK_VAR;?VxWorks提供庫taskVarLib庫支持任務(wù)變

量機(jī)制嵌入式操作系統(tǒng)?每個任務(wù)變量允許存放一個4字節(jié)的值type嵌入式操作系統(tǒng)?當(dāng)有多個任務(wù)變量時,任務(wù)變量以單向鏈表的形式存在嵌入式操作系統(tǒng)?當(dāng)有多個任務(wù)變量時,任務(wù)變量以單向鏈表嵌入式操作系統(tǒng)?任務(wù)切換時需要遍歷任務(wù)變量鏈表,進(jìn)行變量值的恢復(fù)和保存——降低效率?!此機(jī)制會降低任務(wù)上下文切換的效率,

建議編程時謹(jǐn)慎使用嵌入式操作系統(tǒng)?任務(wù)切換時需要遍歷任務(wù)變量鏈表,進(jìn)行?!嵌入式操作系統(tǒng)堆棧?在任務(wù)創(chuàng)建時指定堆棧的大小?TCB記錄了位置和

大小等棧信息?任務(wù)棧大小的設(shè)置必須合理高地址pStackEndStackSizepStackBaseTCB低地址pTCBpTaskMem16bytes嵌入式操作系統(tǒng)堆棧?在任務(wù)創(chuàng)建時指定?任務(wù)棧大小的設(shè)置高嵌入式操作系統(tǒng)?VxWorks操作系統(tǒng)提供函數(shù)checkStack()

來檢查任務(wù)棧使用情況–checkStack()顯示了單個指定任務(wù)或者所有任

務(wù)的棧使用情況,包括:????棧大?。⊿IZE)棧當(dāng)前使用數(shù)(CUR)歷史使用峰值(HIGH)最大可能空余數(shù)(MARGIN=SIZE-HIGH)?Tornado中的browser也可查看棧的使用情

況?!堆棧診斷前提:棧初始化時要用0xee填

充嵌入式操作系統(tǒng)?VxWorks操作系統(tǒng)提供函數(shù)checkS嵌入式操作系統(tǒng)?shell下創(chuàng)建任務(wù)時默認(rèn)堆棧大小(sp命

令)–#defineSHELL_STACK_SIZE10000?VxWorks支持獨(dú)立的中斷棧,對所有的

ISR使用相同的中斷棧–中斷棧在系統(tǒng)啟動時根據(jù)配置參數(shù)設(shè)置位置、大小和填充。在configAll.h中有缺省定義:#defineISR_STACK_SIZE1000嵌入式操作系統(tǒng)?shell下創(chuàng)建任務(wù)時默認(rèn)堆棧大小(sp命嵌入式操作系統(tǒng)1.3任務(wù)的標(biāo)識?VxWorks下標(biāo)識任務(wù)有兩種途徑:任務(wù)名稱和任

務(wù)ID號?任務(wù)名稱–是獨(dú)一無二的字符串–主機(jī)任務(wù)以字母u開頭–目標(biāo)機(jī)任務(wù)以字母t開頭?任務(wù)ID號–長度為4字節(jié),指向TCB?VxWorks提供任務(wù)名稱和任務(wù)ID之間的轉(zhuǎn)換函數(shù)嵌入式操作系統(tǒng)1.3任務(wù)的標(biāo)識?VxWorks下標(biāo)識任務(wù)嵌入式操作系統(tǒng)1.4任務(wù)的狀態(tài)?5種基本狀態(tài):––––––––––執(zhí)行(RUN)就緒(READY)——任務(wù)只需等待cpu阻塞(PEND)——有cpu以外的資源不可用睡眠(DELAY)——任務(wù)處于睡眠狀態(tài)掛起(SUSPEND)——一般用于調(diào)試DELAY+S——睡眠+掛起PEND+S——阻塞+掛起狀態(tài)PEND+T——延時阻塞狀態(tài)PEND+T+S——延時阻塞+掛起狀態(tài)…+I——繼承優(yōu)先級狀態(tài),優(yōu)先級暫時被提升?多種組合狀態(tài)嵌入式操作系統(tǒng)1.4任務(wù)的狀態(tài)?5種基本狀態(tài):––執(zhí)行(嵌入式操作系統(tǒng)任務(wù)的狀態(tài)轉(zhuǎn)換圖任務(wù)創(chuàng)建時,處于掛起狀態(tài)taskSuspend()taskResume()掛起要使剛創(chuàng)建的任務(wù)就緒,

taskResume()要激活該任務(wù)

taskSuspend()taskSuspend()taskResume()/taskActivate()阻塞就緒semTake()/msgQReceive()semGive()/msgQSend()搶占調(diào)度睡眠taskDelay()

使用spawning原語,可以直接延時已到創(chuàng)建并激活一個任務(wù)任務(wù)可以在任何狀態(tài)下被刪除執(zhí)行嵌入式操作系統(tǒng)任務(wù)的狀態(tài)轉(zhuǎn)換圖任務(wù)創(chuàng)建時,處于掛起狀態(tài)tas嵌入式操作系統(tǒng)任務(wù)的狀態(tài)隊(duì)列嵌入式操作系統(tǒng)任務(wù)的狀態(tài)隊(duì)列嵌入式操作系統(tǒng)1.5任務(wù)上下文切換?上下文切換示意圖TCB(Old)copyofpccopyofspCPUpcspTCB(New)copyofpccopyofsperrorStatuserrnoerrorStatus嵌入式操作系統(tǒng)1.5任務(wù)上下文切換?上下文切換示意圖TC嵌入式操作系統(tǒng)?上下文切換分兩種情況:同步和異步?同步上下文切換,引起的原因是當(dāng)前運(yùn)行的任務(wù)

執(zhí)行下列操作:–進(jìn)行阻塞、延遲、掛起的調(diào)用;–使更高優(yōu)先級任務(wù)就緒而發(fā)生優(yōu)先級搶占–降低自身優(yōu)先級或者退出;?異步上下文切換,通常由ISR使更高優(yōu)先級任務(wù)就

緒引起。嵌入式操作系統(tǒng)?上下文切換分兩種情況:同步和異步–進(jìn)行阻嵌入式操作系統(tǒng)1.6VxWorks的系統(tǒng)任務(wù)?根任務(wù)tUsrRoot–內(nèi)核執(zhí)行的第一個任務(wù)–初始化VxWorks系統(tǒng)的主要功能,例如?發(fā)起日志任務(wù)、異常處理任務(wù)、網(wǎng)絡(luò)任務(wù)和

tRlogind后臺任務(wù)–通常,上述初始化結(jié)束之后,根任務(wù)終止并刪除–用戶可以向根任務(wù)自由的添加任何必需的初始化代碼–對應(yīng)usrRoot()函數(shù)(target/config/all/usrConfig.c)嵌入式操作系統(tǒng)1.6VxWorks的系統(tǒng)任務(wù)?根任務(wù)tU嵌入式操作系統(tǒng)?日志任務(wù):tLogTask–記錄系統(tǒng)信息的任務(wù)。它不執(zhí)行輸入/輸出操作。?異常處理任務(wù):tExcTask–提供VxWorks異常處理包,完成在中斷級不能執(zhí)行的功能–必須具有系統(tǒng)最高的優(yōu)先級–不能掛起、刪除、改變其任務(wù)的優(yōu)先級?目標(biāo)代理服務(wù):tWdbTask(INCLUDE_WDB)–當(dāng)目標(biāo)代理設(shè)置為運(yùn)行在任務(wù)模式時,創(chuàng)建此任務(wù)–處理來自Tornado目標(biāo)服務(wù)的請求★以上3種任務(wù)都屬于VxWorks的基本任務(wù)嵌入式操作系統(tǒng)?日志任務(wù):tLogTask–記錄系統(tǒng)信息嵌入式操作系統(tǒng)?網(wǎng)絡(luò)任務(wù):tNetTask(INCLUDE_NET_LIB)

–后臺處理VxWorks網(wǎng)絡(luò)需要的任務(wù)級功能處理?其他可選組件的任務(wù)

–tShell(INCLUDE_SHELL)

–tRlogind(INCLUDE_RLOGIN)

–tTelnetd(INCLUDE_TELNET)

–tPortmapd(INCLUDE_RPC)嵌入式操作系統(tǒng)?網(wǎng)絡(luò)任務(wù):tNetTask(INCLUDE嵌入式操作系統(tǒng)與Linux比較?任務(wù)控制塊的內(nèi)容多用戶性、任務(wù)間的親屬關(guān)系、文件打開表、隊(duì)列信息、虛擬內(nèi)存信息、錯誤狀態(tài)等?棧棧的大小、中斷棧?任務(wù)狀態(tài)狀態(tài)的種類、狀態(tài)間的轉(zhuǎn)換嵌入式操作系統(tǒng)與Linux比較?任務(wù)控制塊的內(nèi)容多用戶性、嵌入式操作系統(tǒng)2、VxWorks下任務(wù)控制及任務(wù)編程??????任務(wù)創(chuàng)建和激活任務(wù)刪除與任務(wù)安全任務(wù)的狀態(tài)控制任務(wù)信息的獲取任務(wù)擴(kuò)展函數(shù)代碼的共享與重入嵌入式操作系統(tǒng)2、VxWorks下任務(wù)控制及任務(wù)編程?任務(wù)創(chuàng)嵌入式操作系統(tǒng)?VxWorks提供豐富的任務(wù)控制功能,包含在

taskLib庫中?包括:

–任務(wù)的創(chuàng)建、刪除、狀態(tài)控制、獲取任務(wù)信息等等?可以在TornadoIDE提供的shell工具中交互使用

這些調(diào)用嵌入式操作系統(tǒng)?VxWorks提供豐富的任務(wù)控制功能,包含嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)2.1任務(wù)的創(chuàng)建與激活?VxWorks的TaskLib庫中提供多個函數(shù)用于創(chuàng)建

任務(wù):調(diào)用taskSpawn()taskInit()taskActivate()描述創(chuàng)建并激活一個任務(wù)初始化一個新任務(wù)激活一個初始化任務(wù)嵌入式操作系統(tǒng)2.1任務(wù)的創(chuàng)建與激活?VxWorks的T嵌入式操作系統(tǒng)taskSpawn()—創(chuàng)建并激活一個新任務(wù)inttaskSpawn(char*name,/*新任務(wù)的任務(wù)名*/intpriority,/*新任務(wù)的優(yōu)先級*/intoptions,/*任務(wù)選項(xiàng)字*/intstackSize,/*堆棧大小*/FUNCPTRentryPt,/*新任務(wù)的入口函數(shù)*/intarg1,arg2,arg3,arg4,arg5,/*傳遞給入口函數(shù)*/intarg6,arg7,arg8,arg9,arg10/*的10參數(shù)*/)嵌入式操作系統(tǒng)taskSpawn()—創(chuàng)建并激活一個新任務(wù)i嵌入式操作系統(tǒng)TaskSpawn()?創(chuàng)建新任務(wù)的上下文

–堆棧、TCB、含有特定參數(shù)的入口程序調(diào)用的任務(wù)環(huán)境(入口程序通常是一個普通的程序)

–新的任務(wù)將在指定的函數(shù)入口處執(zhí)行

–激活新任務(wù)?堆棧是系統(tǒng)資源,位于系統(tǒng)內(nèi)存中

–其底端是TCB–堆棧使用0xEE填充?任務(wù)名要便于記憶,可以是任意長度、任意內(nèi)容嵌入式操作系統(tǒng)TaskSpawn()?創(chuàng)建新任務(wù)的上下文嵌入式操作系統(tǒng)?taskSpawn中的任務(wù)選項(xiàng)參數(shù)可以是下表中的選項(xiàng)之一或其組合如果任務(wù)使用任何浮點(diǎn)操作,必須要求使用VX_FP_TASK選項(xiàng)嵌入式操作系統(tǒng)?taskSpawn中的任務(wù)選項(xiàng)參數(shù)可以是下嵌入式操作系統(tǒng)?任務(wù)的優(yōu)先級:

–Wind內(nèi)核支持256種優(yōu)先級,0~255

–優(yōu)先級0為最高,優(yōu)先級255為最低

–一般,0~99分配給系統(tǒng)任務(wù),100~255分配給用戶任務(wù)嵌入式操作系統(tǒng)?任務(wù)的優(yōu)先級:嵌入式操作系統(tǒng)taskSpawn()返回值?成功:任務(wù)ID號?失?。篍RROR。返回的ERRNOS可能有–S_intLib_NOT_ISR_CALLABLE,/*程序不能從一個ISR中調(diào)用*/–S_objLib_OBJ_ID_ERROR,/*不正確的任務(wù)ID*/–S_smObjLib_NOT_INITIALIZED,/*在指定的分區(qū)中,沒有足夠的內(nèi)存用于發(fā)起任務(wù)*/–S_memLib_NOT_ENOUGH_MEMORY,/*沒有足夠的內(nèi)存發(fā)起任務(wù)*/–S_memLib_BLOCK_ERROR,/*不能夠?qū)?nèi)存分區(qū)互斥訪問*/–S_taskLib_ILLEGAL_PRIORITY/*非法的優(yōu)先級*/嵌入式操作系統(tǒng)taskSpawn()返回值?成功:任務(wù)ID嵌入式操作系統(tǒng)?在源代碼中使用TaskSpawn創(chuàng)建新任務(wù)?在TornadoShell中–使用TaskSpawn創(chuàng)建新任務(wù)–使用i查看系統(tǒng)中的任務(wù)(演示)嵌入式操作系統(tǒng)?在源代碼中使用TaskSpawn創(chuàng)建新任務(wù)嵌入式操作系統(tǒng)?taskSpawn()中包含了一些低級的操作,包括初始

化和激活一個任務(wù)

–taskInit()

–taskActivate()嵌入式操作系統(tǒng)?taskSpawn()中包含了一些低級的操嵌入式操作系統(tǒng)taskInit()初始化一個任務(wù)STATUStaskInit(WIND_TCB*pTcb,/*新任務(wù)的TCB地址*/char*name,允許不指定任務(wù)名,由系統(tǒng)自動命名/*新任務(wù)的名字*/intpriority,/*新任務(wù)的優(yōu)先級*/intoptions,/*任務(wù)選項(xiàng)字*/char*pStackBase,/*任務(wù)堆棧基地址*/

初始化指定的內(nèi)存區(qū)域作為任務(wù)的堆棧和控制塊,而不像taskSpawn()那樣由系

intstackSize,/*堆棧大小*/FUNCPTRentrypt,統(tǒng)自動分配/*任務(wù)入口*/intarg1,arg2,arg3,arg4,arg5,/*入口參數(shù)*/

可以方便應(yīng)用進(jìn)行調(diào)試,并將堆棧分配在指定位置intarg6,arg7,arg8,arg9,arg10)嵌入式操作系統(tǒng)taskInit()初始化一個任務(wù)STATUS嵌入式操作系統(tǒng)?taskInit的返回值:

–成功:OK–任務(wù)不能初始化則:ERROR??赡芊祷氐?/p>

ERRNOS值有:?S_intLib_NOT_ISR_CALLABLE/*程序不能從一個ISR中調(diào)用*/?S_objLib_OBJ_ID_ERROR/*不正確的任務(wù)ID*/嵌入式操作系統(tǒng)?taskInit的返回值:?S_intL嵌入式操作系統(tǒng)taskActivate()激活一個任務(wù)?STATUStaskActivate(inttid)?taskActivate()激活由taskInit()創(chuàng)建的任務(wù),其參

數(shù)是taskInit()中第一個參數(shù)任務(wù)TCB的地址,強(qiáng)制類型轉(zhuǎn)換如下:–tid=(int)pTcb;?注意:當(dāng)應(yīng)用需要對任務(wù)定位和激活進(jìn)行控制時,才使用這兩個函數(shù),通常使用taskSpawn()就可以了嵌入式操作系統(tǒng)taskActivate()激活一個任務(wù)?S嵌入式操作系統(tǒng)管理任務(wù)名稱和ID號的函數(shù)????由任務(wù)號得到任務(wù)名taskName()

由任務(wù)名得到任務(wù)ID號taskNameTold()taskIDSelf()

得到任務(wù)自身的ID號taskIdVerify()

證實(shí)一個特定任務(wù)的存在(由任務(wù)ID指定)嵌入式操作系統(tǒng)管理任務(wù)名稱和ID號的函數(shù)?嵌入式操作系統(tǒng)任務(wù)選項(xiàng)相關(guān)函數(shù)?盡管TaskSpawn()中options參數(shù)指定的新任務(wù)的選項(xiàng),使用下列函數(shù)可以動態(tài)讀取或設(shè)置指定任務(wù)的選項(xiàng)

–taskOptionsGet():獲取任務(wù)選項(xiàng)

–taskOptionsSet():設(shè)置任務(wù)選項(xiàng)–當(dāng)前只有VX_UNBREAKABLE選項(xiàng)可以改變嵌入式操作系統(tǒng)任務(wù)選項(xiàng)相關(guān)函數(shù)?盡管TaskSpawn()嵌入式操作系統(tǒng)獲取任務(wù)信息????????taskIDListGet():獲取所有活動任務(wù)的ID號taskInfoGet():得到指定任務(wù)的信息taskPriorityGet():查看指定任務(wù)的優(yōu)先級taskRegsGet():查看任務(wù)的寄存器taskRegsSet():設(shè)置任務(wù)的寄存器taskIsSuspended():查看指定任務(wù)是否掛起taskIsReady():查看指定任務(wù)是否就緒taskTCB:得到任務(wù)控制塊指針嵌入式操作系統(tǒng)獲取任務(wù)信息?taskIDListGet():嵌入式操作系統(tǒng)taskSpawn應(yīng)用實(shí)例1嵌入式操作系統(tǒng)taskSpawn應(yīng)用實(shí)例1嵌入式操作系統(tǒng)?結(jié)果演示嵌入式操作系統(tǒng)?結(jié)果演示嵌入式操作系統(tǒng)?仿真器上顯示信息:嵌入式操作系統(tǒng)?仿真器上顯示信息:嵌入式操作系統(tǒng)?將s2_tasks中的優(yōu)先級101改為101-i嵌入式操作系統(tǒng)?將s2_tasks中的優(yōu)先級101改為10嵌入式操作系統(tǒng)?演示結(jié)果嵌入式操作系統(tǒng)?演示結(jié)果嵌入式操作系統(tǒng)taskSpawn應(yīng)用實(shí)例2嵌入式操作系統(tǒng)taskSpawn應(yīng)用實(shí)例2嵌入式操作系統(tǒng)?演示結(jié)果嵌入式操作系統(tǒng)?演示結(jié)果嵌入式操作系統(tǒng)?仿真器上顯示信息:嵌入式操作系統(tǒng)?仿真器上顯示信息:嵌入式操作系統(tǒng)2.2任務(wù)刪除和刪除安全?任務(wù)可以動態(tài)地從系統(tǒng)中刪除?刪除任務(wù)的函數(shù)調(diào)用若任務(wù)的入口函數(shù)指定返回,則將隱含調(diào)用exit();另外,任務(wù)可以在任何時候調(diào)用exit殺死自身;–exit():終止任務(wù)自身的執(zhí)行,釋放所占用的

內(nèi)存(stack和TCB)–taskDelete():終止一個指定任務(wù),釋放所占

用的內(nèi)存(同上)任務(wù)可以在任何時候調(diào)用taskDelete刪除其他任務(wù)任務(wù)終止時,其執(zhí)行時任務(wù)分配的內(nèi)存不會被釋放,如malloc()分配的內(nèi)存,必須由任務(wù)自身編程釋放。嵌入式操作系統(tǒng)2.2任務(wù)刪除和刪除安全?任務(wù)可以動態(tài)地從嵌入式操作系統(tǒng)taskDelete應(yīng)用實(shí)例延遲0.5秒嵌入式操作系統(tǒng)taskDelete應(yīng)用實(shí)例延遲0.5秒嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)?演示結(jié)果嵌入式操作系統(tǒng)?演示結(jié)果嵌入式操作系統(tǒng)?仿真器上顯示信息:嵌入式操作系統(tǒng)?仿真器上顯示信息:嵌入式操作系統(tǒng)?注意:不要在一個不合適的時刻刪除任務(wù),在刪除之前,該任務(wù)必須釋放它所持有的所有資源?保護(hù)任務(wù)不被刪除的函數(shù)調(diào)用任務(wù)訪問臨界區(qū)時就需要這種保護(hù)。例如,為了對某些數(shù)據(jù)結(jié)構(gòu)互斥訪問,任務(wù)可能取得一個信號量。但若正在臨界區(qū)執(zhí)行的任務(wù)被刪除,會導(dǎo)致這個任務(wù)無法完成臨界區(qū)的訪問,從而使得該數(shù)據(jù)結(jié)構(gòu)可能處于一種被破壞或不一致的狀–taskSafe():保護(hù)任務(wù)不被刪除態(tài)。–taskUnsafe():解除任務(wù)保護(hù)此外,由于該任務(wù)沒有釋放信號量,其他任務(wù)將無法獲得信號量,從而導(dǎo)致該臨界資源不可用。使用taskDelete()刪除另一個被保護(hù)的任務(wù),會導(dǎo)致調(diào)用者任務(wù)被阻塞,直到被保護(hù)的任務(wù)解除保護(hù)任務(wù)保護(hù)使用一個計數(shù)器實(shí)現(xiàn)保護(hù)的嵌套,僅當(dāng)計數(shù)器為0時才真正的解除保護(hù)嵌入式操作系統(tǒng)?注意:不要在一個不合適的時刻刪除任務(wù),在刪嵌入式操作系統(tǒng)?下面的代碼段說明如何使用taskSafe()和

taskUnsafe()來保護(hù)一段臨界區(qū)代碼taskSafe();semTake(semID,WAIT_FOREVER);/*Blockuntilsemaphoreavailable*/…臨界區(qū)操作代碼…semGive(semID);/*Releasesemaphore*/taskUnsafe();嵌入式操作系統(tǒng)?下面的代碼段說明如何使用taskSafe(嵌入式操作系統(tǒng)2.3任務(wù)運(yùn)行的控制?下列函數(shù)用于控制任務(wù)的執(zhí)行VxWorks的調(diào)試功能希望能夠掛起/恢復(fù)任務(wù)的執(zhí)行,從而可以凍結(jié)任務(wù)的執(zhí)行狀態(tài)終止任務(wù),然后使用原有參數(shù)重新創(chuàng)建任務(wù)。提供一個簡單的任務(wù)睡眠機(jī)制。區(qū)別,taskDelay()將會導(dǎo)致任務(wù)被移到相同優(yōu)先級就緒隊(duì)列的尾這是一個POSIX函數(shù),部,例如taskDelay(0)可以將CPU交給同優(yōu)先級的另一個任務(wù)與taskDelay()

以下調(diào)用將任務(wù)延時半秒:一樣可以實(shí)現(xiàn)延時,但延時單位不同,可以直接指明延時。而調(diào)用nanosleep實(shí)現(xiàn)延時0被認(rèn)為是錯誤的嵌入式操作系統(tǒng)2.3任務(wù)運(yùn)行的控制?下列函數(shù)用于控制任務(wù)嵌入式操作系統(tǒng)taskResume()taskSuspend()taskResume()/taskActivate()taskSuspend()taskSuspend()taskResume()掛起阻塞就緒睡眠taskDelay()延時已到執(zhí)行taskRestart()嵌入式操作系統(tǒng)taskResume()taskResume(嵌入式操作系統(tǒng)應(yīng)用實(shí)例1嵌入式操作系統(tǒng)應(yīng)用實(shí)例1嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)?演示結(jié)果嵌入式操作系統(tǒng)?演示結(jié)果嵌入式操作系統(tǒng)?仿真器上顯示信息:嵌入式操作系統(tǒng)?仿真器上顯示信息:嵌入式操作系統(tǒng)?將taskResume換成taskActivate,結(jié)果一樣嵌入式操作系統(tǒng)?將taskResume換成taskActi嵌入式操作系統(tǒng)應(yīng)用實(shí)例2嵌入式操作系統(tǒng)應(yīng)用實(shí)例2嵌入式操作系統(tǒng)不能延遲到myFunc任務(wù)已結(jié)束嵌入式操作系統(tǒng)不能延遲到myFunc任務(wù)已結(jié)束嵌入式操作系統(tǒng)?演示結(jié)果嵌入式操作系統(tǒng)?演示結(jié)果嵌入式操作系統(tǒng)?仿真器上顯示信息:嵌入式操作系統(tǒng)?仿真器上顯示信息:嵌入式操作系統(tǒng)2.4任務(wù)擴(kuò)展函數(shù)?有時任務(wù)需要在任務(wù)創(chuàng)建、刪除或上下文切換時增加相應(yīng)的處理,又不需要修改內(nèi)核

VxWorks的內(nèi)核wind提供鉤子函數(shù)機(jī)制實(shí)現(xiàn)上

述目標(biāo),使得當(dāng)任務(wù)創(chuàng)建、上下文切換、刪除時調(diào)用用戶附加的函數(shù)?下列函數(shù)可以設(shè)置任務(wù)創(chuàng)建/切換/刪除時的鉤子函數(shù)嵌入式操作系統(tǒng)2.4任務(wù)擴(kuò)展函數(shù)?有時任務(wù)需要在任務(wù)創(chuàng)建嵌入式操作系統(tǒng)taskHookLib所有HOOK函數(shù)的入?yún)⒍际呛瘮?shù)指針嵌入式操作系統(tǒng)taskHookLib所有HOOK函數(shù)的入?yún)⒍记度胧讲僮飨到y(tǒng)–由于用于任務(wù)切換時的鉤子函數(shù)只能運(yùn)行在內(nèi)核上下文中,因此這個鉤子函數(shù)能夠調(diào)用的函數(shù)調(diào)用有限制,只能是:緩沖區(qū)管理庫協(xié)處理器(浮點(diǎn))狀態(tài)的保存和恢復(fù)鏈表操作庫體系結(jié)構(gòu)無關(guān)的中斷例程庫

C的數(shù)學(xué)計算庫環(huán)形緩沖區(qū)操作庫任務(wù)管理庫出錯處理嵌入式操作系統(tǒng)–由于用于任務(wù)切換時的鉤子函數(shù)只能運(yùn)行在內(nèi)緩嵌入式操作系統(tǒng)應(yīng)用實(shí)例嵌入式操作系統(tǒng)應(yīng)用實(shí)例嵌入式操作系統(tǒng)在任務(wù)創(chuàng)建時,就會調(diào)用myTaskHook?演示結(jié)果

–Shell下輸出信息:嵌入式操作系統(tǒng)在任務(wù)創(chuàng)建時,就會調(diào)用myTaskHook?嵌入式操作系統(tǒng)–仿真器輸出信息:嵌入式操作系統(tǒng)–仿真器輸出信息:嵌入式操作系統(tǒng)2.5代碼的共享和重入?VxWorks提倡:單個子程序的備份或子程序庫被多個不同的任務(wù)調(diào)用?定義:一個被多個任務(wù)調(diào)用的單個備份成為共享代碼VxWorks動態(tài)鏈接功能很容易實(shí)現(xiàn)代碼共享嵌入式操作系統(tǒng)2.5代碼的共享和重入?VxWorks提倡嵌入式操作系統(tǒng)重入?共享代碼必須是可重入的:

–一個子程序是可重入的,如果該程序的單個備份可以被多個任務(wù)同時調(diào)用而不會發(fā)生沖突?典型的沖突:

–對全局或靜態(tài)變量的修改?VxWorks的很多子程序是可重入的

–慣例:所有somename_r()命名的子程序被認(rèn)為是不可重入的

–VxWorks的I/O和驅(qū)動程序是可重入的嵌入式操作系統(tǒng)重入?共享代碼必須是可重入的:嵌入式操作系統(tǒng)?大部分VxWorks函數(shù)使用下列3種重入技術(shù):?動態(tài)堆棧變量–這種函數(shù)一般是純代碼,除動態(tài)堆棧變量外沒有自己的數(shù)據(jù),以調(diào)用者提供的數(shù)據(jù)為參數(shù)進(jìn)行操作。?受信號量保護(hù)的全局和靜態(tài)變量–這種函數(shù)一般含有公共數(shù)據(jù),在調(diào)用時,必須借助于互斥機(jī)制,禁止任務(wù)同時在代碼臨界區(qū)域內(nèi)執(zhí)行,明確地實(shí)現(xiàn)重入。?任務(wù)變量–一些可被多個任務(wù)同時調(diào)用的程序,程序中的全局變量或靜態(tài)變量對每次任務(wù)的調(diào)用需要不同的值。嵌入式操作系統(tǒng)?大部分VxWorks函數(shù)使用下列3種重入技嵌入式操作系統(tǒng)VxWorks與Linux比較?任務(wù)創(chuàng)建函數(shù):taskSpawn()與fork()/exec()–在fork/exec模型下,先調(diào)用fork函數(shù)為新任務(wù)創(chuàng)建一份與父任務(wù)完全相同的內(nèi)存空間,后調(diào)用exec函數(shù)裝入新任務(wù)代碼,并用它來覆蓋原有的屬于父任務(wù)的內(nèi)容。這樣做的好處是如果需要,可以從父任務(wù)那里繼承代碼、數(shù)據(jù)等屬性。–在spawn模型下,擯棄了繼承的功能,在創(chuàng)建新任務(wù)時,直接為它分配全新的地址空間,然后將新代碼裝入并運(yùn)行。嵌入式操作系統(tǒng)VxWorks與Linux比較?任務(wù)創(chuàng)建函數(shù)嵌入式操作系統(tǒng)3、VxWorks任務(wù)調(diào)度?任務(wù)調(diào)度策略?任務(wù)調(diào)度時機(jī)?搶占上鎖嵌入式操作系統(tǒng)3、VxWorks任務(wù)調(diào)度?任務(wù)調(diào)度策略嵌入式操作系統(tǒng)3.1任務(wù)調(diào)度策略?調(diào)度是針對多任務(wù)而言的?調(diào)度是指:根據(jù)一定的約束規(guī)則,將CPU分配給符合條件的任務(wù)使用?上述約束規(guī)則就是所謂的調(diào)度策略(或算法)?Wind內(nèi)核默認(rèn)采用基于優(yōu)先級的搶占式調(diào)度

Priority-basedpreemptivescheduling?同時還使用輪轉(zhuǎn)(Round-Robin)調(diào)度算法嵌入式操作系統(tǒng)3.1任務(wù)調(diào)度策略?調(diào)度是針對多任務(wù)而言的嵌入式操作系統(tǒng)任務(wù)隊(duì)列?activeQHead–記錄了一個線程從生成到刪除過程中的每一個任務(wù)信息,是一個FIFO隊(duì)列?readyQHead–記錄所有就緒任務(wù),是一個優(yōu)先級隊(duì)列?tickQHead–記錄所有延遲狀態(tài)的任務(wù),是一個優(yōu)先級隊(duì)列?pendQHead–記錄所有阻塞狀態(tài)的任務(wù),是一個優(yōu)先級隊(duì)列?WorkQ–記錄所有中斷發(fā)起的任務(wù),是一個環(huán)形隊(duì)列嵌入式操作系統(tǒng)任務(wù)隊(duì)列?activeQHead–記錄了一嵌入式操作系統(tǒng)控制任務(wù)調(diào)度的幾個函數(shù)?kernelTimeSlice()?taskPrioritySet()?taskLock()?taskUnlock()控制輪轉(zhuǎn)調(diào)度改變?nèi)蝿?wù)的優(yōu)先級禁止任務(wù)調(diào)度允許任務(wù)調(diào)度嵌入式操作系統(tǒng)控制任務(wù)調(diào)度的幾個函數(shù)?kernelTime嵌入式操作系統(tǒng)基于優(yōu)先級的搶占式任務(wù)調(diào)度?基于優(yōu)先級的搶占式任務(wù)調(diào)度

–系統(tǒng)中的每個任務(wù)都擁有一個優(yōu)先級

–任意時刻,內(nèi)核將CPU分配給處于就緒態(tài)的優(yōu)先級最高的任務(wù)運(yùn)行?搶占:

一旦內(nèi)核發(fā)現(xiàn)有一個比當(dāng)前正在運(yùn)行的任務(wù)的優(yōu)先級高的任務(wù)就緒,內(nèi)核立即保存當(dāng)前任務(wù)的上下文,切換到這個高優(yōu)先級任務(wù)的上下文中運(yùn)行嵌入式操作系統(tǒng)基于優(yōu)先級的搶占式任務(wù)調(diào)度?基于優(yōu)先級的搶占嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)任務(wù)優(yōu)先級?VxWorks支持256個優(yōu)先級,編號0~255,優(yōu)先級0

最高,255最低,一般0~99分配給系統(tǒng)任務(wù),

100~255分配給用戶任務(wù)。?任務(wù)的優(yōu)先級在創(chuàng)建時指定?任務(wù)可以調(diào)用taskPrioritySet改變自己的優(yōu)先級嵌入式操作系統(tǒng)任務(wù)優(yōu)先級?VxWorks支持256個優(yōu)先級嵌入式操作系統(tǒng)應(yīng)用示例?下面程序,創(chuàng)建了3個優(yōu)先級各不相同的任務(wù):嵌入式操作系統(tǒng)應(yīng)用示例?下面程序,創(chuàng)建了3個優(yōu)先級各不相同嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)?演示結(jié)果:嵌入式操作系統(tǒng)?演示結(jié)果:嵌入式操作系統(tǒng)?如何修改程序,使得任務(wù)的執(zhí)行順序變?yōu)椋?/p>

taskOne,taskTwo,taskThree?嵌入式操作系統(tǒng)?如何修改程序,使得任務(wù)的執(zhí)行順序變?yōu)椋呵度胧讲僮飨到y(tǒng)?修改程序,使得taskOne、taskTwo同時具有最高優(yōu)先級運(yùn)行:嵌入式操作系統(tǒng)?修改程序,使得taskOne、taskTw嵌入式操作系統(tǒng)?演示結(jié)果嵌入式操作系統(tǒng)?演示結(jié)果嵌入式操作系統(tǒng)?基于優(yōu)先級的搶占是任務(wù)調(diào)度的缺陷:當(dāng)多個相同優(yōu)先級的任務(wù)需要共享一臺處理器時,如果某個執(zhí)行的任務(wù)永不阻塞,那么他將一直獨(dú)占處理器,其它相同優(yōu)先級的任務(wù)就沒有機(jī)會執(zhí)行。嵌入式操作系統(tǒng)?基于優(yōu)先級的搶占是任務(wù)調(diào)度的缺陷:嵌入式操作系統(tǒng)輪轉(zhuǎn)調(diào)度?輪轉(zhuǎn)調(diào)度通常配合基于優(yōu)先級的搶占式調(diào)度進(jìn)行?輪轉(zhuǎn)調(diào)度:讓優(yōu)先級相同的、處于就緒態(tài)的任務(wù)

公平地共享CPU?輪轉(zhuǎn)調(diào)度使用時間片來分配CPU

–每個任務(wù)執(zhí)行一個預(yù)先確定的時間段(即時間片)?在大多數(shù)系統(tǒng)里,并不一定需要使用輪轉(zhuǎn)調(diào)度算法。但在相同代碼被多份復(fù)制執(zhí)行時,如在用戶接口任務(wù)內(nèi)執(zhí)行時,需要使用輪轉(zhuǎn)調(diào)度算法嵌入式操作系統(tǒng)輪轉(zhuǎn)調(diào)度?輪轉(zhuǎn)調(diào)度通常配合基于優(yōu)先級的搶占式嵌入式操作系統(tǒng)?VxWorks中,調(diào)用函數(shù)kernelTimeSlice()來實(shí)現(xiàn)

輪轉(zhuǎn)調(diào)度

–此函數(shù)位于kernelLib庫中

–參數(shù)為時間片的長度(tick數(shù))(即:在某個任務(wù)放棄CPU給另一個同優(yōu)先級的任務(wù)之前,系統(tǒng)允許它運(yùn)行的最大時間長度)如kernelTimeSlice(sysClkRateGet()/2)表示時間片為0.5秒

–kernelTimeSlice(0)——關(guān)閉時間片輪轉(zhuǎn)調(diào)度策

略嵌入式操作系統(tǒng)?VxWorks中,調(diào)用函數(shù)kernelTi嵌入式操作系統(tǒng)?使用輪轉(zhuǎn)調(diào)度算法時,每個任務(wù)都有一個運(yùn)行時

間計數(shù)器–隨著系統(tǒng)時鐘增加而增加–達(dá)到規(guī)定的值(時間片的值)時,清0

?此時,任務(wù)放到所在優(yōu)先級隊(duì)列的尾部–一個新加入的任務(wù)放在所屬優(yōu)先級隊(duì)列的尾部,計數(shù)器初始為0–當(dāng)任務(wù)被阻塞或者被更高優(yōu)先級的任務(wù)搶占,將保存其時間計數(shù)值,并且在其重新執(zhí)行時恢復(fù)計數(shù)嵌入式操作系統(tǒng)?使用輪轉(zhuǎn)調(diào)度算法時,每個任務(wù)都有一個運(yùn)行時嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)應(yīng)用實(shí)例?下面的例子創(chuàng)建三個優(yōu)先級相同的任務(wù),分別向控制臺輸出他們的任務(wù)id號和任務(wù)名。–s5_rrsched()調(diào)用kernelTimeSlice()允許系統(tǒng)使用輪轉(zhuǎn)調(diào)

度。–本例中使用的時間片TIMESLICE為1/60秒(函數(shù)

sysClkRateGet()返回每秒的時鐘tick數(shù))–在設(shè)置了調(diào)度時間片后,程序發(fā)起三個任務(wù),注意:必須保證發(fā)起的任務(wù)優(yōu)先級要低于100。–另外為了演示時間片輪轉(zhuǎn)的效果,要保證任務(wù)具有足夠的執(zhí)行時間,在本例中使用一個循環(huán)次數(shù)為

LONG_TIME的長循環(huán)。嵌入式操作系統(tǒng)應(yīng)用實(shí)例?下面的例子創(chuàng)建三個優(yōu)先級相同的任務(wù)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)?演示結(jié)果:嵌入式操作系統(tǒng)?演示結(jié)果:嵌入式操作系統(tǒng)?增加第四個任務(wù),其優(yōu)先級為80,他和其他任務(wù)輸出相同的信息。嵌入式操作系統(tǒng)?增加第四個任務(wù),其優(yōu)先級為80,他和其他任嵌入式操作系統(tǒng)?取消時間片輪轉(zhuǎn):

–第一種方法:–第二種方法:嵌入式操作系統(tǒng)?取消時間片輪轉(zhuǎn):–第二種方法:嵌入式操作系統(tǒng)?演示結(jié)果嵌入式操作系統(tǒng)?演示結(jié)果嵌入式操作系統(tǒng)任務(wù)切換?任務(wù)切換:終止正在運(yùn)行的任務(wù)(當(dāng)前任務(wù)),轉(zhuǎn)而去運(yùn)行另外一個任務(wù)?任務(wù)的切換實(shí)質(zhì)就是斷點(diǎn)數(shù)據(jù)的切換,需要完成以下工作:把被終止的任務(wù)斷點(diǎn)指針(PC)保存到任務(wù)堆棧中把處理器通用寄存器的內(nèi)容保存到任務(wù)堆棧中把被終止的任務(wù)堆棧指針當(dāng)前值(SP)保存到該任務(wù)的TCB中獲得待運(yùn)行任務(wù)的TCB

使處理器通過TCB獲得待運(yùn)行任務(wù)的SP

把待運(yùn)行任務(wù)堆棧中通用寄存器的內(nèi)容回復(fù)到處理器的通用寄存器中–使處理器獲得待運(yùn)行任務(wù)的斷點(diǎn)指針(PC)––––––嵌入式操作系統(tǒng)任務(wù)切換?任務(wù)切換:終止正在運(yùn)行的任務(wù)(當(dāng)前嵌入式操作系統(tǒng)3.2任務(wù)調(diào)度時機(jī)本章難點(diǎn)?三個關(guān)鍵函數(shù)–reschedule–intExit–windExit嵌入式操作系統(tǒng)3.2任務(wù)調(diào)度時機(jī)本章難點(diǎn)?三個關(guān)鍵函數(shù)–嵌入式操作系統(tǒng)?調(diào)度時機(jī)–––––––––任務(wù)相關(guān)的操作:生成/刪除/掛起/恢/Lock/Unlock..WD的創(chuàng)建/開始和銷毀TICK時鐘中斷信號量的某些操作Give/TakeEvent的發(fā)送和接受MsgQ銷毀Posix消息隊(duì)列的銷毀/接受和發(fā)送Posix的mutex的銷毀/鎖定/解鎖…中斷執(zhí)行退出…嵌入式操作系統(tǒng)?調(diào)度時機(jī)–任務(wù)相關(guān)的操作:生成/刪除/掛起嵌入式操作系統(tǒng)任務(wù)管理中函數(shù)之間的關(guān)系嵌入式操作系統(tǒng)任務(wù)管理中函數(shù)之間的關(guān)系嵌入式操作系統(tǒng)3.3搶占上鎖?在實(shí)際應(yīng)用中,有時候需要避免搶占,以免發(fā)生不合理的搶占或發(fā)生一些意想不到的情況?Wind的調(diào)度器提供taskLock()和taskUnlock()來禁

止/允許搶占:嵌入式操作系統(tǒng)3.3搶占上鎖?在實(shí)際應(yīng)用中,有時候需要避嵌入式操作系統(tǒng)?當(dāng)一個任務(wù)調(diào)用taskLock(),將會禁止搶占,在該任務(wù)執(zhí)行時,將不會發(fā)生基于優(yōu)先級的搶占?注意:禁止搶占只能防止任務(wù)的上下文切換,不能禁止中斷?禁止搶占可以用來實(shí)現(xiàn)互斥?但是,應(yīng)當(dāng)盡量使禁止搶占的時間最小嵌入式操作系統(tǒng)?當(dāng)一個任務(wù)調(diào)用taskLock(),將會禁嵌入式操作系統(tǒng)任務(wù)調(diào)度方面與Linux的比較?任務(wù)的實(shí)時優(yōu)先級數(shù)–VxWorks任務(wù)的優(yōu)先級0~255,數(shù)值越小優(yōu)先級越高–Linux的實(shí)時進(jìn)程優(yōu)先級0~99,數(shù)值越大優(yōu)先級越高?調(diào)度策略的種類–Linux支持SCHED_RR、SCHED_FIFO、

SCHED_OTHER三種調(diào)度策略–VxWorks只支持前兩種嵌入式操作系統(tǒng)任務(wù)調(diào)度方面與Linux的比較?任務(wù)的實(shí)時優(yōu)嵌入式操作系統(tǒng)?調(diào)度策略所基于的對象–VxWorks的調(diào)度策略不是基于某個任務(wù)的,而是針對

整個系統(tǒng)的所有任務(wù)–Linux的調(diào)度策略是基于進(jìn)程的,某個進(jìn)程的調(diào)度策略

的設(shè)置不影響其他進(jìn)程嵌入式操作系統(tǒng)?調(diào)度策略所基于的對象–VxWorks的調(diào)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)第3章VxWorks任務(wù)管理1、VxWorks下的任務(wù)2、VxWorks下任務(wù)控制及任務(wù)編程3、VxWorks任務(wù)調(diào)度嵌入式操作系統(tǒng)第3章VxWorks任務(wù)管理1、VxWor嵌入式操作系統(tǒng)?重點(diǎn)掌握–VxWorks下任務(wù)的特點(diǎn)–VxWorks提供的任務(wù)控制函數(shù)及應(yīng)用–VxWorks提供的任務(wù)調(diào)度策略及應(yīng)用嵌入式操作系統(tǒng)?重點(diǎn)掌握–VxWorks下任務(wù)的特點(diǎn)嵌入式操作系統(tǒng)1、VxWorks下任務(wù)的特點(diǎn)任務(wù)運(yùn)行的地址空間任務(wù)結(jié)構(gòu)任務(wù)的標(biāo)識任務(wù)的狀態(tài)及狀態(tài)轉(zhuǎn)換任務(wù)的上下文切換嵌入式操作系統(tǒng)1、VxWorks下任務(wù)的特點(diǎn)任務(wù)運(yùn)行的地址嵌入式操作系統(tǒng)?VxWorks中的wind內(nèi)核為VxWorks提供了

一個高性能的實(shí)時多任務(wù)操作環(huán)境–任務(wù)管理、任務(wù)創(chuàng)建、任務(wù)調(diào)度、時鐘、中斷、內(nèi)存管理?在VxWorks中,每個明顯獨(dú)立的程序在運(yùn)行時稱之為任務(wù)嵌入式操作系統(tǒng)?VxWorks中的wind內(nèi)核為VxWor嵌入式操作系統(tǒng)cobble.c?四個任務(wù)–第一個任務(wù)tCosmos模擬一個中斷服務(wù)程序生成新數(shù)據(jù)——cosmos()–第二個任務(wù)tSchlep收集數(shù)據(jù)——schlep()–第三個任務(wù)tCrunch處理數(shù)據(jù),完成計算并求出一個結(jié)果——crunch()–第四個任務(wù)tMonitor監(jiān)視結(jié)果值,當(dāng)結(jié)果超出安全范圍時,向屏幕打印報警信息——

monitor()?子函數(shù)——nodeAdd(),nodeScrap()嵌入式操作系統(tǒng)cobble.c?四個任務(wù)–第一個任務(wù)tC嵌入式操作系統(tǒng)1.1任務(wù)運(yùn)行的地址空間?VxWorks操作系統(tǒng)采取線性單一實(shí)地址空

間模式,所有任務(wù)都運(yùn)行在同一地址空間,不區(qū)分用戶態(tài)和核心態(tài)嵌入式操作系統(tǒng)1.1任務(wù)運(yùn)行的地址空間?VxWorks操嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)?VxWorks下任務(wù)具有如下特點(diǎn):–任務(wù)切換時不需要進(jìn)行虛擬地址空間切換–任務(wù)間可以直接共享變量,不需要通過內(nèi)核在不同的地址空間復(fù)制數(shù)據(jù)–系統(tǒng)調(diào)用時不需要在核心態(tài)和用戶態(tài)之間切換,相當(dāng)于直接的函數(shù)調(diào)用嵌入式操作系統(tǒng)?VxWorks下任務(wù)具有如下特點(diǎn):–任務(wù)嵌入式操作系統(tǒng)?!由于沒有訪問內(nèi)存任何約束和保護(hù),因而對代碼質(zhì)量提出了更高的要求?當(dāng)選用VxVMI時,每個任務(wù)各自的地址空間需要進(jìn)行虛擬地址到物理地址的轉(zhuǎn)換嵌入式操作系統(tǒng)?!由于沒有訪問內(nèi)存任何約束和保護(hù),因而對代嵌入式操作系統(tǒng)1.2任務(wù)的結(jié)構(gòu)data段數(shù)據(jù)段bss段TCB代碼段堆棧段不需要進(jìn)行用戶、內(nèi)核的區(qū)分嵌入式操作系統(tǒng)1.2任務(wù)的結(jié)構(gòu)data段數(shù)據(jù)段bss段TC嵌入式操作系統(tǒng)TCB?TCB用來描述一個任務(wù),每一任務(wù)都與一

個TCB關(guān)聯(lián)?TCB用windTcb結(jié)構(gòu)體來描述–VxWorks的taskLib庫中定義(taskLib.h)嵌入式操作系統(tǒng)TCB?TCB用來描述一個任務(wù),每一任務(wù)都與嵌入式操作系統(tǒng)?TCB中上下文信息包含的具體內(nèi)容:–程序執(zhí)行點(diǎn)(PC)–CPU狀態(tài),包括各種處理器特定的寄存器–––––棧任務(wù)的狀態(tài)延遲定時器時間片定時器I/O操作分配的標(biāo)準(zhǔn)輸入/輸出,標(biāo)準(zhǔn)錯誤輸出操作嵌入式操作系統(tǒng)?TCB中上下文信息包含的具體內(nèi)容:–程序嵌入式操作系統(tǒng)–––––––內(nèi)核控制結(jié)構(gòu)信號處理信息錯誤信息調(diào)試和性能監(jiān)視狀態(tài)任務(wù)變量(可選)浮點(diǎn)上下文(可選)可擴(kuò)展項(xiàng)(可選)嵌入式操作系統(tǒng)–內(nèi)核控制結(jié)構(gòu)嵌入式操作系統(tǒng)錯誤信息?在VxWorks中有一個全局變量errno來存放系統(tǒng)最近的錯誤狀態(tài)值?每個任務(wù)TCB中都記錄有一個全局errno副本—errostatus,屬于任務(wù)上下文的一部分?ISR也使用獨(dú)立的errno,但是ISR沒有

TCB,內(nèi)核為ISR在中斷棧中保存和恢復(fù)

errno嵌入式操作系統(tǒng)錯誤信息?在VxWorks中有一個全局變量e嵌入式操作系統(tǒng)?errno的值由4個字節(jié)表示,2個高字節(jié)表示

產(chǎn)生錯誤的模塊組件編碼,2個低字節(jié)表示錯誤編號–如0x110001,表示內(nèi)存不足?VxWorks提供errnoLib庫用于獲取和設(shè)置

任務(wù)和中斷的錯誤狀態(tài)值嵌入式操作系統(tǒng)?errno的值由4個字節(jié)表示,2個高字節(jié)表嵌入式操作系統(tǒng)任務(wù)變量?當(dāng)多個任務(wù)需要同一全局變量或靜態(tài)變量提供不同的值時,VxWorks提供任務(wù)變量機(jī)制來切換全局變量?任務(wù)變量機(jī)制允許在任務(wù)上下文中定義自己的私有變量,隨著上下文切換而切換嵌入式操作系統(tǒng)任務(wù)變量?當(dāng)多個任務(wù)需要同一全局變量或靜態(tài)變嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)?每個任務(wù)變量允許存放一個4字節(jié)的值typedefstructtaskVar/*TASK_VAR*/{structtaskVar*next;int*address;intvalue;}TASK_VAR;?VxWorks提供庫taskVarLib庫支持任務(wù)變

量機(jī)制嵌入式操作系統(tǒng)?每個任務(wù)變量允許存放一個4字節(jié)的值type嵌入式操作系統(tǒng)?當(dāng)有多個任務(wù)變量時,任務(wù)變量以單向鏈表的形式存在嵌入式操作系統(tǒng)?當(dāng)有多個任務(wù)變量時,任務(wù)變量以單向鏈表嵌入式操作系統(tǒng)?任務(wù)切換時需要遍歷任務(wù)變量鏈表,進(jìn)行變量值的恢復(fù)和保存——降低效率?!此機(jī)制會降低任務(wù)上下文切換的效率,

建議編程時謹(jǐn)慎使用嵌入式操作系統(tǒng)?任務(wù)切換時需要遍歷任務(wù)變量鏈表,進(jìn)行?!嵌入式操作系統(tǒng)堆棧?在任務(wù)創(chuàng)建時指定堆棧的大小?TCB記錄了位置和

大小等棧信息?任務(wù)棧大小的設(shè)置必須合理高地址pStackEndStackSizepStackBaseTCB低地址pTCBpTaskMem16bytes嵌入式操作系統(tǒng)堆棧?在任務(wù)創(chuàng)建時指定?任務(wù)棧大小的設(shè)置高嵌入式操作系統(tǒng)?VxWorks操作系統(tǒng)提供函數(shù)checkStack()

來檢查任務(wù)棧使用情況–checkStack()顯示了單個指定任務(wù)或者所有任

務(wù)的棧使用情況,包括:????棧大小(SIZE)棧當(dāng)前使用數(shù)(CUR)歷史使用峰值(HIGH)最大可能空余數(shù)(MARGIN=SIZE-HIGH)?Tornado中的browser也可查看棧的使用情

況?!堆棧診斷前提:棧初始化時要用0xee填

充嵌入式操作系統(tǒng)?VxWorks操作系統(tǒng)提供函數(shù)checkS嵌入式操作系統(tǒng)?shell下創(chuàng)建任務(wù)時默認(rèn)堆棧大?。╯p命

令)–#defineSHELL_STACK_SIZE10000?VxWorks支持獨(dú)立的中斷棧,對所有的

ISR使用相同的中斷棧–中斷棧在系統(tǒng)啟動時根據(jù)配置參數(shù)設(shè)置位置、大小和填充。在configAll.h中有缺省定義:#defineISR_STACK_SIZE1000嵌入式操作系統(tǒng)?shell下創(chuàng)建任務(wù)時默認(rèn)堆棧大小(sp命嵌入式操作系統(tǒng)1.3任務(wù)的標(biāo)識?VxWorks下標(biāo)識任務(wù)有兩種途徑:任務(wù)名稱和任

務(wù)ID號?任務(wù)名稱–是獨(dú)一無二的字符串–主機(jī)任務(wù)以字母u開頭–目標(biāo)機(jī)任務(wù)以字母t開頭?任務(wù)ID號–長度為4字節(jié),指向TCB?VxWorks提供任務(wù)名稱和任務(wù)ID之間的轉(zhuǎn)換函數(shù)嵌入式操作系統(tǒng)1.3任務(wù)的標(biāo)識?VxWorks下標(biāo)識任務(wù)嵌入式操作系統(tǒng)1.4任務(wù)的狀態(tài)?5種基本狀態(tài):––––––––––執(zhí)行(RUN)就緒(READY)——任務(wù)只需等待cpu阻塞(PEND)——有cpu以外的資源不可用睡眠(DELAY)——任務(wù)處于睡眠狀態(tài)掛起(SUSPEND)——一般用于調(diào)試DELAY+S——睡眠+掛起PEND+S——阻塞+掛起狀態(tài)PEND+T——延時阻塞狀態(tài)PEND+T+S——延時阻塞+掛起狀態(tài)…+I——繼承優(yōu)先級狀態(tài),優(yōu)先級暫時被提升?多種組合狀態(tài)嵌入式操作系統(tǒng)1.4任務(wù)的狀態(tài)?5種基本狀態(tài):––執(zhí)行(嵌入式操作系統(tǒng)任務(wù)的狀態(tài)轉(zhuǎn)換圖任務(wù)創(chuàng)建時,處于掛起狀態(tài)taskSuspend()taskResume()掛起要使剛創(chuàng)建的任務(wù)就緒,

taskResume()要激活該任務(wù)

taskSuspend()taskSuspend()taskResume()/taskActivate()阻塞就緒semTake()/msgQReceive()semGive()/msgQSend()搶占調(diào)度睡眠taskDelay()

使用spawning原語,可以直接延時已到創(chuàng)建并激活一個任務(wù)任務(wù)可以在任何狀態(tài)下被刪除執(zhí)行嵌入式操作系統(tǒng)任務(wù)的狀態(tài)轉(zhuǎn)換圖任務(wù)創(chuàng)建時,處于掛起狀態(tài)tas嵌入式操作系統(tǒng)任務(wù)的狀態(tài)隊(duì)列嵌入式操作系統(tǒng)任務(wù)的狀態(tài)隊(duì)列嵌入式操作系統(tǒng)1.5任務(wù)上下文切換?上下文切換示意圖TCB(Old)copyofpccopyofspCPUpcspTCB(New)copyofpccopyofsperrorStatuserrnoerrorStatus嵌入式操作系統(tǒng)1.5任務(wù)上下文切換?上下文切換示意圖TC嵌入式操作系統(tǒng)?上下文切換分兩種情況:同步和異步?同步上下文切換,引起的原因是當(dāng)前運(yùn)行的任務(wù)

執(zhí)行下列操作:–進(jìn)行阻塞、延遲、掛起的調(diào)用;–使更高優(yōu)先級任務(wù)就緒而發(fā)生優(yōu)先級搶占–降低自身優(yōu)先級或者退出;?異步上下文切換,通常由ISR使更高優(yōu)先級任務(wù)就

緒引起。嵌入式操作系統(tǒng)?上下文切換分兩種情況:同步和異步–進(jìn)行阻嵌入式操作系統(tǒng)1.6VxWorks的系統(tǒng)任務(wù)?根任務(wù)tUsrRoot–內(nèi)核執(zhí)行的第一個任務(wù)–初始化VxWorks系統(tǒng)的主要功能,例如?發(fā)起日志任務(wù)、異常處理任務(wù)、網(wǎng)絡(luò)任務(wù)和

tRlogind后臺任務(wù)–通常,上述初始化結(jié)束之后,根任務(wù)終止并刪除–用戶可以向根任務(wù)自由的添加任何必需的初始化代碼–對應(yīng)usrRoot()函數(shù)(target/config/all/usrConfig.c)嵌入式操作系統(tǒng)1.6VxWorks的系統(tǒng)任務(wù)?根任務(wù)tU嵌入式操作系統(tǒng)?日志任務(wù):tLogTask–記錄系統(tǒng)信息的任務(wù)。它不執(zhí)行輸入/輸出操作。?異常處理任務(wù):tExcTask–提供VxWorks異常處理包,完成在中斷級不能執(zhí)行的功能–必須具有系統(tǒng)最高的優(yōu)先級–不能掛起、刪除、改變其任務(wù)的優(yōu)先級?目標(biāo)代理服務(wù):tWdbTask(INCLUDE_WDB)–當(dāng)目標(biāo)代理設(shè)置為運(yùn)行在任務(wù)模式時,創(chuàng)建此任務(wù)–處理來自Tornado目標(biāo)服務(wù)的請求★以上3種任務(wù)都屬于VxWorks的基本任務(wù)嵌入式操作系統(tǒng)?日志任務(wù):tLogTask–記錄系統(tǒng)信息嵌入式操作系統(tǒng)?網(wǎng)絡(luò)任務(wù):tNetTask(INCLUDE_NET_LIB)

–后臺處理VxWorks網(wǎng)絡(luò)需要的任務(wù)級功能處理?其他可選組件的任務(wù)

–tShell(INCLUDE_SHELL)

–tRlogind(INCLUDE_RLOGIN)

–tTelnetd(INCLUDE_TELNET)

–tPortmapd(INCLUDE_RPC)嵌入式操作系統(tǒng)?網(wǎng)絡(luò)任務(wù):tNetTask(INCLUDE嵌入式操作系統(tǒng)與Linux比較?任務(wù)控制塊的內(nèi)容多用戶性、任務(wù)間的親屬關(guān)系、文件打開表、隊(duì)列信息、虛擬內(nèi)存信息、錯誤狀態(tài)等?棧棧的大小、中斷棧?任務(wù)狀態(tài)狀態(tài)的種類、狀態(tài)間的轉(zhuǎn)換嵌入式操作系統(tǒng)與Linux比較?任務(wù)控制塊的內(nèi)容多用戶性、嵌入式操作系統(tǒng)2、VxWorks下任務(wù)控制及任務(wù)編程??????任務(wù)創(chuàng)建和激活任務(wù)刪除與任務(wù)安全任務(wù)的狀態(tài)控制任務(wù)信息的獲取任務(wù)擴(kuò)展函數(shù)代碼的共享與重入嵌入式操作系統(tǒng)2、VxWorks下任務(wù)控制及任務(wù)編程?任務(wù)創(chuàng)嵌入式操作系統(tǒng)?VxWorks提供豐富的任務(wù)控制功能,包含在

taskLib庫中?包括:

–任務(wù)的創(chuàng)建、刪除、狀態(tài)控制、獲取任務(wù)信息等等?可以在TornadoIDE提供的shell工具中交互使用

這些調(diào)用嵌入式操作系統(tǒng)?VxWorks提供豐富的任務(wù)控制功能,包含嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)2.1任務(wù)的創(chuàng)建與激活?VxWorks的TaskLib庫中提供多個函數(shù)用于創(chuàng)建

任務(wù):調(diào)用taskSpawn()taskInit()taskActivate()描述創(chuàng)建并激活一個任務(wù)初始化一個新任務(wù)激活一個初始化任務(wù)嵌入式操作系統(tǒng)2.1任務(wù)的創(chuàng)建與激活?VxWorks的T嵌入式操作系統(tǒng)taskSpawn()—創(chuàng)建并激活一個新任務(wù)inttaskSpawn(char*name,/*新任務(wù)的任務(wù)名*/intpriority,/*新任務(wù)的優(yōu)先級*/intoptions,/*任務(wù)選項(xiàng)字*/intstackSize,/*堆棧大小*/FUNCPTRentryPt,/*新任務(wù)的入口函數(shù)*/intarg1,arg2,arg3,arg4,arg5,/*傳遞給入口函數(shù)*/intarg6,arg7,arg8,arg9,arg10/*的10參數(shù)*/)嵌入式操作系統(tǒng)taskSpawn()—創(chuàng)建并激活一個新任務(wù)i嵌入式操作系統(tǒng)TaskSpawn()?創(chuàng)建新任務(wù)的上下文

–堆棧、TCB、含有特定參數(shù)的入口程序調(diào)用的任務(wù)環(huán)境(入口程序通常是一個普通的程序)

–新的任務(wù)將在指定的函數(shù)入口處執(zhí)行

–激活新任務(wù)?堆棧是系統(tǒng)資源,位于系統(tǒng)內(nèi)存中

–其底端是TCB–堆棧使用0xEE填充?任務(wù)名要便于記憶,可以是任意長度、任意內(nèi)容嵌入式操作系統(tǒng)TaskSpawn()?創(chuàng)建新任務(wù)的上下文嵌入式操作系統(tǒng)?taskSpawn中的任務(wù)選項(xiàng)參數(shù)可以是下表中的選項(xiàng)之一或其組合如果任務(wù)使用任何浮點(diǎn)操作,必須要求使用VX_FP_TASK選項(xiàng)嵌入式操作系統(tǒng)?taskSpawn中的任務(wù)選項(xiàng)參數(shù)可以是下嵌入式操作系統(tǒng)?任務(wù)的優(yōu)先級:

–Wind內(nèi)核支持256種優(yōu)先級,0~255

–優(yōu)先級0為最高,優(yōu)先級255為最低

–一般,0~99分配給系統(tǒng)任務(wù),100~255分配給用戶任務(wù)嵌入式操作系統(tǒng)?任務(wù)的優(yōu)先級:嵌入式操作系統(tǒng)taskSpawn()返回值?成功:任務(wù)ID號?失?。篍RROR。返回的ERRNOS可能有–S_intLib_NOT_ISR_CALLABLE,/*程序不能從一個ISR中調(diào)用*/–S_objLib_OBJ_ID_ERROR,/*不正確的任務(wù)ID*/–S_smObjLib_NOT_INITIALIZED,/*在指定的分區(qū)中,沒有足夠的內(nèi)存用于發(fā)起任務(wù)*/–S_memLib_NOT_ENOUGH_MEMORY,/*沒有足夠的內(nèi)存發(fā)起任務(wù)*/–S_memLib_BLOCK_ERROR,/*不能夠?qū)?nèi)存分區(qū)互斥訪問*/–S_taskLib_ILLEGAL_PRIORITY/*非法的優(yōu)先級*/嵌入式操作系統(tǒng)taskSpawn()返回值?成功:任務(wù)ID嵌入式操作系統(tǒng)?在源代碼中使用TaskSpawn創(chuàng)建新任務(wù)?在TornadoShell中–使用TaskSpawn創(chuàng)建新任務(wù)–使用i查看系統(tǒng)中的任務(wù)(演示)嵌入式操作系統(tǒng)?在源代碼中使用TaskSpawn創(chuàng)建新任務(wù)嵌入式操作系統(tǒng)?taskSpawn()中包含了一些低級的操作,包括初始

化和激活一個任務(wù)

–taskInit()

–taskActivate()嵌入式操作系統(tǒng)?taskSpawn()中包含了一些低級的操嵌入式操作系統(tǒng)taskInit()初始化一個任務(wù)STATUStaskInit(WIND_TCB*pTcb,/*新任務(wù)的TCB地址*/char*name,允許不指定任務(wù)名,由系統(tǒng)自動命名/*新任務(wù)的名字*/intpriority,/*新任務(wù)的優(yōu)先級*/intoptions,/*任務(wù)選項(xiàng)字*/char*pStackBase,/*任務(wù)堆?;刂?/

初始化指定的內(nèi)存區(qū)域作為任務(wù)的堆棧和控制塊,而不像taskSpawn()那樣由系

intstackSize,/*堆棧大小*/FUNCPTRentrypt,統(tǒng)自動分配/*任務(wù)入口*/intarg1,arg2,arg3,arg4,arg5,/*入口參數(shù)*/

可以方便應(yīng)用進(jìn)行調(diào)試,并將堆棧分配在指定位置intarg6,arg7,arg8,arg9,arg10)嵌入式操作系統(tǒng)taskInit()初始化一個任務(wù)STATUS嵌入式操作系統(tǒng)?taskInit的返回值:

–成功:OK–任務(wù)不能初始化則:ERROR??赡芊祷氐?/p>

ERRNOS值有:?S_intLib_NOT_ISR_CALLABLE/*程序不能從一個ISR中調(diào)用*/?S_objLib_OBJ_ID_ERROR/*不正確的任務(wù)ID*/嵌入式操作系統(tǒng)?taskInit的返回值:?S_intL嵌入式操作系統(tǒng)taskActivate()激活一個任務(wù)?STATUStaskActivate(inttid)?taskActivate()激活由taskInit()創(chuàng)建的任務(wù),其參

數(shù)是taskInit()中第一個參數(shù)任務(wù)TCB的地址,強(qiáng)制類型轉(zhuǎn)換如下:–tid=(int)pTcb;?注意:當(dāng)應(yīng)用需要對任務(wù)定位和激活進(jìn)行控制時,才使用這兩個函數(shù),通常使用taskSpawn()就可以了嵌入式操作系統(tǒng)taskActivate()激活一個任務(wù)?S嵌入式操作系統(tǒng)管理任務(wù)名稱和ID號的函數(shù)????由任務(wù)號得到任務(wù)名taskName()

由任務(wù)名得到任務(wù)ID號taskNameTold()taskIDSelf()

得到任務(wù)自身的ID號taskIdVerify()

證實(shí)一個特定任務(wù)的存在(由任務(wù)ID指定)嵌入式操作系統(tǒng)管理任務(wù)名稱和ID號的函數(shù)?嵌入式操作系統(tǒng)任務(wù)選項(xiàng)相關(guān)函數(shù)?盡管TaskSpawn()中options參數(shù)指定的新任務(wù)的選項(xiàng),使用下列函數(shù)可以動態(tài)讀取或設(shè)置指定任務(wù)的選項(xiàng)

–taskOptionsGet():獲取任務(wù)選項(xiàng)

–taskOptionsSet():設(shè)置任務(wù)選項(xiàng)–當(dāng)前只有VX_UNBREAKABLE選項(xiàng)可以改變嵌入式操作系統(tǒng)任務(wù)選項(xiàng)相關(guān)函數(shù)?盡管TaskSpawn()嵌入式操作系統(tǒng)獲取任務(wù)信息????????taskIDListGet():獲取所有活動任務(wù)的ID號taskInfoGet():得到指定任務(wù)的信息taskPriorityGet():查看指定任務(wù)的優(yōu)先級taskRegsGet():查看任務(wù)的寄存器taskRegsSet():設(shè)置任務(wù)的寄存器taskIsSuspended():查看指定任務(wù)是否掛起taskIsReady():查看指定任務(wù)是否就緒taskTCB:得到任務(wù)控制塊指針嵌入式操作系統(tǒng)獲取任務(wù)信息?taskIDListG

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論