溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

VxWorks系統(tǒng)里如何創(chuàng)建任務(wù)

發(fā)布時間:2021-12-22 09:55:26 來源:億速云 閱讀:409 作者:小新 欄目:互聯(lián)網(wǎng)科技

這篇文章主要介紹VxWorks系統(tǒng)里如何創(chuàng)建任務(wù),文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

VxWorks系統(tǒng)里如何創(chuàng)建任務(wù)。

常用的函數(shù)是taskSpawn(),32位系統(tǒng)里(以下同)函數(shù)原型如下:

VxWorks系統(tǒng)里如何創(chuàng)建任務(wù)

Task可以看作是Stack和TCB組成的。因此taskSpawn()的第一步就是為Stack和TCB分配內(nèi)存,然后初始化它們,最后將這個任務(wù)放入Ready隊列。

VxWorks系統(tǒng)里如何創(chuàng)建任務(wù)

這個函數(shù)的參數(shù)比較多,我們挨個看一下

name

任務(wù)的名字,主要只是開發(fā)者在Shell中調(diào)試時才使用它。名字中的字符和長度沒有什么限制,甚至可以直接使用NULL,那么系統(tǒng)會自動給它分配為tNN是從1開始遞增的十進(jìn)制數(shù)。甚至不同任務(wù)的名字可以是相同的,所以通過名字來管理任務(wù)的話,要注意一下。而操作系統(tǒng)或應(yīng)用程序在管理任務(wù)時,通常使用的是它們的ID。名字和ID可以通過這兩個函數(shù)互相轉(zhuǎn)換

VxWorks系統(tǒng)里如何創(chuàng)建任務(wù)

priority

任務(wù)的優(yōu)先級,VxWorks調(diào)度任務(wù)時就是基于它。優(yōu)先級的取值范圍是0-255,可以動態(tài)改變或查詢

VxWorks系統(tǒng)里如何創(chuàng)建任務(wù)

注意:多個任務(wù)間,優(yōu)先級的高低是相對的。假如系統(tǒng)里只有兩個任務(wù)A和B,優(yōu)先級分別是1和10,或者分別是1和100,這兩種情況下的調(diào)度是一模一樣的。都是高優(yōu)先級的會搶占,必須等它退出Ready隊列,低優(yōu)先級的才有可能占用CPU。不像有的操作系統(tǒng)采用分時調(diào)度,優(yōu)先級的高低會影響時間片的長短。

那在我們自己的應(yīng)用程序里,優(yōu)先級設(shè)置為多少合適呢?很多人習(xí)慣于將內(nèi)核任務(wù)設(shè)置為100,用戶態(tài)任務(wù)的稍低一些,150或200,這個并沒有什么限制,只要平衡好多個應(yīng)用任務(wù)之間的關(guān)系即可。不過建議應(yīng)用任務(wù)的優(yōu)先級不要高于系統(tǒng)任務(wù)的。例如,在《Task之常見系統(tǒng)任務(wù)》里,我們提到過WDB任務(wù)的優(yōu)先級默認(rèn)為3,所以我們應(yīng)用任務(wù)盡量不要高于4,否則可能會影響到調(diào)試了。

options

任務(wù)選項,以Bit為單位,每個版本的選項不盡相同,因此代碼中盡量使用選項的宏定義,而不要使用對應(yīng)的數(shù)值。例如6.9里可用的選項如下。

lVX_FP_TASK - 使用浮點協(xié)處理器,否則含有浮點操作的任務(wù)在切換時不會保存浮點寄存器的值,導(dǎo)致浮點異常。特例是C++語句被編譯后,會產(chǎn)生浮點指令,因此任務(wù)中調(diào)用C++語句時,就一定要使能這個選項

lVX_NO_STACK_FILL - 不填充Stack

lVX_NO_STACK_PROTECT - 不提供Stack的上溢和下溢保護(hù)

lVX_ALTIVEC_TASK - 使用Altivec指令集(僅PowerPC)

lVX_SPE_TASK - 使用SPE引擎(僅PowerPC)

lVX_DSP_TASK - 使用DSP(僅SuperH )

lVX_PRIVATE_ENV - 支持私有環(huán)境變量(6.9中實際已取消,僅是為了兼容)

stackSize

任務(wù)的棧,單位是Byte,從系統(tǒng)內(nèi)存池分配。一經(jīng)分配,尺寸就固定不變了。如果分配的數(shù)值過大,就會增加一點點初始化時間,并浪費(fèi)部分內(nèi)存空間,影響倒是不大;而分配的過小,就有棧溢出的風(fēng)險,這可是致命的了。因此,開發(fā)過程中,要評估一下具體的數(shù)值。那如何才能知道分配的是否合適呢?可以在Shell里使用checkStack()來檢查。

VxWorks系統(tǒng)里如何創(chuàng)建任務(wù)

VxWorks系統(tǒng)里如何創(chuàng)建任務(wù)

entryPt

任務(wù)主函數(shù)的入口地址,最多可以包含10個int型參數(shù),arg1- arg10。

返回值

taskSpawn()的返回值就是Kernel分配給任務(wù)的ID,它是一個32Bit的數(shù)值,是全局唯一的。不過任務(wù)退出后,這個ID值是可以再次分配給其它任務(wù)的,也就是可以重復(fù)使用的。任務(wù)可以通過taskIdSelf()查詢自己的ID,通過taskIdVerify()驗證某任務(wù)是否存在,通過taskIdListGet()獲取當(dāng)前的任務(wù)列表。taskLib中很多API使用task ID為參數(shù),這個參數(shù)取值為  0  的話,一般就是表示當(dāng)前任務(wù)自己了。

VxWorks系統(tǒng)里如何創(chuàng)建任務(wù)

另外,創(chuàng)建任務(wù)還可以使用taskCreate(),它只是初始化任務(wù),需要taskActivate()把它放到Ready隊列。

VxWorks系統(tǒng)里如何創(chuàng)建任務(wù)

這樣分成兩步做的好處就是可以在整個系統(tǒng)初始化時就把任務(wù)也初始化好,需要使用的時候,再進(jìn)行激活,相當(dāng)于減少了激活時間。其實  taskSpawn()  就是它倆的合成

VxWorks系統(tǒng)里如何創(chuàng)建任務(wù)

taskSpawn()  中初始化  Stack  和  TCB  的操作就是在  taskCreate()  中完成的,下圖是很多年前的一段  Benchmark  數(shù)據(jù)

VxWorks系統(tǒng)里如何創(chuàng)建任務(wù)

可以看到在當(dāng)時的軟硬件  (Pentium3)  配置下,  Kernel  操作的耗時一般都是微秒級的,但是  taskSpawn()  比其它函數(shù)要慢很多。因此,當(dāng)項目的實時性需求非常高時,可以考慮使用  taskCreate()  和  taskActivate()  的組合。
還有一個POSIX風(fēng)格的API可以用來創(chuàng)建任務(wù)或者獲得任務(wù)句柄,taskOpen()。這個函數(shù)多數(shù)是在支持進(jìn)程時使用,因為它可以把任務(wù)創(chuàng)建為公共對象,以便于多進(jìn)程與Kernel間相互訪問。我們在介紹RTP通信時,再詳細(xì)介紹它

VxWorks系統(tǒng)里如何創(chuàng)建任務(wù)

以上是“VxWorks系統(tǒng)里如何創(chuàng)建任務(wù)”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI