日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UCOSIIIAPI函数接口OSTaskCreate();函数

發布時間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UCOSIIIAPI函数接口OSTaskCreate();函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

任務的創建和刪除實驗
uCOSIII是多任務系統,那么肯定要創建任務,創建任務就是將任務控制塊、任務堆棧、任務代碼等聯系在一起,并且初始化任務控制塊的相應字段。在UCOSIII中我們通過函數OSTaskCreate ();來創建任務,OSTaskCreate();函數原型如下(在os_task.c中有定義)。電泳OSTaskCreate ();創建一個任務之后,剛創建的任務就會進入就緒狀態,注意!不能夠在中斷服務程序中調用OSTaskCreate ();函數創建任務。

void OSTaskCreate (OS_TCB *p_tcb,CPU_CHAR *p_name,OS_TASK_PTR p_task,void *p_arg,OS_PRIO prio,CPU_STK *p_stk_base,CPU_STK_SIZE stk_limit,CPU_STK_SIZE stk_size,OS_MSG_QTY q_size,OS_TICK time_quanta,void *p_ext,OS_OPT opt,OS_ERR *p_err) {CPU_STK_SIZE i; #if OS_CFG_TASK_REG_TBL_SIZE > 0uOS_REG_ID reg_nbr; #endif #if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)OS_TLS_ID id; #endifCPU_STK *p_sp;CPU_STK *p_stk_limit;CPU_SR_ALLOC();#ifdef OS_SAFETY_CRITICALif (p_err == (OS_ERR *)0) {OS_SAFETY_CRITICAL_EXCEPTION();return;} #endif#ifdef OS_SAFETY_CRITICAL_IEC61508if (OSSafetyCriticalStartFlag == DEF_TRUE) {*p_err = OS_ERR_ILLEGAL_CREATE_RUN_TIME;return;} #endif#if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0uif (OSIntNestingCtr > (OS_NESTING_CTR)0) { /* ---------- CANNOT CREATE A TASK FROM AN ISR ---------- */*p_err = OS_ERR_TASK_CREATE_ISR;return;} #endif#if OS_CFG_ARG_CHK_EN > 0u /* ---------------- VALIDATE ARGUMENTS ------------------ */if (p_tcb == (OS_TCB *)0) { /* User must supply a valid OS_TCB */*p_err = OS_ERR_TCB_INVALID;return;}if (p_task == (OS_TASK_PTR)0) { /* User must supply a valid task */*p_err = OS_ERR_TASK_INVALID;return;}if (p_stk_base == (CPU_STK *)0) { /* User must supply a valid stack base address */*p_err = OS_ERR_STK_INVALID;return;}if (stk_size < OSCfg_StkSizeMin) { /* User must supply a valid minimum stack size */*p_err = OS_ERR_STK_SIZE_INVALID;return;}if (stk_limit >= stk_size) { /* User must supply a valid stack limit */*p_err = OS_ERR_STK_LIMIT_INVALID;return;}if (prio >= OS_CFG_PRIO_MAX) { /* Priority must be within 0 and OS_CFG_PRIO_MAX-1 */*p_err = OS_ERR_PRIO_INVALID;return;} #endif#if OS_CFG_ISR_POST_DEFERRED_EN > 0uif (prio == (OS_PRIO)0) {if (p_tcb != &OSIntQTaskTCB) {*p_err = OS_ERR_PRIO_INVALID; /* Not allowed to use priority 0 */return;}} #endifif (prio == (OS_CFG_PRIO_MAX - 1u)) {if (p_tcb != &OSIdleTaskTCB) {*p_err = OS_ERR_PRIO_INVALID; /* Not allowed to use same priority as idle task */return;}}OS_TaskInitTCB(p_tcb); /* Initialize the TCB to default values */*p_err = OS_ERR_NONE;/* --------------- CLEAR THE TASK'S STACK --------------- */if ((opt & OS_OPT_TASK_STK_CHK) != (OS_OPT)0) { /* See if stack checking has been enabled */if ((opt & OS_OPT_TASK_STK_CLR) != (OS_OPT)0) { /* See if stack needs to be cleared */p_sp = p_stk_base;for (i = 0u; i < stk_size; i++) { /* Stack grows from HIGH to LOW memory */*p_sp = (CPU_STK)0; /* Clear from bottom of stack and up! */p_sp++;}}}/* ------- INITIALIZE THE STACK FRAME OF THE TASK ------- */ #if (CPU_CFG_STK_GROWTH == CPU_STK_GROWTH_HI_TO_LO)p_stk_limit = p_stk_base + stk_limit; #elsep_stk_limit = p_stk_base + (stk_size - 1u) - stk_limit; #endifp_sp = OSTaskStkInit(p_task,p_arg,p_stk_base,p_stk_limit,stk_size,opt);/* -------------- INITIALIZE THE TCB FIELDS ------------- */p_tcb->TaskEntryAddr = p_task; /* Save task entry point address */p_tcb->TaskEntryArg = p_arg; /* Save task entry argument */p_tcb->NamePtr = p_name; /* Save task name */p_tcb->Prio = prio; /* Save the task's priority */p_tcb->StkPtr = p_sp; /* Save the new top-of-stack pointer */p_tcb->StkLimitPtr = p_stk_limit; /* Save the stack limit pointer */p_tcb->TimeQuanta = time_quanta; /* Save the #ticks for time slice (0 means not sliced) */ #if OS_CFG_SCHED_ROUND_ROBIN_EN > 0uif (time_quanta == (OS_TICK)0) {p_tcb->TimeQuantaCtr = OSSchedRoundRobinDfltTimeQuanta;} else {p_tcb->TimeQuantaCtr = time_quanta;} #endifp_tcb->ExtPtr = p_ext; /* Save pointer to TCB extension */p_tcb->StkBasePtr = p_stk_base; /* Save pointer to the base address of the stack */p_tcb->StkSize = stk_size; /* Save the stack size (in number of CPU_STK elements) */p_tcb->Opt = opt; /* Save task options */#if OS_CFG_TASK_REG_TBL_SIZE > 0ufor (reg_nbr = 0u; reg_nbr < OS_CFG_TASK_REG_TBL_SIZE; reg_nbr++) {p_tcb->RegTbl[reg_nbr] = (OS_REG)0;} #endif#if OS_CFG_TASK_Q_EN > 0uOS_MsgQInit(&p_tcb->MsgQ, /* Initialize the task's message queue */q_size); #else(void)&q_size; #endifOSTaskCreateHook(p_tcb); /* Call user defined hook */#if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)for (id = 0u; id < OS_CFG_TLS_TBL_SIZE; id++) {p_tcb->TLS_Tbl[id] = (OS_TLS)0;}OS_TLS_TaskCreate(p_tcb); /* Call TLS hook */ #endif/* --------------- ADD TASK TO READY LIST --------------- */OS_CRITICAL_ENTER();OS_PrioInsert(p_tcb->Prio);OS_RdyListInsertTail(p_tcb);#if OS_CFG_DBG_EN > 0uOS_TaskDbgListAdd(p_tcb); #endifOSTaskQty++; /* Increment the #tasks counter */if (OSRunning != OS_STATE_OS_RUNNING) { /* Return if multitasking has not started */OS_CRITICAL_EXIT();return;}OS_CRITICAL_EXIT_NO_SCHED();OSSched(); }
**void OSTaskCreate (OS_TCB *p_tcb,CPU_CHAR *p_name,OS_TASK_PTR p_task,void *p_arg,OS_PRIO prio,CPU_STK *p_stk_base,CPU_STK_SIZE stk_limit,CPU_STK_SIZE stk_size,OS_MSG_QTY q_size,OS_TICK time_quanta,void *p_ext,OS_OPT opt,OS_ERR *p_err)**

*p_tcb 指向任務的控制塊OS_TCB
*p_name 指向任務的名字,我們可以為每一個任務取一個名字
p_task 執行任務代碼,也就是任務函數的名字
*p_arg 傳遞給任務的參數
prio 任務優先級,數值越低優先級越高,用戶不能夠使用系統任務使用的那些優先級!
*p_stk_base 指向任務堆棧的基地址
stk_limit 任務堆棧深度,用來檢測和確保堆棧不溢出
stk_size 任務堆棧大小
q_size COSIII中每個任務都有一個可選的內部消息隊列,我們要定義OS_CFG_TASK_Q_EN>0,這時才能使用這個內部 消息隊列
time_quanta 在使能時間片輪轉調用時用來設置時間片長度,默認節拍為時鐘節拍除以10.
*p_ext 指向用戶補充的存儲區。
opt 包含任務的特定選項,有如下選項可以設置。
OS_OPT_TASK_NONE 表示沒有任何選項
OS_OPT_TASK_STK_CHK 指定是否允許檢測該任務的堆棧
OS_OPT_TASK_STK_CLR 指定是否清除該任務的堆棧
OS_OPT_TASK_SAVE_FP 指定是否存浮點寄存器,CPU需要浮點運算硬件并且有專用代碼保護浮點 寄存器
*p_err 用來保存調用該函數后返回的錯誤代碼。

總結

以上是生活随笔為你收集整理的UCOSIIIAPI函数接口OSTaskCreate();函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。