Task Management API Changes

The table below shows the difference in API for task-management services.

Task Management API

µC/OS-II (os_task.c)

µC/OS-III (os_task.c)

Note

INT8U
OSTaskChangePrio(
    INT8U        oldprio,
    INT8U        newprio);
void
OSTaskChangePrio(
    OS_TCB       *p_tcb,
    OS_PRIO       prio,
    OS_ERR       *p_err);
(1)
INT8U
OSTaskCreate(
    void       (*task)(void *p_arg),
    void        *p_arg,
    OS_STK      *ptos,
    INT8U        prio);
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);
(2)  
INT8U
OSTaskCreateExt(
    void       (*task)(void *p_arg),
    void        *p_arg,
    OS_STK      *ptos,
    INT8U        prio,
    INT16U       id,
    OS_STK      *pbos,
    INT32U       stk_size,
    void        *pext,
    INT16U       opt);
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);
(2)
INT8U 
OSTaskDel(
    INT8U        prio);
void
OSTaskDel(
    OS_TCB       *p_tcb,
    OS_ERR       *p_err);

INT8U
OSTaskDelReq(
    INT8U        prio);


INT8U
OSTaskNameGet(
    INT8U        prio,
    INT8U      **pname,
    INT8U       *perr);


void
OSTaskNameSet(
    INT8U        prio,
    INT8U       *pname,
    INT8U       *perr);

(3)

OS_MSG_QTY
OSTaskQFlush(
    OS_TCB       *p_tcb,
    OS_ERR       *p_err);
(4)

void *
OSTaskQPend(
    OS_TICK      timeout,
    OS_OPT       opt,
    OS_MSG_SIZE *p_msg_size,
    CPU_TS      *p_ts,
    OS_ERR      *p_err);
(4)

CPU_BOOLEAN
OSTaskQPendAbort(
    OS_TCB      *p_tcb,
    OS_OPT       opt,
    OS_ERR      *p_err);
(4)

void
OSTaskQPost(
    OS_TCB      *p_tcb,
    void        *p_void,
    OS_MSG_SIZE  msg_size,
    OS_OPT       opt,
    OS_ERR      *p_err);
(4)
INT32U
OSTaskRegGet(
    INT8U        prio,
    INT8U        id,
    INT8U       *perr);
OS_REG
OSTaskRegGet(
    OS_TCB      *p_tcb,
    OS_REG_ID    id,
    OS_ERR      *p_err);

void
OSTaskRegSet(
    INT8U        prio,
    INT8U        id,
    INT32U       value,
    INT8U       *perr);
void
OSTaskRegGet(
    OS_TCB      *p_tcb,
    OS_REG_ID    id,
    OS_REG       value,
    OS_ERR      *p_err);

INT8U
OSTaskResume(
    INT8U        prio);
void
OSTaskResume(
    OS_TCB      *p_tcb,
    OS_ERR      *p_err);


OS_SEM_CTR
OSTaskSemPend(
    OS_TICK      timeout,
    OS_OPT       opt,
    CPU_TS      *p_ts,
    OS_ERR      *p_err);
(5)

CPU_BOOLEAN
OSTaskSemPendAbort(
    OS_TCB      *p_tcb,
    OS_OPT       opt,
    OS_ERR      *p_err);
(5)

CPU_BOOLEAN
OSTaskSemPendAbort(
    OS_TCB      *p_tcb,
    OS_OPT       opt,
    OS_ERR      *p_err);
(5)

OS_SEM_CTR
OSTaskSemPost(
    OS_TCB      *p_tcb,
    OS_OPT       opt,
    OS_ERR      *p_err);
(5)

OS_SEM_CTR
OSTaskSemSet(
    OS_TCB      *p_tcb,
    OS_SEM_CTR   cnt,
    OS_ERR      *p_err);
(5)
INT8U
OSTaskSuspend(
    INT8U        prio);
void
OSTaskSuspend(
    OS_TCB       *p_tcb,
    OS_ERR       *p_err);

INT8U
OSTaskStkChk(
    INT8U        prio,
    OS_STK_DATA *p_stk_data);
void
OSTaskStkChk(
    OS_TCB       *p_tcb,
    CPU_STK_SIZE *p_free,
    CPU_STK_SIZE *p_used,
    OS_ERR       *p_err);
(6)

void
OSTaskTimeQuantaSet(
    OS_TCB      *p_tcb,
    OS_TICK      time_quanta,
    OS_ERR      *p_err);
(7)
INT8U
OSTaskQuery(
    INT8U        prio,
    OS_TCB      *p_task_data);

(8)


(1) In µC/OS-II, each task must have a unique priority. The priority of a task can be changed at run-time, however it can only be changed to an unused priority. This is generally not a problem since µC/OS-II supports up to 255 different priority levels and is rare for an application to require all levels. Since µC/OS-III supports an unlimited number of tasks at each priority, the user can change the priority of a task to any available level.

(2) µC/OS-II provides two functions to create a task: OSTaskCreate() and OSTaskCreateExt()OSTaskCreateExt() is recommended since it offers more flexibility. In µC/OS-III, only one API is used to create a task, OSTaskCreate(), which offers similar features to OSTaskCreateExt() and provides additional ones.

(3) µC/OS-III does not need an OSTaskNameSet() since an ASCII name for the task is passed as an argument to OSTaskCreate().

(4) µC/OS-III allows tasks or ISRs to send messages directly to a task instead of having to pass through a mailbox or a message queue as does µC/OS-II.

(5) µC/OS-III allows tasks or ISRs to directly signal a task instead of having to pass through a semaphore as does µC/OS-II.

(6) In µC/OS-II, the user must allocate storage for a special data structure called OS_STK_DATA, which is used to place the result of a stack check of a task. This data structure contains only two fields: .OSFree and .OSUsed. In µC/OS-III, it is required that the caller pass pointers to destination variables where those values will be placed.

(7) µC/OS-III allows users to specify the time quanta of each task on a per-task basis. This is available since µC/OS-III supports multiple tasks at the same priority, and allows for round robin scheduling. The time quanta for a task is specified when the task is created, but it can be changed by the API at run time.

(8) µC/OS-III does not provide query services as they were rarely used.