VWorks 操作系統(tǒng)學(xué)習(xí)筆記_第1頁
VWorks 操作系統(tǒng)學(xué)習(xí)筆記_第2頁
VWorks 操作系統(tǒng)學(xué)習(xí)筆記_第3頁
VWorks 操作系統(tǒng)學(xué)習(xí)筆記_第4頁
VWorks 操作系統(tǒng)學(xué)習(xí)筆記_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、VxWorks操作系統(tǒng)學(xué)習(xí)筆記1. VxWorks 任務(wù)任務(wù):在執(zhí)行時(shí)每個(gè)程序都被稱之為任務(wù)。VxWorks操作系統(tǒng)中,任務(wù)可以直接地或者以 共享方式訪問大多數(shù)系統(tǒng)資源,為了維護(hù)各自的線程,每個(gè)任務(wù)必須保持有足夠的上下文環(huán) 境。(1) 任務(wù)狀態(tài):就緒(READY):該狀態(tài)時(shí)任務(wù)僅等待CPU的狀態(tài),不等待其他任何資源。阻塞(PEND):任務(wù)由于一些資源不可用而被阻塞時(shí)的狀態(tài)。睡眠(DELAY):出于睡眠的任務(wù)狀態(tài)。掛起(SUSPEND):該狀態(tài)時(shí)任務(wù)不執(zhí)行,主要用于調(diào)試用。掛起僅僅約束任務(wù)的執(zhí)行,并 不約束狀態(tài)的轉(zhuǎn)換,因此pended-suspended狀態(tài)時(shí)任務(wù)可以解鎖,delayed-sus

2、pended狀 態(tài)時(shí)任務(wù)可以喚醒。DELAY+S:既處于睡眠又處于掛起的任務(wù)狀態(tài)。PEND+S:既處于阻塞又處于掛起的任務(wù)狀態(tài)。PEND+T:帶有超時(shí)值處于阻塞的任務(wù)狀態(tài)。PEND+S+T:帶有超時(shí)值處于阻塞,同時(shí)又處于掛起的任務(wù)狀態(tài)。 state+I:任務(wù)處于state且?guī)в幸粋€(gè)繼承優(yōu)先級。ready | | pended| semTake () / msgQReceive () |ready | | delayed| taskDelay ()|ready | | suspended| taskSuspend ()|pended | | ready| semGive () / msgQSen

3、d ()|pended | | suspended| taskSuspend ()|delayed | | ready| expired delay|delayed | | suspended| taskSuspend ()|suspended | | ready| taskResume () / taskActivate () |suspended | | pended| taskResume ()|suspended | | delayed| taskResume()|(2) Wind 任務(wù)調(diào)度在 Wind 內(nèi)核中,默認(rèn)算法是基于優(yōu)先級的搶占式調(diào)度算法,也可以使用輪轉(zhuǎn)調(diào)度算法 任務(wù)調(diào)度控制

4、函數(shù):| 調(diào)用 | 描述| kernelTimeSlice() | kernelTimeSlice() |控制輪轉(zhuǎn)調(diào)度改變?nèi)蝿?wù)優(yōu)先級 禁止任務(wù)調(diào)度 允許任務(wù)調(diào)度改變?nèi)蝿?wù)優(yōu)先級 禁止任務(wù)調(diào)度 允許任務(wù)調(diào)度| taskPrioritySet() | taskLock() | taskUnlock() |基于優(yōu)先級的搶占式任務(wù)調(diào)度: 當(dāng)一個(gè)新任務(wù)優(yōu)先級高于系統(tǒng)當(dāng)前執(zhí)行任務(wù)的優(yōu)先級時(shí),它將搶占 CPU 執(zhí)行。因此,系統(tǒng) 內(nèi)核將確保CPU分配給處于就緒狀態(tài)的具有最高優(yōu)先級的任務(wù)執(zhí)行。缺點(diǎn):當(dāng)多個(gè)相同優(yōu)先級的任務(wù)需要共享一臺處理器時(shí),如果某個(gè)執(zhí)行的任務(wù)永不阻塞,那 么它將一直獨(dú)占處理器,其他相同優(yōu)先級的任

5、務(wù)就沒有機(jī)會執(zhí)行。輪轉(zhuǎn)式調(diào)度:當(dāng)所有相同優(yōu)先級的任務(wù)處于就緒狀態(tài)時(shí),輪轉(zhuǎn)算法傾向于平均使用CPU,對于所有相同 優(yōu)先級的任務(wù),通過時(shí)間片獲得相同的CPU處理時(shí)間。搶占上鎖:通過調(diào)用taskLock()和taskUnlock()函數(shù),可以禁止使用Wind內(nèi)核調(diào)度程序或啟用Wind 內(nèi)核調(diào)度程序。當(dāng)禁止使用調(diào)度程序時(shí),若該任務(wù)正在執(zhí)行,不會發(fā)生基于優(yōu)先級的搶占。 搶占上鎖只能阻止任務(wù)的上下文切換,并不禁止中斷。taskLock()和 intLock()比較任務(wù)優(yōu)先級:所有應(yīng)用任務(wù)的優(yōu)先級應(yīng)該在 100-250 之間;但是驅(qū)動(dòng)程序支持的任務(wù)(與 中斷服務(wù)程序關(guān)聯(lián)的任務(wù))優(yōu)先級能夠位于51-99。任務(wù)

6、異常處理:共享代碼和重入VxWorks操作系統(tǒng)中,大多數(shù)函數(shù)是可重入的。但若存在一個(gè)對應(yīng)于命名為someName_r() 的函數(shù), someName() 因作為函數(shù)重入的版本將認(rèn)為是不可重入的。例如, ldiv() 有一個(gè)對 應(yīng)函數(shù)ldiv_r(),貝Ildiv()是不可重入的。重入技術(shù):. 動(dòng)態(tài)堆棧變量. 被信號保護(hù)的全局和靜態(tài)變量.任務(wù)變量:taskVarAdd(), taskVarDelete()和 taskVarGet()操作系統(tǒng)任務(wù) VxWorks.tUserRoot:內(nèi)核執(zhí)行的首個(gè)任務(wù),入口點(diǎn)是安裝目錄/target/config/all/usrConfig.c下函 數(shù)usrRoo

7、t(),可初始化VxWorks操作系統(tǒng)的大部分程序,發(fā)起諸如日志任務(wù)、異常處理任 務(wù)、網(wǎng)絡(luò)任務(wù)和 tRlogind 后臺程序。正常情況下根任務(wù)在所有初始化結(jié)束后,終止任務(wù)并 且被刪除。.tLogTask:日志任務(wù).tExcTask異常處理任務(wù),必須擁有系統(tǒng)的最高優(yōu)先級。.tNetTask:網(wǎng)絡(luò)任務(wù),用于VxWorks網(wǎng)絡(luò)任務(wù)級程序處理。通常配置INCLUDE_NET_LIB 組件的VxWorks操作系統(tǒng)可以發(fā)起網(wǎng)絡(luò)任務(wù)。.tWdbTask:目標(biāo)代理任務(wù),用INCLUDE_WDB組件配置的VxWorks操作系統(tǒng)包括目標(biāo)代 理功能。. 可選組建的任務(wù). tShell. tRlogind. tTel

8、netd. tPortmapd2. 任務(wù)間通信(1) 共享內(nèi)存,數(shù)據(jù)的簡單共享在 VxWorks 操作系統(tǒng)中所有任務(wù)存在于一個(gè)單獨(dú)的線性地址空間中,所以任務(wù)間共享數(shù)據(jù) 結(jié)構(gòu)是很容易實(shí)現(xiàn)的。全局變量、線性緩沖、環(huán)形緩沖、連接鏈和指針都可以被運(yùn)行在不同 上下文中的代碼直接引用。(2) 信號量,基本的互斥和同步. 實(shí)現(xiàn)資源互斥訪問的方法包括: 中斷上鎖(中斷上鎖時(shí)不要調(diào)用 VxWorks 操作系統(tǒng)函數(shù),強(qiáng)行使用會導(dǎo)致意外的中斷): intLock() 和 intUnlock()搶占上鎖:taskLock()和 taskUnlock()信號量對資源的上鎖. VxWorks 操作系統(tǒng)中的信號量類型 二進(jìn)

9、制,最快最通用的信號量,適用于同步和互斥。互斥,為解決內(nèi)在互斥問題、優(yōu)先級繼承、刪除安全以及遞歸問題等而最優(yōu)化的一種特殊二 進(jìn)制信號量。計(jì)數(shù),類似于二進(jìn)制信號量,但其跟蹤信號量被釋放的次數(shù),適用于單個(gè)資源多個(gè)實(shí)例需要 保護(hù)的情況。. 隊(duì)列類型:SEM_Q_PRIORITY:根據(jù)優(yōu)先級順序SEM_Q_FIFO :根據(jù)先進(jìn)先出順序. 二進(jìn)制信號量B-Semaphore.png. 互斥信號量基本行為與二進(jìn)制信號量一致,不同之處如下:僅用于互斥;僅能由提取它(即調(diào)用semTake()的任務(wù)釋放;不能在中斷服務(wù)程序中釋放;semFlush()函數(shù)操作非法;.優(yōu)先級倒置:互斥信號量選項(xiàng)SEM_INVERS

10、ION_SAF能夠繼承優(yōu)先級算法,優(yōu)先級 繼承協(xié)議確保在資源阻塞的所有任務(wù)中優(yōu)先級最高的且擁有資源執(zhí)行資格的任務(wù)將優(yōu)先執(zhí) 行。一旦任務(wù)的優(yōu)先級被提高,它以提高后的優(yōu)先級執(zhí)行;直到釋放其占有的全部互斥信號 量后, 該任務(wù)將返回到正?;蛘邩?biāo)準(zhǔn)的優(yōu)先級。該選項(xiàng)要求與優(yōu)先級隊(duì)列(SEM_Q_PRIORITY) 一起使用。. 刪除安全:一個(gè)受信號量保護(hù)的臨界區(qū)域內(nèi)經(jīng)常需要保護(hù)執(zhí)行任務(wù)避免被意外地刪 除。刪除一個(gè)在臨界區(qū)執(zhí)行的任務(wù)可能會導(dǎo)致意想不到的后果。原語semSafe()和sem Un safe()提供了一種任務(wù)安全的方法。但是在使用互斥信號量選項(xiàng)SEM_DELETE_SAFE 時(shí),每次使用semT

11、ake(將隱含調(diào)用taskSafe(),使用semGive()將隱含調(diào)用taskUnsafe()。 使用這種方式,任務(wù)在占用信號量時(shí)不會被刪除。. 遞歸資源訪問:互斥信號量能夠遞歸獲得。在釋放信號量前,遞歸獲取的互斥信號 量被釋放和提取的次數(shù)應(yīng)該相等,這通過一個(gè)計(jì)數(shù)器跟蹤實(shí)現(xiàn)。. 計(jì)數(shù)器信號量是實(shí)現(xiàn)任務(wù)同步和互斥的另一種手段,適用于保護(hù)多份復(fù)制的資源。(3) 消息隊(duì)列在 VxWorks 操作系統(tǒng)里,單個(gè) CPU 里任務(wù)間的主要通信方式使用消息隊(duì)列。| 調(diào)用 | 描述 | msgQCreate()| 分配并初始化一個(gè)消息隊(duì)列 | TOC o 1-5 h z | msgQDelete()| 終止并

12、釋放一個(gè)消息隊(duì)列| msgQSend()| 向一個(gè)消息隊(duì)列發(fā)送消息| msgQReceive()| 從一個(gè)消息隊(duì)列接收消息|消息的優(yōu)先級:MSG_PRI_NORMAL和 MSG_PRI_URGENT中斷服務(wù)程序能夠向消息管道中寫入,但不能從消息管道中讀取。(4) 管道管道使用 VxWorks 操作系統(tǒng)中的 I/O 系統(tǒng),并提供替換消息隊(duì)列的接口。管道是由驅(qū)動(dòng)程 序 pipeDrv 管理的虛擬 I/O 設(shè)備,任務(wù)能夠使用標(biāo)準(zhǔn) I/O 對管道進(jìn)行打開、讀取或?qū)懭氲?操作,另外也可以調(diào)用函數(shù) ioctl。與消息管道類似,中斷服務(wù)程序能夠向管道寫入,但不能從管道讀取。(5) 任務(wù)間網(wǎng)絡(luò)通信套接字 So

13、ckets遠(yuǎn)程程序調(diào)用RPC(6) 信號VxWorks 支持軟件信號功能。信號可以異步改變?nèi)蝿?wù)的控制流程。任何任務(wù)或中斷服務(wù)程 序可以向指定任務(wù)發(fā)送信號。接收到信號的任務(wù)立即掛起當(dāng)前的執(zhí)行線程,在下次調(diào)度執(zhí)行 時(shí)轉(zhuǎn)而執(zhí)行指定的信號處理程序。信號處理程序在接收任務(wù)的上下文中執(zhí)行,并使用任務(wù)的 堆棧。即使在任務(wù)被阻塞時(shí),仍可調(diào)用信號處理程序。通常信號處理程序可作為中斷處理程序看待,任何導(dǎo)致調(diào)用程序阻塞的函數(shù)均不能在信號處 理程序中調(diào)用。Wind內(nèi)核支持兩種類型的信號接口: UNIX BSD風(fēng)格的信號和POSIX兼容信號。為了簡化 設(shè)計(jì),建議在一個(gè)應(yīng)用程序中使用一種類型接口,不要混合使用不同接口?;?/p>

14、本信號函數(shù):I POSIX 1003.1b兼容調(diào)用IUNIX BSD兼容調(diào)用 丨 描述I| signal() | signal() | 指定信號的處理程序 |kill() |kill() |向任務(wù)發(fā)送信號|raise() |N/A| 向自身發(fā)送信號|sigaction() |sigvec()| 檢查或設(shè)置信號的處理程序 |sigsuspend()| pause()| 掛起任務(wù)直至任務(wù)提交|sigpending()| N/A| 恢復(fù)一組用于傳遞而被阻塞的信sigemptyset() - | | |sigfillset() |sigaddset() | sigsetmask() | 設(shè)置信號屏蔽|

15、sigdelset() |sigismember() - | sigprocmask() | sigsetmask() | 設(shè)置阻塞信號的屏蔽 | sigprocmask() | sigblock() | 增加到一組阻塞的信號中 |信號發(fā)生通常與硬件中斷相聯(lián)系。例如總線出錯(cuò)、非法指令以及浮點(diǎn)數(shù)異常都可能產(chǎn)生某種 信號。3.事件 VxWorksVxWorks事件是一種在任務(wù)和中斷處理程序間,或任務(wù)和VxWorks結(jié)構(gòu)體間的通信方式。 在 VxWorks 事件上下文中,這些結(jié)構(gòu)體被用作為資源,包括信號量和消息隊(duì)列。只有任務(wù) 能夠接收事件;然而任務(wù)、中斷處理程序或資源都可以發(fā)送事件。事件 psos.

16、 發(fā)送和接收事件任務(wù)、中斷服務(wù)程序以及資源都使用同一個(gè)應(yīng)用編程接口 ev_se nd()來發(fā)送事件。對于從資源接收事件的任務(wù)來說,任務(wù)必須用資源寄存,而且請求資源在空閑時(shí)發(fā)送一系列 指定的事件;這種資源可以使信號量,也可以是消息隊(duì)列。. 等待事件任務(wù)能夠從一個(gè)或多個(gè)資源等待多個(gè)事件。每個(gè)資源可以發(fā)送多個(gè)事件,同樣任務(wù)也可以等 待接收一個(gè)或多個(gè)事件。. 事件的寄存 從資源接收事件時(shí),資源只能寄存一個(gè)任務(wù)。如果另一個(gè)任務(wù)隨后用同樣的資源寄存,那么 不會通知原先寄存的任務(wù)就自動(dòng)解除原有的寄存oVxWorks事件寄存的處理與pPOS事件則 不同。. 空閑資源 當(dāng)資源給任務(wù)發(fā)送事件表明空閑時(shí),不意味著資

17、源的空閑狀態(tài)可以保留。因此,從資源等待 事件的任務(wù)在資源空閑時(shí)被解除阻塞;但同時(shí)資源也可能被取走。對于兩個(gè)或兩個(gè)以上的任務(wù)持續(xù)交換資源所有權(quán)的情況,資源雖然被釋放,但并不處于空閑 狀態(tài),所以資源將不會發(fā)送事件。描述. 應(yīng)用編程接口描述| 函數(shù)| ev_send() | 給任務(wù)發(fā)送事件| ev_receive() | 等待事件 | sm_notify() | 寄存一個(gè)被信號量告知可用的任務(wù) | q_notify() | 寄存一個(gè)被消息隊(duì)列告知有消息到來的任務(wù) | q_vnoify | 寄存一個(gè)被可變長度的消息隊(duì)列告知有消息到來的任務(wù) |事件 VxWorksVxWorks事件執(zhí)行以pPOS事件為基

18、石。. 空閑資源定義 互斥信號量:當(dāng)一個(gè)互斥信號量被釋放并且在其上沒有任務(wù)阻塞 二進(jìn)制信號量:當(dāng)沒有任務(wù)占有或等待一個(gè)二進(jìn)制信號量 計(jì)數(shù)器信號量:一個(gè)計(jì)數(shù)器信號量在其計(jì)數(shù)值非零且其上沒有阻塞任務(wù)時(shí) 消息隊(duì)列:隊(duì)列中有消息存在,且沒有等待該隊(duì)列中消息而阻塞的任務(wù). VxWorks 對 pPOS 事件的擴(kuò)展單任務(wù)資源寄存:在pPOS系統(tǒng)中一個(gè)任務(wù)用資源寄存發(fā)送pSOS事件時(shí),它會無意地 取消另一個(gè)已用該資源寄存的任務(wù)寄存,第一個(gè)用該資源寄存的任務(wù)將無限期地被阻止。 VxWorks 事件則提供了一個(gè)選項(xiàng),在該選項(xiàng)中如果另一個(gè)任務(wù)已經(jīng)用某個(gè)資源寄存了,則 不允許第二個(gè)任務(wù)用該資源再寄存。如果第二個(gè)任務(wù)

19、用該資源寄存,將返回一個(gè)錯(cuò)誤。立即發(fā)送選項(xiàng):當(dāng)一個(gè)pPOS任務(wù)用資源寄存時(shí),即使寄存時(shí)資源處于空閑狀態(tài),也不 會立即給任務(wù)發(fā)送時(shí)間。對于VxWorks事件,默認(rèn)行為與之相同。然而,VxWorks事件提 供了一個(gè)選項(xiàng),即若該資源在寄存時(shí)處于空閑狀態(tài),該選項(xiàng)允許任務(wù)請求資源立即給其發(fā)送 事件。自動(dòng)取消寄存選項(xiàng): pPOS 執(zhí)行過程序要任務(wù)在從資源接收任務(wù)后明確地取消寄存。 VxWorks 執(zhí)行提供一個(gè)選項(xiàng),該選項(xiàng)可以通知資源僅發(fā)送一次事件,然后在發(fā)送后自動(dòng)取 消寄存。自動(dòng)解除資源堵塞:當(dāng)刪除資源(一個(gè)信號量或者消息隊(duì)列時(shí)),調(diào)用函數(shù)semDelete() 和msgQDelete()解除所有任務(wù)的掛

20、起。在任務(wù)等待被刪除資源發(fā)送事件時(shí),該措施保護(hù)任 務(wù)避免無限期地堵塞。然后任務(wù)繼續(xù)執(zhí)行,導(dǎo)致任務(wù)掛起的函數(shù)eventReceive()返回一個(gè) ERROR 值。事件 25 到 32(VXEV25 或 0 x01000000 到 VXEV32 或 0 x80000000)用作系統(tǒng)保留用,V xWorks 用戶不可以使用這些事件。比較 API TOC o 1-5 h z | VxWorks函數(shù)| pPOS函數(shù)|注釋| eventSend | ev_send| 直接端口| eventReceive | ev_receive | 直接端口| even tClear| VxWorks 中的新功能|sem

21、EvStart | sm_notify | SemEvStart 等價(jià)于用非零事件參數(shù)調(diào)用 sm_notify | semEvStop | sm_notify | SemEvStop 等價(jià)于用事件參數(shù)為 0 調(diào)用 sm_notify | | msgQEvStart | q_vnotify | msgQEvStart 等價(jià)于用非零事件參數(shù)調(diào)用 q_notify | | msgQEvStop | q_vnotify | msgQEvStop 等價(jià)于用事件參數(shù)為 0 調(diào)用 q_notify | | | q_notify | VxWorks 沒有一個(gè)固定長度的消息隊(duì)列機(jī)制 |4. 看門狗定時(shí)器VxWo

22、rks 包括一個(gè)看門狗定時(shí)器機(jī)制,允許任何 C 函數(shù)與一個(gè)特定的時(shí)間延時(shí)器聯(lián)系???門狗定時(shí)器作為系統(tǒng)時(shí)鐘中斷服務(wù)程序的一部分來維護(hù)。被看門狗定時(shí)器調(diào)用的函數(shù)通常作 為系統(tǒng)時(shí)鐘中斷級的中斷服務(wù)代碼來執(zhí)行。但如果內(nèi)核由于某種原因不能立即執(zhí)行能夠函數(shù)(例如一個(gè)優(yōu)先中斷或者內(nèi)核狀態(tài)),函數(shù)將放在tExcTask工作隊(duì)列中。tExcTask工作隊(duì)列 中的函數(shù)以tExcTask (通常是0)優(yōu)先級來執(zhí)行。| 調(diào)用 | 描述 | TOC o 1-5 h z | wdCreate() | 分配并初始化一個(gè)看門狗定時(shí)器| wdDelete() | 終止并釋放一個(gè)看門狗定時(shí)器| wdStart() | 啟動(dòng)一個(gè)看門狗定時(shí)器| wdCancel() | 取消當(dāng)前的一個(gè)計(jì)數(shù)的看門狗定時(shí)器|5. 中斷服務(wù)代碼為了盡快地響應(yīng)中斷, VxWorks 中斷處理程序在所有任務(wù)上下文之外的一個(gè)特殊上下文內(nèi) 執(zhí)行。因此,中斷處理不涉及到任務(wù)上下文的切換。| 調(diào)用 | 描述 | TOC o 1-5 h z | intConnect() | 設(shè)置中斷處理的 C 程序| intContext() | 如果是從中斷級調(diào)用,返回真 | | intCount() | 獲得當(dāng)前中斷嵌套深度| intLevelSet() | 設(shè)置處

溫馨提示

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

評論

0/150

提交評論