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頁,還剩123頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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

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

3、eAdd( ),nodeScrap( )2021/8/226嵌入式操作系統(tǒng)1.1 任務(wù)運(yùn)行的地址空間 VxWorks操作系統(tǒng)采取線性單一實(shí)地址空操作系統(tǒng)采取線性單一實(shí)地址空 間模式,所有任務(wù)都運(yùn)行在同一地址空 間,不區(qū)分用戶態(tài)和核心態(tài)2021/8/227嵌入式操作系統(tǒng)2021/8/228嵌入式操作系統(tǒng) VxWorks下任務(wù)具有如下特點(diǎn):下任務(wù)具有如下特點(diǎn): 任務(wù)切換時(shí)不需要進(jìn)行虛擬地址空間切換 任務(wù)間可以直接共享變量,不需要通過內(nèi)核 在不同的地址空間復(fù)制數(shù)據(jù) 系統(tǒng)調(diào)用時(shí)不需要在核心態(tài)和用戶態(tài)之間切 換,相當(dāng)于直接的函數(shù)調(diào)用2021/8/229嵌入式操作系統(tǒng) !由于沒有訪問內(nèi)存任何約束和保護(hù),因

4、而對(duì)代碼質(zhì)量提出了更高的要求 當(dāng)選用VxVMI時(shí),每個(gè)任務(wù)各自的地址空 間需要進(jìn)行虛擬地址到物理地址的轉(zhuǎn)換2021/8/2210嵌入式操作系統(tǒng)1.2 任務(wù)的結(jié)構(gòu)data段數(shù)據(jù)段bss段TCB代碼段堆棧段不需要進(jìn)行用戶、內(nèi)核的區(qū)分2021/8/2211嵌入式操作系統(tǒng)TCB TCB用來描述一個(gè)任務(wù),每一任務(wù)都與一用來描述一個(gè)任務(wù),每一任務(wù)都與一 個(gè)TCB關(guān)聯(lián) TCB用用windTcb結(jié)構(gòu)體來描述結(jié)構(gòu)體來描述 VxWorks的的taskLib庫中定義(庫中定義(taskLib.h)2021/8/2212嵌入式操作系統(tǒng) TCB中上下文信息包含的具體內(nèi)容:中上下文信息包含的具體內(nèi)容: 程序執(zhí)行點(diǎn)(PC)

5、 CPU狀態(tài),包括各種處理器特定的寄存器狀態(tài),包括各種處理器特定的寄存器棧任務(wù)的狀態(tài)延遲定時(shí)器時(shí)間片定時(shí)器I/O操作分配的標(biāo)準(zhǔn)輸入操作分配的標(biāo)準(zhǔn)輸入/輸出,標(biāo)準(zhǔn)錯(cuò)誤輸出輸出,標(biāo)準(zhǔn)錯(cuò)誤輸出操作2021/8/2213嵌入式操作系統(tǒng)內(nèi)核控制結(jié)構(gòu)信號(hào)處理信息錯(cuò)誤信息調(diào)試和性能監(jiān)視狀態(tài)任務(wù)變量(可選)浮點(diǎn)上下文(可選)可擴(kuò)展項(xiàng) (可選)2021/8/2214嵌入式操作系統(tǒng)錯(cuò)誤信息 在VxWorks中有一個(gè)全局變量errno來存放 系統(tǒng)最近的錯(cuò)誤狀態(tài)值 每個(gè)任務(wù)TCB中都記錄有一個(gè)全局errno副 本errostatus ,屬于任務(wù)上下文的一部分 ISR也使用獨(dú)立的也使用獨(dú)立的errno,但是,但是ISR

6、沒有沒有 TCB,內(nèi)核為,內(nèi)核為ISR在中斷棧中保存和恢復(fù)在中斷棧中保存和恢復(fù) errno2021/8/2215嵌入式操作系統(tǒng) errno的值由的值由4個(gè)字節(jié)表示,個(gè)字節(jié)表示,2個(gè)高字節(jié)表示個(gè)高字節(jié)表示 產(chǎn)生錯(cuò)誤的模塊組件編碼,2個(gè)低字節(jié)表示 錯(cuò)誤編號(hào) 如0 x110001,表示內(nèi)存不足 VxWorks提供提供errnoLib庫用于獲取和設(shè)置庫用于獲取和設(shè)置 任務(wù)和中斷的錯(cuò)誤狀態(tài)值2021/8/2216嵌入式操作系統(tǒng)任務(wù)變量 當(dāng)多個(gè)任務(wù)需要同一全局變量或靜態(tài)變量 提供不同的值時(shí),VxWorks提供任務(wù)變量 機(jī)制來切換全局變量 任務(wù)變量機(jī)制允許在任務(wù)上下文中定義自 己的私有變量,隨著上下文切換而

7、切換2021/8/2217嵌入式操作系統(tǒng)2021/8/2218嵌入式操作系統(tǒng) 每個(gè)任務(wù)變量允許存放一個(gè)4字節(jié)的值typedef struct taskVar /* TASK_VAR */ struct taskVar * next; int *address; intvalue; TASK_VAR; VxWorks提供庫提供庫taskVarLib庫支持任務(wù)變庫支持任務(wù)變 量機(jī)制2021/8/2219嵌入式操作系統(tǒng) 當(dāng)有多個(gè)任務(wù)變量時(shí),任務(wù)變量以單向鏈表 的形式存在2021/8/2220嵌入式操作系統(tǒng) 任務(wù)切換時(shí)需要遍歷任務(wù)變量鏈表,進(jìn)行 變量值的恢復(fù)和保存降低效率 !此機(jī)制會(huì)降低任務(wù)上下文切換

8、的效率, 建議編程時(shí)謹(jǐn)慎使用2021/8/2221嵌入式操作系統(tǒng)堆棧 在任務(wù)創(chuàng)建時(shí)指定 堆棧的大小 TCB記錄了位置和記錄了位置和 大小等棧信息 任務(wù)棧大小的設(shè)置 必須合理高地址pStackEndStackSizepStackBaseTCB低地址pTCBpTaskMem16bytes2021/8/2222嵌入式操作系統(tǒng) VxWorks操作系統(tǒng)提供函數(shù)操作系統(tǒng)提供函數(shù)checkStack( ) 來檢查任務(wù)棧使用情況 checkStack( )顯示了單個(gè)指定任務(wù)或者所有任顯示了單個(gè)指定任務(wù)或者所有任 務(wù)的棧使用情況,包括:棧大小(SIZE)棧當(dāng)前使用數(shù)(CUR)歷史使用峰值(HIGH)最大可能空余

9、數(shù)(MARGIN=SIZE-HIGH) Tornado中的中的browser也可查看棧的使用情也可查看棧的使用情 況 !堆棧診斷前提:棧初始化時(shí)要用0 xee填 充2021/8/2223嵌入式操作系統(tǒng) shell下創(chuàng)建任務(wù)時(shí)默認(rèn)堆棧大?。ㄏ聞?chuàng)建任務(wù)時(shí)默認(rèn)堆棧大?。╯p命命 令) #define SHELL_STACK_SIZE 10000 VxWorks支持獨(dú)立的中斷棧,對(duì)所有的支持獨(dú)立的中斷棧,對(duì)所有的 ISR使用相同的中斷棧使用相同的中斷棧 中斷棧在系統(tǒng)啟動(dòng)時(shí)根據(jù)配置參數(shù)設(shè)置位 置、大小和填充。在configAll.h中有缺省定 義:#define ISR_STACK_SIZE100020

10、21/8/2224嵌入式操作系統(tǒng)1.3 任務(wù)的標(biāo)識(shí) VxWorks下標(biāo)識(shí)任務(wù)有兩種途徑:任務(wù)名稱和任下標(biāo)識(shí)任務(wù)有兩種途徑:任務(wù)名稱和任 務(wù)ID號(hào) 任務(wù)名稱 是獨(dú)一無二的字符串 主機(jī)任務(wù)以字母u開頭 目標(biāo)機(jī)任務(wù)以字母t開頭 任務(wù)ID號(hào) 長度為4字節(jié),指向TCB VxWorks提供任務(wù)名稱和任務(wù)提供任務(wù)名稱和任務(wù)ID之間的轉(zhuǎn)換函數(shù)之間的轉(zhuǎn)換函數(shù)2021/8/2225嵌入式操作系統(tǒng)1.4 任務(wù)的狀態(tài) 5種基本狀態(tài):種基本狀態(tài):執(zhí)行(RUN)就緒(READY)任務(wù)只需等待cpu阻塞(PEND)有cpu以外的資源不可用睡眠(DELAY)任務(wù)處于睡眠狀態(tài)掛起(SUSPEND)一般用于調(diào)試DELAY+S睡眠

11、睡眠+掛起掛起PEND+S阻塞阻塞+掛起狀態(tài)掛起狀態(tài)PEND+T延時(shí)阻塞狀態(tài)延時(shí)阻塞狀態(tài)PEND+T+S延時(shí)阻塞延時(shí)阻塞+掛起狀態(tài)掛起狀態(tài)+I繼承優(yōu)先級(jí)狀態(tài),優(yōu)先級(jí)暫時(shí)被提升繼承優(yōu)先級(jí)狀態(tài),優(yōu)先級(jí)暫時(shí)被提升 多種組合狀態(tài)2021/8/2226嵌入式操作系統(tǒng)任務(wù)的狀態(tài)轉(zhuǎn)換圖任務(wù)創(chuàng)建時(shí),處于掛起狀態(tài)taskSuspend()taskResume()掛起要使剛創(chuàng)建的任務(wù)就緒, taskResume()要激活該任務(wù) taskSuspend() taskSuspend()taskResume()/taskActivate()阻塞就緒semTake()/msgQReceive()semGive()/msg

12、QSend()搶占調(diào)度睡眠taskDelay() 使用spawning原語,可以直接延時(shí)已到 創(chuàng)建并激活一個(gè)任務(wù)任務(wù)可以在任何狀態(tài)下被刪除執(zhí)行2021/8/2227嵌入式操作系統(tǒng)任務(wù)的狀態(tài)隊(duì)列2021/8/2228嵌入式操作系統(tǒng)1.5 任務(wù)上下文切換 上下文切換示意圖TCB(Old)copy of pccopy of spCPUpcspTCB(New)copy of pccopy of sperrorStatuserrnoerrorStatus2021/8/2229嵌入式操作系統(tǒng) 上下文切換分兩種情況:同步和異步 同步上下文切換,引起的原因是當(dāng)前運(yùn)行的任務(wù) 執(zhí)行下列操作: 進(jìn)行阻塞、延遲、掛起

13、的調(diào)用; 使更高優(yōu)先級(jí)任務(wù)就緒而發(fā)生優(yōu)先級(jí)搶占 降低自身優(yōu)先級(jí)或者退出; 異步上下文切換,通常由ISR使更高優(yōu)先級(jí)任務(wù)就 緒引起。2021/8/2230嵌入式操作系統(tǒng)1.6 VxWorks的系統(tǒng)任務(wù)的系統(tǒng)任務(wù) 根任務(wù)tUsrRoot 內(nèi)核執(zhí)行的第一個(gè)任務(wù) 初始化VxWorks系統(tǒng)的主要功能,例如 發(fā)起日志任務(wù)、異常處理任務(wù)、網(wǎng)絡(luò)任務(wù)和 tRlogind后臺(tái)任務(wù)后臺(tái)任務(wù) 通常,上述初始化結(jié)束之后,根任務(wù)終止并刪除 用戶可以向根任務(wù)自由的添加任何必需的初始化代碼 對(duì)應(yīng)usrRoot()函數(shù)(target/config/all/usrConfig.c)2021/8/2231嵌入式操作系統(tǒng) 日志任務(wù):

14、tLogTask 記錄系統(tǒng)信息的任務(wù)。它不執(zhí)行輸入/輸出操作。 異常處理任務(wù):tExcTask 提供VxWorks異常處理包,完成在中斷級(jí)不能執(zhí)行的 功能 必須具有系統(tǒng)最高的優(yōu)先級(jí) 不能掛起、刪除、改變其任務(wù)的優(yōu)先級(jí) 目標(biāo)代理服務(wù):tWdbTask(INCLUDE_WDB) 當(dāng)目標(biāo)代理設(shè)置為運(yùn)行在任務(wù)模式時(shí),創(chuàng)建此任務(wù) 處理來自Tornado目標(biāo)服務(wù)的請(qǐng)求以上3種任務(wù)都屬于VxWorks的基本任務(wù)2021/8/2232嵌入式操作系統(tǒng) 網(wǎng)絡(luò)任務(wù):tNetTask(INCLUDE_NET_LIB) 后臺(tái)處理VxWorks網(wǎng)絡(luò)需要的任務(wù)級(jí)功能處理 其他可選組件的任務(wù) tShell(INCLUDE_S

15、HELL) tRlogind(INCLUDE_RLOGIN) tTelnetd(INCLUDE_TELNET) tPortmapd(INCLUDE_RPC)2021/8/2233嵌入式操作系統(tǒng)與Linux比較 任務(wù)控制塊的內(nèi)容多用戶性、任務(wù)間的親屬關(guān)系、文件打開表、隊(duì)列信 息、虛擬內(nèi)存信息、錯(cuò)誤狀態(tài)等 棧棧的大小、中斷棧 任務(wù)狀態(tài)狀態(tài)的種類、狀態(tài)間的轉(zhuǎn)換2021/8/2234嵌入式操作系統(tǒng)2、VxWorks下任務(wù)控制及任務(wù)編程下任務(wù)控制及任務(wù)編程任務(wù)創(chuàng)建和激活任務(wù)刪除與任務(wù)安全任務(wù)的狀態(tài)控制任務(wù)信息的獲取任務(wù)擴(kuò)展函數(shù)代碼的共享與重入2021/8/2235嵌入式操作系統(tǒng) VxWorks提供豐富的

16、任務(wù)控制功能,包含在提供豐富的任務(wù)控制功能,包含在 taskLib庫中庫中 包括: 任務(wù)的創(chuàng)建、刪除、狀態(tài)控制、獲取任務(wù)信息 等等 可以在Tornado IDE提供的提供的shell工具中交互使用工具中交互使用 這些調(diào)用2021/8/2236嵌入式操作系統(tǒng)2021/8/2237嵌入式操作系統(tǒng)2021/8/2238嵌入式操作系統(tǒng)2021/8/2239嵌入式操作系統(tǒng)2.1 任務(wù)的創(chuàng)建與激活 VxWorks的的TaskLib庫中提供多個(gè)函數(shù)用于創(chuàng)建庫中提供多個(gè)函數(shù)用于創(chuàng)建 任務(wù):調(diào)用taskSpawn()taskInit()taskActivate()描述創(chuàng)建并激活一個(gè)任務(wù)初始化一個(gè)新任務(wù)激活一個(gè)初

17、始化任務(wù)2021/8/2240嵌入式操作系統(tǒng)taskSpawn()創(chuàng)建并激活一個(gè)新任務(wù)創(chuàng)建并激活一個(gè)新任務(wù)int taskSpawn ( char *name,/*新任務(wù)的任務(wù)名新任務(wù)的任務(wù)名*/ int priority,/*新任務(wù)的優(yōu)先級(jí)新任務(wù)的優(yōu)先級(jí)*/ int options,/*任務(wù)選項(xiàng)字任務(wù)選項(xiàng)字*/ int stackSize,/*堆棧大小堆棧大小*/ FUNCPTR entryPt,/*新任務(wù)的入口函數(shù)新任務(wù)的入口函數(shù)*/ int arg1,arg2,arg3,arg4,arg5, /*傳遞給入口函數(shù)傳遞給入口函數(shù)*/ int arg6,arg7,arg8,arg9,arg10

18、 /*的的10參數(shù)參數(shù)*/ )2021/8/2241嵌入式操作系統(tǒng)TaskSpawn() 創(chuàng)建新任務(wù)的上下文 堆棧、TCB、含有特定參數(shù)的入口程序調(diào)用的 任務(wù)環(huán)境(入口程序通常是一個(gè)普通的程序) 新的任務(wù)將在指定的函數(shù)入口處執(zhí)行 激活新任務(wù) 堆棧是系統(tǒng)資源,位于系統(tǒng)內(nèi)存中 其底端是TCB 堆棧使用0 xEE填充 任務(wù)名要便于記憶,可以是任意長度、任意內(nèi)容2021/8/2242嵌入式操作系統(tǒng) taskSpawn中的任務(wù)選項(xiàng)參數(shù)可以是下表中的選 項(xiàng)之一或其組合如果任務(wù)使用任何浮點(diǎn)操作,必須要求使用VX_FP_TASK選項(xiàng)2021/8/2243嵌入式操作系統(tǒng) 任務(wù)的優(yōu)先級(jí): Wind內(nèi)核支持內(nèi)核支持

19、256種優(yōu)先級(jí),種優(yōu)先級(jí),0255 優(yōu)先級(jí)0為最高,優(yōu)先級(jí)255為最低 一般,099分配給系統(tǒng)任務(wù),100255分配給用 戶任務(wù)2021/8/2244嵌入式操作系統(tǒng)taskSpawn()返回值返回值 成功:任務(wù)ID號(hào) 失?。篍RROR。返回的ERRNOS可能有 S_intLib_NOT_ISR_CALLABLE, /*程序不能從一個(gè)程序不能從一個(gè)ISR中調(diào)用中調(diào)用*/ S_objLib_OBJ_ID_ERROR, /*不正確的任務(wù)不正確的任務(wù)ID*/ S_smObjLib_NOT_INITIALIZED, /*在指定的分區(qū)中,沒有足夠的內(nèi)存用于發(fā)起任務(wù)在指定的分區(qū)中,沒有足夠的內(nèi)存用于發(fā)起任務(wù)

20、*/ S_memLib_NOT_ENOUGH_MEMORY, /*沒有足夠的內(nèi)存發(fā)起任務(wù)沒有足夠的內(nèi)存發(fā)起任務(wù)*/ S_memLib_BLOCK_ERROR, /*不能夠?qū)?nèi)存分區(qū)互斥訪問不能夠?qū)?nèi)存分區(qū)互斥訪問*/ S_taskLib_ILLEGAL_PRIORITY /*非法的優(yōu)先級(jí)非法的優(yōu)先級(jí)*/2021/8/2245嵌入式操作系統(tǒng) 在源代碼中使用TaskSpawn創(chuàng)建新任務(wù) 在Tornado Shell中中 使用TaskSpawn創(chuàng)建新任務(wù) 使用i查看系統(tǒng)中的任務(wù)(演示)2021/8/2246嵌入式操作系統(tǒng) taskSpawn()中包含了一些低級(jí)的操作,包括初始中包含了一些低級(jí)的操作,

21、包括初始 化和激活一個(gè)任務(wù) taskInit() taskActivate()2021/8/2247嵌入式操作系統(tǒng)taskInit()初始化一個(gè)任務(wù)初始化一個(gè)任務(wù)STATUS taskInit ( WIND_TCB *pTcb, /*新任務(wù)的新任務(wù)的TCB地址地址*/ char *name, 允許不指定任務(wù)名,由系統(tǒng)自動(dòng)命名/*新任務(wù)的名新任務(wù)的名字字*/ int priority,/*新任務(wù)的優(yōu)先級(jí)新任務(wù)的優(yōu)先級(jí)*/ int options,/*任務(wù)選項(xiàng)字任務(wù)選項(xiàng)字*/ char *pStackBase,/*任務(wù)堆?;刂啡蝿?wù)堆?;刂?/ 初始化指定的內(nèi)存區(qū)域作為任務(wù)的堆棧 和控制塊,而不

22、像taskSpawn()那樣由系 int stackSize,/*堆棧大小堆棧大小*/ FUNCPTR entrypt, 統(tǒng)自動(dòng)分配/*任務(wù)入口任務(wù)入口*/ int arg1,arg2,arg3,arg4,arg5,/*入口參數(shù)入口參數(shù)*/ 可以方便應(yīng)用進(jìn)行調(diào)試,并將堆棧分配 在指定位置int arg6,arg7,arg8,arg9,arg10 )2021/8/2248嵌入式操作系統(tǒng) taskInit的返回值:的返回值: 成功:OK 任務(wù)不能初始化則:ERROR??赡芊祷氐?ERRNOS值有:值有: S_intLib_NOT_ISR_CALLABLE /*程序不能從一個(gè)程序不能從一個(gè)ISR中調(diào)

23、用中調(diào)用*/ S_objLib_OBJ_ID_ERROR /*不正確的任務(wù)不正確的任務(wù)ID*/2021/8/2249嵌入式操作系統(tǒng)taskActivate()激活一個(gè)任務(wù)激活一個(gè)任務(wù) STATUS taskActivate(int tid) taskActivate()激活由激活由taskInit()創(chuàng)建的任務(wù),其參創(chuàng)建的任務(wù),其參 數(shù)是taskInit()中第一個(gè)參數(shù)任務(wù)TCB的地址,強(qiáng) 制類型轉(zhuǎn)換如下: tid = (int) pTcb; 注意:當(dāng)應(yīng)用需要對(duì)任務(wù)定位和激活進(jìn)行控制 時(shí),才使用這兩個(gè)函數(shù),通常使用taskSpawn()就 可以了2021/8/2250嵌入式操作系統(tǒng)管理任務(wù)名稱

24、和ID號(hào)的函數(shù) 由任務(wù)號(hào)得到任務(wù)名taskName() 由任務(wù)名得到任務(wù)ID號(hào)taskNameTold()taskIDSelf() 得到任務(wù)自身的ID號(hào)taskIdVerify() 證實(shí)一個(gè)特定任務(wù)的存在(由任務(wù)ID指定)2021/8/2251嵌入式操作系統(tǒng)任務(wù)選項(xiàng)相關(guān)函數(shù) 盡管TaskSpawn()中options參數(shù)指定的新任務(wù)的 選項(xiàng),使用下列函數(shù)可以動(dòng)態(tài)讀取或設(shè)置指定任 務(wù)的選項(xiàng) taskOptionsGet():獲取任務(wù)選項(xiàng):獲取任務(wù)選項(xiàng) taskOptionsSet():設(shè)置任務(wù)選項(xiàng):設(shè)置任務(wù)選項(xiàng) 當(dāng)前只有VX_UNBREAKABLE選項(xiàng)可以改變2021/8/2252嵌入式操作系統(tǒng)

25、獲取任務(wù)信息taskIDListGet():獲取所有活動(dòng)任務(wù)的:獲取所有活動(dòng)任務(wù)的ID號(hào)號(hào)taskInfoGet():得到指定任務(wù)的信息:得到指定任務(wù)的信息taskPriorityGet():查看指定任務(wù)的優(yōu)先級(jí):查看指定任務(wù)的優(yōu)先級(jí)taskRegsGet():查看任務(wù)的寄存器:查看任務(wù)的寄存器taskRegsSet():設(shè)置任務(wù)的寄存器:設(shè)置任務(wù)的寄存器taskIsSuspended():查看指定任務(wù)是否掛起:查看指定任務(wù)是否掛起taskIsReady():查看指定任務(wù)是否就緒:查看指定任務(wù)是否就緒taskTCB:得到任務(wù)控制塊指針:得到任務(wù)控制塊指針2021/8/2253嵌入式操作系統(tǒng)ta

26、skSpawn應(yīng)用實(shí)例應(yīng)用實(shí)例12021/8/2254嵌入式操作系統(tǒng) 結(jié)果演示2021/8/2255嵌入式操作系統(tǒng) 仿真器上顯示信息:2021/8/2256嵌入式操作系統(tǒng) 將s2_tasks中的優(yōu)先級(jí)101改為101-i2021/8/2257嵌入式操作系統(tǒng) 演示結(jié)果2021/8/2258嵌入式操作系統(tǒng)taskSpawn應(yīng)用實(shí)例應(yīng)用實(shí)例22021/8/2259嵌入式操作系統(tǒng) 演示結(jié)果2021/8/2260嵌入式操作系統(tǒng) 仿真器上顯示信息:2021/8/2261嵌入式操作系統(tǒng)2.2 任務(wù)刪除和刪除安全 任務(wù)可以動(dòng)態(tài)地從系統(tǒng)中刪除 刪除任務(wù)的函數(shù)調(diào)用若任務(wù)的入口函數(shù)指定返回,則將隱含調(diào)用exit()

27、;另外,任務(wù)可以在任何時(shí)候調(diào)用exit殺死自身; exit():終止任務(wù)自身的執(zhí)行,釋放所占用的:終止任務(wù)自身的執(zhí)行,釋放所占用的 內(nèi)存(stack和TCB) taskDelete():終止一個(gè)指定任務(wù),釋放所占:終止一個(gè)指定任務(wù),釋放所占 用的內(nèi)存(同上)任務(wù)可以在任何時(shí)候調(diào)用taskDelete刪除其他任務(wù)任務(wù)終止時(shí),其執(zhí)行時(shí)任務(wù)分配的內(nèi)存不會(huì)被釋放,如malloc()分配的內(nèi)存,必須由任務(wù)自身編程釋放。2021/8/2262嵌入式操作系統(tǒng)taskDelete應(yīng)用實(shí)例應(yīng)用實(shí)例延遲0.5秒2021/8/2263嵌入式操作系統(tǒng)2021/8/2264嵌入式操作系統(tǒng) 演示結(jié)果2021/8/2265

28、嵌入式操作系統(tǒng) 仿真器上顯示信息:2021/8/2266嵌入式操作系統(tǒng) 注意:不要在一個(gè)不合適的時(shí)刻刪除任務(wù),在刪 除之前,該任務(wù)必須釋放它所持有的所有資源 保護(hù)任務(wù)不被刪除的函數(shù)調(diào)用任務(wù)訪問臨界區(qū)時(shí)就需要這種保護(hù)。例如,為了對(duì)某些數(shù)據(jù)結(jié)構(gòu)互斥訪問,任務(wù)可能取得一個(gè)信號(hào)量。但若正在臨界區(qū)執(zhí)行的任務(wù)被刪除,會(huì)導(dǎo)致這個(gè)任務(wù)無法完成臨界區(qū)的訪問,從而使得該數(shù)據(jù)結(jié)構(gòu)可能處于一種被破壞或不一致的狀 taskSafe():保護(hù)任務(wù)不被刪除:保護(hù)任務(wù)不被刪除態(tài)。 taskUnsafe():解除任務(wù)保護(hù):解除任務(wù)保護(hù)此外,由于該任務(wù)沒有釋放信號(hào)量,其他任務(wù)將無法獲得信號(hào)量,從而導(dǎo)致該臨界資源不可用。使用tas

29、kDelete()刪除另一個(gè)被保護(hù)的任務(wù),會(huì)導(dǎo)致調(diào)用者任務(wù)被阻塞,直到被保護(hù)的任務(wù)解除保護(hù)任務(wù)保護(hù)使用一個(gè)計(jì)數(shù)器實(shí)現(xiàn)保護(hù)的嵌套,僅當(dāng)計(jì)數(shù)器為0時(shí)才真正的解除保護(hù)2021/8/2267嵌入式操作系統(tǒng) 下面的代碼段說明如何使用taskSafe()和 taskUnsafe()來保護(hù)一段臨界區(qū)代碼來保護(hù)一段臨界區(qū)代碼taskSafe();semTake(semID, WAIT_FOREVER); /*Block until semaphore available*/臨界區(qū)操作代碼semGive(semID); /*Release semaphore*/taskUnsafe();2021/8/2268嵌

30、入式操作系統(tǒng)2.3 任務(wù)運(yùn)行的控制 下列函數(shù)用于控制任務(wù)的執(zhí)行VxWorks的調(diào)試功能希的調(diào)試功能希望能夠掛起/恢復(fù)任務(wù)的執(zhí)行,從而可以凍結(jié)任務(wù)的執(zhí)行狀態(tài)終止任務(wù),然后使用原有參數(shù)重新創(chuàng)建任務(wù)。提供一個(gè)簡單的任務(wù)睡眠機(jī)制。區(qū)別,taskDelay()將會(huì)導(dǎo)致任務(wù)被移到相同優(yōu)先級(jí)就緒隊(duì)列的尾 這是一個(gè)POSIX函數(shù),部,例如taskDelay(0)可以將CPU交給同優(yōu)先級(jí)的另一個(gè)任務(wù) 與taskDelay() 以下調(diào)用將任務(wù)延時(shí)半秒: 一樣可以實(shí)現(xiàn)延時(shí),但延時(shí)單位不同,可以直接指明延時(shí)。而調(diào)用nanosleep實(shí)現(xiàn)延時(shí)0被認(rèn)為是錯(cuò)誤的2021/8/2269嵌入式操作系統(tǒng)taskResume()

31、taskSuspend()taskResume()/taskActivate()taskSuspend()taskSuspend()taskResume()掛起阻塞就緒睡眠 taskDelay()延時(shí)已到執(zhí)行taskRestart()2021/8/2270嵌入式操作系統(tǒng)應(yīng)用實(shí)例12021/8/2271嵌入式操作系統(tǒng)2021/8/2272嵌入式操作系統(tǒng)2021/8/2273嵌入式操作系統(tǒng) 演示結(jié)果2021/8/2274嵌入式操作系統(tǒng) 仿真器上顯示信息:2021/8/2275嵌入式操作系統(tǒng) 將taskResume換成taskActivate,結(jié)果一樣2021/8/2276嵌入式操作系統(tǒng)應(yīng)用實(shí)例22

32、021/8/2277嵌入式操作系統(tǒng)不能延遲到myFunc任務(wù)已結(jié)束2021/8/2278嵌入式操作系統(tǒng) 演示結(jié)果2021/8/2279嵌入式操作系統(tǒng) 仿真器上顯示信息:2021/8/2280嵌入式操作系統(tǒng)2.4 任務(wù)擴(kuò)展函數(shù) 有時(shí)任務(wù)需要在任務(wù)創(chuàng)建、刪除或上下文切換 時(shí)增加相應(yīng)的處理,又不需要修改內(nèi)核 VxWorks的內(nèi)核的內(nèi)核wind提供鉤子函數(shù)機(jī)制實(shí)現(xiàn)上提供鉤子函數(shù)機(jī)制實(shí)現(xiàn)上 述目標(biāo),使得當(dāng)任務(wù)創(chuàng)建、上下文切換、刪除 時(shí)調(diào)用用戶附加的函數(shù) 下列函數(shù)可以設(shè)置任務(wù)創(chuàng)建/切換/刪除時(shí)的鉤子 函數(shù)2021/8/2281嵌入式操作系統(tǒng)taskHookLib所有HOOK函數(shù)的入?yún)⒍际呛瘮?shù)指針2021/

33、8/2282嵌入式操作系統(tǒng) 由于用于任務(wù)切換時(shí)的鉤子函數(shù)只能運(yùn)行在內(nèi) 核上下文中,因此這個(gè)鉤子函數(shù)能夠調(diào)用的函 數(shù)調(diào)用有限制,只能是:緩沖區(qū)管理庫 協(xié)處理器(浮點(diǎn))狀態(tài)的保存和恢復(fù)鏈表操作庫體系結(jié)構(gòu)無關(guān)的中斷例程庫 C的數(shù)學(xué)計(jì)算庫環(huán)形緩沖區(qū)操作庫任務(wù)管理庫出錯(cuò)處理2021/8/2283嵌入式操作系統(tǒng)應(yīng)用實(shí)例2021/8/2284嵌入式操作系統(tǒng)在任務(wù)創(chuàng)建時(shí),就會(huì)調(diào)用myTaskHook 演示結(jié)果 Shell下輸出信息:下輸出信息:2021/8/2285嵌入式操作系統(tǒng) 仿真器輸出信息:2021/8/2286嵌入式操作系統(tǒng)2.5 代碼的共享和重入 VxWorks提倡:單個(gè)子程序的備份或子程序庫被多

34、個(gè)不同的任務(wù)調(diào)用 定義:一個(gè)被多個(gè)任務(wù)調(diào)用的單個(gè)備份成為共享 代碼VxWorks動(dòng)態(tài)鏈接功能很容易實(shí)現(xiàn)代碼共享動(dòng)態(tài)鏈接功能很容易實(shí)現(xiàn)代碼共享2021/8/2287嵌入式操作系統(tǒng)重入 共享代碼必須是可重入的: 一個(gè)子程序是可重入的,如果該程序的單個(gè)備 份可以被多個(gè)任務(wù)同時(shí)調(diào)用而不會(huì)發(fā)生沖突 典型的沖突: 對(duì)全局或靜態(tài)變量的修改 VxWorks的很多子程序是可重入的的很多子程序是可重入的 慣例:所有somename_r()命名的子程序被認(rèn)為 是不可重入的 VxWorks的的I/O和驅(qū)動(dòng)程序是可重入的和驅(qū)動(dòng)程序是可重入的2021/8/2288嵌入式操作系統(tǒng) 大部分VxWorks函數(shù)使用下列3種重入技

35、術(shù): 動(dòng)態(tài)堆棧變量 這種函數(shù)一般是純代碼,除動(dòng)態(tài)堆棧變量外沒有自己 的數(shù)據(jù),以調(diào)用者提供的數(shù)據(jù)為參數(shù)進(jìn)行操作。 受信號(hào)量保護(hù)的全局和靜態(tài)變量 這種函數(shù)一般含有公共數(shù)據(jù),在調(diào)用時(shí),必須借助于 互斥機(jī)制,禁止任務(wù)同時(shí)在代碼臨界區(qū)域內(nèi)執(zhí)行,明 確地實(shí)現(xiàn)重入。 任務(wù)變量 一些可被多個(gè)任務(wù)同時(shí)調(diào)用的程序,程序中的全局變 量或靜態(tài)變量對(duì)每次任務(wù)的調(diào)用需要不同的值。2021/8/2289嵌入式操作系統(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

36、函數(shù)裝入新 任務(wù)代碼,并用它來覆蓋原有的屬于父任務(wù)的內(nèi)容。 這樣做的好處是如果需要,可以從父任務(wù)那里繼承代 碼、數(shù)據(jù)等屬性。 在spawn模型下,擯棄了繼承的功能,在創(chuàng)建新任務(wù) 時(shí),直接為它分配全新的地址空間,然后將新代碼裝 入并運(yùn)行。2021/8/2290嵌入式操作系統(tǒng)3、VxWorks任務(wù)調(diào)度任務(wù)調(diào)度 任務(wù)調(diào)度策略 任務(wù)調(diào)度時(shí)機(jī) 搶占上鎖2021/8/2291嵌入式操作系統(tǒng)3.1 任務(wù)調(diào)度策略 調(diào)度是針對(duì)多任務(wù)而言的 調(diào)度是指:根據(jù)一定的約束規(guī)則,將CPU分配 給符合條件的任務(wù)使用 上述約束規(guī)則就是所謂的調(diào)度策略(或算法) Wind內(nèi)核默認(rèn)采用基于優(yōu)先級(jí)的搶占式調(diào)度內(nèi)核默認(rèn)采用基于優(yōu)先級(jí)的

37、搶占式調(diào)度 Priority-based preemptive scheduling 同時(shí)還使用輪轉(zhuǎn)(Round-Robin)調(diào)度算法2021/8/2292嵌入式操作系統(tǒng)任務(wù)隊(duì)列 activeQHead 記錄了一個(gè)線程從生成到刪除過程中的每一個(gè)任務(wù)信 息 ,是一個(gè)FIFO隊(duì)列 readyQHead 記錄所有就緒任務(wù),是一個(gè)優(yōu)先級(jí)隊(duì)列 tickQHead 記錄所有延遲狀態(tài)的任務(wù),是一個(gè)優(yōu)先級(jí)隊(duì)列 pendQHead 記錄所有阻塞狀態(tài)的任務(wù),是一個(gè)優(yōu)先級(jí)隊(duì)列 WorkQ 記錄所有中斷發(fā)起的任務(wù),是一個(gè)環(huán)形隊(duì)列2021/8/2293嵌入式操作系統(tǒng)控制任務(wù)調(diào)度的幾個(gè)函數(shù) kernelTimeSlice

38、() taskPrioritySet() taskLock() taskUnlock()控制輪轉(zhuǎn)調(diào)度改變?nèi)蝿?wù)的優(yōu)先級(jí)禁止任務(wù)調(diào)度允許任務(wù)調(diào)度2021/8/2294嵌入式操作系統(tǒng)基于優(yōu)先級(jí)的搶占式任務(wù)調(diào)度 基于優(yōu)先級(jí)的搶占式任務(wù)調(diào)度 系統(tǒng)中的每個(gè)任務(wù)都擁有一個(gè)優(yōu)先級(jí) 任意時(shí)刻,內(nèi)核將CPU分配給處于就緒態(tài)的優(yōu)先 級(jí)最高的任務(wù)運(yùn)行 搶占: 一旦內(nèi)核發(fā)現(xiàn)有一個(gè)比當(dāng)前正在運(yùn)行的任務(wù)的優(yōu) 先級(jí)高的任務(wù)就緒,內(nèi)核立即保存當(dāng)前任務(wù)的上 下文,切換到這個(gè)高優(yōu)先級(jí)任務(wù)的上下文中運(yùn)行2021/8/2295嵌入式操作系統(tǒng)2021/8/2296嵌入式操作系統(tǒng)任務(wù)優(yōu)先級(jí) VxWorks支持支持256個(gè)優(yōu)先級(jí),編號(hào)個(gè)優(yōu)先

39、級(jí),編號(hào)0255,優(yōu)先級(jí),優(yōu)先級(jí)0 最高,255最低,一般099分配給系統(tǒng)任務(wù), 100255分配給用戶任務(wù)。分配給用戶任務(wù)。 任務(wù)的優(yōu)先級(jí)在創(chuàng)建時(shí)指定 任務(wù)可以調(diào)用taskPrioritySet改變自己的優(yōu)先級(jí)2021/8/2297嵌入式操作系統(tǒng)應(yīng)用示例 下面程序,創(chuàng)建了3個(gè)優(yōu)先級(jí)各不相同的任務(wù):2021/8/2298嵌入式操作系統(tǒng)2021/8/2299嵌入式操作系統(tǒng)2021/8/22100嵌入式操作系統(tǒng)2021/8/22101嵌入式操作系統(tǒng) 演示結(jié)果:2021/8/22102嵌入式操作系統(tǒng) 如何修改程序,使得任務(wù)的執(zhí)行順序變?yōu)椋?taskOne,taskTwo,taskThree?2021

40、/8/22103嵌入式操作系統(tǒng) 修改程序,使得taskOne、taskTwo同時(shí)具有最高 優(yōu)先級(jí)運(yùn)行:2021/8/22104嵌入式操作系統(tǒng) 演示結(jié)果2021/8/22105嵌入式操作系統(tǒng) 基于優(yōu)先級(jí)的搶占是任務(wù)調(diào)度的缺陷: 當(dāng)多個(gè)相同優(yōu)先級(jí)的任務(wù)需要共享一臺(tái)處理器 時(shí),如果某個(gè)執(zhí)行的任務(wù)永不阻塞,那么他將一 直獨(dú)占處理器,其它相同優(yōu)先級(jí)的任務(wù)就沒有機(jī) 會(huì)執(zhí)行。2021/8/22106嵌入式操作系統(tǒng)輪轉(zhuǎn)調(diào)度 輪轉(zhuǎn)調(diào)度通常配合基于優(yōu)先級(jí)的搶占式調(diào)度進(jìn)行 輪轉(zhuǎn)調(diào)度:讓優(yōu)先級(jí)相同的、處于就緒態(tài)的任務(wù) 公平地共享CPU 輪轉(zhuǎn)調(diào)度使用時(shí)間片來分配CPU 每個(gè)任務(wù)執(zhí)行一個(gè)預(yù)先確定的時(shí)間段(即時(shí)間 片) 在

41、大多數(shù)系統(tǒng)里,并不一定需要使用輪轉(zhuǎn)調(diào)度算 法。但在相同代碼被多份復(fù)制執(zhí)行時(shí),如在用戶 接口任務(wù)內(nèi)執(zhí)行時(shí),需要使用輪轉(zhuǎn)調(diào)度算法2021/8/22107嵌入式操作系統(tǒng) VxWorks中,調(diào)用函數(shù)中,調(diào)用函數(shù)kernelTimeSlice()來實(shí)現(xiàn)來實(shí)現(xiàn) 輪轉(zhuǎn)調(diào)度 此函數(shù)位于kernelLib庫中 參數(shù)為時(shí)間片的長度(tick數(shù)) (即:在某個(gè)任務(wù)放棄CPU給另一個(gè)同優(yōu)先級(jí) 的任務(wù)之前,系統(tǒng)允許它運(yùn)行的最大時(shí)間長 度) 如kernelTimeSlice(sysClkRateGet()/2)表示時(shí)間 片為0.5秒 kernelTimeSlice(0)關(guān)閉時(shí)間片輪轉(zhuǎn)調(diào)度策關(guān)閉時(shí)間片輪轉(zhuǎn)調(diào)度策 略2021

42、/8/22108嵌入式操作系統(tǒng) 使用輪轉(zhuǎn)調(diào)度算法時(shí),每個(gè)任務(wù)都有一個(gè)運(yùn)行時(shí) 間計(jì)數(shù)器 隨著系統(tǒng)時(shí)鐘增加而增加 達(dá)到規(guī)定的值(時(shí)間片的值)時(shí),清0 此時(shí),任務(wù)放到所在優(yōu)先級(jí)隊(duì)列的尾部 一個(gè)新加入的任務(wù)放在所屬優(yōu)先級(jí)隊(duì)列的尾部,計(jì)數(shù) 器初始為0 當(dāng)任務(wù)被阻塞或者被更高優(yōu)先級(jí)的任務(wù)搶占,將保存 其時(shí)間計(jì)數(shù)值,并且在其重新執(zhí)行時(shí)恢復(fù)計(jì)數(shù)2021/8/22109嵌入式操作系統(tǒng)2021/8/22110嵌入式操作系統(tǒng)應(yīng)用實(shí)例 下面的例子創(chuàng)建三個(gè)優(yōu)先級(jí)相同的任務(wù),分別向 控制臺(tái)輸出他們的任務(wù)id號(hào)和任務(wù)名。 s5_rrsched()調(diào)用調(diào)用kernelTimeSlice()允許系統(tǒng)使用輪轉(zhuǎn)調(diào)允許系統(tǒng)使用輪轉(zhuǎn)調(diào) 度。 本例中使用的時(shí)間片TIMESLICE為1/60秒(函數(shù) sysClkRateGet()返回每秒的時(shí)鐘返回每秒的時(shí)鐘tick數(shù))數(shù)) 在設(shè)置了調(diào)度時(shí)間片后,程序發(fā)起三個(gè)任務(wù),注意: 必須保證發(fā)起的任務(wù)優(yōu)先級(jí)要低于100。 另外為了演示時(shí)間片輪轉(zhuǎn)的效果,要保證任務(wù)具有足 夠的執(zhí)行時(shí)間,在本例中使用一個(gè)循環(huán)次數(shù)為 LONG_TIME的長循環(huán)。的長循環(huán)。2021/8/22111嵌入式操

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論