對於vxworks 的任務建立可以通過呼叫 taskspawn()或是taskinit()/taskactivate()兩種方式,以下就對這兩種方式進行說明。
taskspawn() 實現任務的建立分為兩步:1、分配任務棧的空間,初始化wind_tcb; 2、啟用任務。taskspawn()函式的定義,
int taskspawn (char *name, /*任務名稱必須惟一的標示*/
int priority, /*任務優先順序(0-255)越小標示優先順序越高*/
int options, /*任務選項*/
int stacksize, /*任務棧大小(不包含任務名稱)*/
funcptr entrypt, /*任務入口函式指標*/
int arg1,int arg2, int arg3,int arg4, int arg5, int arg6,int arg7, int arg8, int arg9, int arg10)
函式呼叫成功時,返回新任務的id,或者返回error。
引數options任務選項,可以是以下的標誌組合:
vx_fp_task:標誌浮點暫存器是否屬於上下文,若函式中使用了浮點數,應帶上此標記。
vx_private_env:支援任務私有環境變數。
vx_no_stack_fill:不進行初始任務棧的填充。
vx_unbreakable:任務不允許斷點除錯(忽略斷點)。
vx_dsp_task:dsp 協處理器支援。
vx_altivec_task:altivec 協處理器支援。
引數int型的10個,主要傳入入口函式的引數,若不足10個,後面剩餘的設為0。
taskinit()實現建立任務,必須由taskactivate()來啟用。以下就對這兩個函式進行分解:
status taskinit (wind_tcb* ptcb, /*任務控制塊wind_tcb位址*/
char* name, /*任務名稱必須惟一的標示*/
int priority, /*任務優先順序(0-255)越小標示優先順序越高*/
int options, /*任務選項*/
char* pstackbase, /*任務棧的起始位址*/
int stacksize, /*任務棧大小(不包含任務名稱)*/
funcptr entrypt, /*任務入口函式指標*/
int arg1,int arg2, int arg3,int arg4, int arg5, int arg6,int arg7, int arg8, int arg9, int arg10)
與taskspawn() 相比多了兩個引數wind_tcb*和char* pstackbase,任務控制塊引數由呼叫者分配空間,並由其釋放;而任務棧也也是由除錯者分配與釋放,特別留意的是任務棧的起始位址有兩種可能,地段位址或高階位址,具體由bsp而定。
status taskactivate (int tid) /*tid = (int )ptcb;*/
引數tid是表示惟一的任務id。
其實 taskspawn() 內部呼叫taskinit()/taskactivate()來完成的。或者提供了更為細緻的任務控制而已。而這兩種的建立任務的差別:
1、taskspawn()自動在系統堆上分配任務棧空間,並在任務棧上建立tcb;而taskinit()由呼叫者分配與釋放的,tcb不屬於任務棧的空間。
2、taskspawn()生成任務後進入就緒佇列;而taskinit()生成任務後處於掛起狀態,不能被直接呼叫,直到taskactivate()啟用。
vxworks任務的建立和刪除
任務的建立,暫停,恢復以及刪除 設定 任務鉤子 用以觀察任務的建立和刪除 程式建立了2個任務 taska與taskb,優先順序分別為125和130 由於vxworks的優先順序從高到低為0 255,因此task1會優先執行。taska中的i 2時,taskb將暫停,taska迴圈結束後,taskb恢...
VxWorks的任務與任務排程
作為實時作業系統,任務排程是基於優先順序的,且可搶占式的排程方式。同時對於相同優先順序的任務,支援round robin迴圈排程方式 以下簡稱rr排程 vxworks核心三個佇列 tick 佇列,ready 佇列,active 佇列,另外還有乙個佇列涉及到任務,即任務等待資源時所處的佇列,這個佇列可...
VxWorks 任務使用的學習
對任務的操作使用tasklib 中的庫函式,需要包含的標頭檔案為 tasklib.h.此外,經常使用的庫還有taskinfo,主要包括的是獲得任務資訊的庫的數。需要包含的標頭檔案為 tasklib.h.涉及的函式為 tasknametoid0,即從任務的任務名獲得對應的id號。在任務延遲時還需要和系...