中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

VxWorks系統里如何創建任務

發布時間:2021-12-22 09:55:26 來源:億速云 閱讀:428 作者:小新 欄目:互聯網科技

這篇文章主要介紹VxWorks系統里如何創建任務,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

VxWorks系統里如何創建任務。

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

VxWorks系統里如何創建任務

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

VxWorks系統里如何創建任務

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

name

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

VxWorks系統里如何創建任務

priority

任務的優先級,VxWorks調度任務時就是基于它。優先級的取值范圍是0-255,可以動態改變或查詢

VxWorks系統里如何創建任務

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

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

options

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

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

lVX_NO_STACK_FILL - 不填充Stack

lVX_NO_STACK_PROTECT - 不提供Stack的上溢和下溢保護

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

lVX_SPE_TASK - 使用SPE引擎(僅PowerPC)

lVX_DSP_TASK - 使用DSP(僅SuperH )

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

stackSize

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

VxWorks系統里如何創建任務

VxWorks系統里如何創建任務

entryPt

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

返回值

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

VxWorks系統里如何創建任務

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

VxWorks系統里如何創建任務

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

VxWorks系統里如何創建任務

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

VxWorks系統里如何創建任務

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

VxWorks系統里如何創建任務

以上是“VxWorks系統里如何創建任務”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

务川| 雷州市| 彰化县| 惠来县| 中宁县| 灵寿县| 新宾| 昌黎县| 灵武市| 弥勒县| 陆川县| 周宁县| 福建省| 观塘区| 郁南县| 明水县| 美姑县| 龙井市| 富宁县| 闻喜县| 万安县| 堆龙德庆县| 连平县| 耿马| 锡林郭勒盟| 勃利县| 姜堰市| 淮阳县| 资源县| 九龙坡区| 通州区| 资讯| 胶州市| 娄烦县| 平遥县| 格尔木市| 盐津县| 凤台县| 垣曲县| 佛冈县| 绥滨县|