您好,登錄后才能下訂單哦!
小編給大家分享一下vxworks中如何控制任務,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
任務被taskSpawn()創建或taskActivate()激活后,直接進入Ready隊列。但實際運行時,任務大部分時間處于其它狀態,并不是Ready態,不然CPU的占用率就很高了,功耗也就上去了,那肯定是軟件架構的設計出問題了。
VxWorks的taskLib庫里關于控制任務狀態的一些函數
taskSuspend()是將任務放到Suspend隊列,taskResume()是將任務放到Ready隊列,這兩個API通常只是在調試時才會使用。taskSuspend(0)就是掛起任務本身,就像我們在《Task之常見系統任務》里觀察tRootTask時所作的。不過taskResume(0)就是無效操作了,想想為啥?
taskRestart()的主要作用是重啟發生嚴重錯誤的任務。既然它只有一個參數,說明重啟的任務使用的是原有的屬性,包括ID、優先級、選項、入口地址、棧尺寸。其中優先級和選項可能被動態改變過,那就使用最新的值。
taskDelay()通常用在輪詢操作之中,它會讓當前任務進入Delay隊列,期限到時之后,再返回Ready隊列中同優先級任務的尾部。其參數單位是tick,也就是系統時鐘的頻率。例如delay兩秒,通常這樣寫:
sysClkRateGet()的作用就是返回系統時鐘每秒鐘的tick數。每個VxWorks版本的系統時鐘頻率默認都是60,但taskDelay(120),不一定是Delay兩秒。因為可以通過sysClkRateSet()修改時鐘頻率
要注意的是,每個tick到來時,都會觸發系統時鐘中斷,所以不建議把系統時鐘頻率設置得太快,否則會降低系統性能。
taskDelay()的參數是整型值,所以使用時要注意整除的問題。例如,使用默認的系統時鐘頻率時,就不可能精確延時1/7秒。
sysClkRateGet()/7 = 60/7 = 8,8個tick,只是8/60秒了。
當taskDelay()的參數為0時,任務并不會進入Delay狀態,而是直接把CPU讓給同優先級的任務(如果有的話),自己排到同優先級任務的尾部,這就相當于Linux系統的sched_yield()操作。
我們在《Task之任務的創建》里提到過,使用taskPriorityGet()/taskPrioritySet(),可以查詢/調整任務的優先級。另外還有幾個API可以查詢任務的狀態信息
從名字就可以看出來taskInfoGet()最為強大,它可以獲得TCB里的大部分信息
以上是“vxworks中如何控制任務”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。