UCOS_TI_LM3S_Keil
 全部 结构体 文件 函数 变量 类型定义 宏定义 
ucos_ii.h 文件参考
#include <os_cfg.h>
#include <os_cpu.h>
ucos_ii.h 的引用(Include)关系图:
此图展示该文件直接或间接的被哪些文件引用了:

浏览源代码.

结构体

struct  OS_EVENT
 
struct  OS_FLAG_GRP
 
struct  OS_FLAG_NODE
 
struct  OS_MBOX_DATA
 
struct  OS_MEM
 
struct  OS_MEM_DATA
 
struct  OS_MUTEX_DATA
 
struct  OS_Q
 
struct  OS_Q_DATA
 
struct  OS_SEM_DATA
 
struct  OS_STK_DATA
 
struct  OS_TCB
 
struct  OS_TMR
 
struct  OS_TMR_WHEEL
 

宏定义

#define OS_VERSION   289u /* Version of uC/OS-II (Vx.yy mult. by 100) */
 
#define OS_EXT   extern
 
#define OS_FALSE   0u
 
#define OS_TRUE   1u
 
#define OS_ASCII_NUL   (INT8U)0
 
#define OS_PRIO_SELF   0xFFu /* Indicate SELF priority */
 
#define OS_N_SYS_TASKS   2u /* Number of system tasks */
 
#define OS_TASK_STAT_PRIO   (OS_LOWEST_PRIO - 1u) /* Statistic task priority */
 
#define OS_TASK_IDLE_PRIO   (OS_LOWEST_PRIO) /* IDLE task priority */
 
#define OS_EVENT_TBL_SIZE   ((OS_LOWEST_PRIO) / 8u + 1u) /* Size of event table */
 
#define OS_RDY_TBL_SIZE   ((OS_LOWEST_PRIO) / 8u + 1u) /* Size of ready table */
 
#define OS_TASK_IDLE_ID   65535u /* ID numbers for Idle, Stat and Timer tasks */
 
#define OS_TASK_STAT_ID   65534u
 
#define OS_TASK_TMR_ID   65533u
 
#define OS_EVENT_EN   (((OS_Q_EN > 0u) && (OS_MAX_QS > 0u)) || (OS_MBOX_EN > 0u) || (OS_SEM_EN > 0u) || (OS_MUTEX_EN > 0u))
 
#define OS_TCB_RESERVED   ((OS_TCB *)1)
 
#define OS_STAT_RDY   0x00u /* Ready to run */
 
#define OS_STAT_SEM   0x01u /* Pending on semaphore */
 
#define OS_STAT_MBOX   0x02u /* Pending on mailbox */
 
#define OS_STAT_Q   0x04u /* Pending on queue */
 
#define OS_STAT_SUSPEND   0x08u /* Task is suspended */
 
#define OS_STAT_MUTEX   0x10u /* Pending on mutual exclusion semaphore */
 
#define OS_STAT_FLAG   0x20u /* Pending on event flag group */
 
#define OS_STAT_MULTI   0x80u /* Pending on multiple events */
 
#define OS_STAT_PEND_ANY   (OS_STAT_SEM | OS_STAT_MBOX | OS_STAT_Q | OS_STAT_MUTEX | OS_STAT_FLAG)
 
#define OS_STAT_PEND_OK   0u /* Pending status OK, not pending, or pending complete */
 
#define OS_STAT_PEND_TO   1u /* Pending timed out */
 
#define OS_STAT_PEND_ABORT   2u /* Pending aborted */
 
#define OS_EVENT_TYPE_UNUSED   0u
 
#define OS_EVENT_TYPE_MBOX   1u
 
#define OS_EVENT_TYPE_Q   2u
 
#define OS_EVENT_TYPE_SEM   3u
 
#define OS_EVENT_TYPE_MUTEX   4u
 
#define OS_EVENT_TYPE_FLAG   5u
 
#define OS_TMR_TYPE   100u /* Used to identify Timers ... */
 
#define OS_FLAG_WAIT_CLR_ALL   0u /* Wait for ALL the bits specified to be CLR (i.e. 0) */
 
#define OS_FLAG_WAIT_CLR_AND   0u
 
#define OS_FLAG_WAIT_CLR_ANY   1u /* Wait for ANY of the bits specified to be CLR (i.e. 0) */
 
#define OS_FLAG_WAIT_CLR_OR   1u
 
#define OS_FLAG_WAIT_SET_ALL   2u /* Wait for ALL the bits specified to be SET (i.e. 1) */
 
#define OS_FLAG_WAIT_SET_AND   2u
 
#define OS_FLAG_WAIT_SET_ANY   3u /* Wait for ANY of the bits specified to be SET (i.e. 1) */
 
#define OS_FLAG_WAIT_SET_OR   3u
 
#define OS_FLAG_CONSUME   0x80u /* Consume the flags if condition(s) satisfied */
 
#define OS_FLAG_CLR   0u
 
#define OS_FLAG_SET   1u
 
#define OS_DEL_NO_PEND   0u
 
#define OS_DEL_ALWAYS   1u
 
#define OS_PEND_OPT_NONE   0u /* NO option selected */
 
#define OS_PEND_OPT_BROADCAST   1u /* Broadcast action to ALL tasks waiting */
 
#define OS_POST_OPT_NONE   0x00u /* NO option selected */
 
#define OS_POST_OPT_BROADCAST   0x01u /* Broadcast message to ALL tasks waiting */
 
#define OS_POST_OPT_FRONT   0x02u /* Post to highest priority task waiting */
 
#define OS_POST_OPT_NO_SCHED   0x04u /* Do not call the scheduler if this option is selected */
 
#define OS_TASK_OPT_NONE   0x0000u /* NO option selected */
 
#define OS_TASK_OPT_STK_CHK   0x0001u /* Enable stack checking for the task */
 
#define OS_TASK_OPT_STK_CLR   0x0002u /* Clear the stack when the task is create */
 
#define OS_TASK_OPT_SAVE_FP   0x0004u /* Save the contents of any floating-point registers */
 
#define OS_TMR_OPT_NONE   0u /* No option selected */
 
#define OS_TMR_OPT_ONE_SHOT   1u /* Timer will not automatically restart when it expires */
 
#define OS_TMR_OPT_PERIODIC   2u /* Timer will automatically restart when it expires */
 
#define OS_TMR_OPT_CALLBACK   3u /* OSTmrStop() option to call 'callback' w/ timer arg. */
 
#define OS_TMR_OPT_CALLBACK_ARG   4u /* OSTmrStop() option to call 'callback' w/ new arg. */
 
#define OS_TMR_STATE_UNUSED   0u
 
#define OS_TMR_STATE_STOPPED   1u
 
#define OS_TMR_STATE_COMPLETED   2u
 
#define OS_TMR_STATE_RUNNING   3u
 
#define OS_ERR_NONE   0u
 
#define OS_ERR_EVENT_TYPE   1u
 
#define OS_ERR_PEND_ISR   2u
 
#define OS_ERR_POST_NULL_PTR   3u
 
#define OS_ERR_PEVENT_NULL   4u
 
#define OS_ERR_POST_ISR   5u
 
#define OS_ERR_QUERY_ISR   6u
 
#define OS_ERR_INVALID_OPT   7u
 
#define OS_ERR_ID_INVALID   8u
 
#define OS_ERR_PDATA_NULL   9u
 
#define OS_ERR_TIMEOUT   10u
 
#define OS_ERR_EVENT_NAME_TOO_LONG   11u
 
#define OS_ERR_PNAME_NULL   12u
 
#define OS_ERR_PEND_LOCKED   13u
 
#define OS_ERR_PEND_ABORT   14u
 
#define OS_ERR_DEL_ISR   15u
 
#define OS_ERR_CREATE_ISR   16u
 
#define OS_ERR_NAME_GET_ISR   17u
 
#define OS_ERR_NAME_SET_ISR   18u
 
#define OS_ERR_MBOX_FULL   20u
 
#define OS_ERR_Q_FULL   30u
 
#define OS_ERR_Q_EMPTY   31u
 
#define OS_ERR_PRIO_EXIST   40u
 
#define OS_ERR_PRIO   41u
 
#define OS_ERR_PRIO_INVALID   42u
 
#define OS_ERR_SEM_OVF   50u
 
#define OS_ERR_TASK_CREATE_ISR   60u
 
#define OS_ERR_TASK_DEL   61u
 
#define OS_ERR_TASK_DEL_IDLE   62u
 
#define OS_ERR_TASK_DEL_REQ   63u
 
#define OS_ERR_TASK_DEL_ISR   64u
 
#define OS_ERR_TASK_NAME_TOO_LONG   65u
 
#define OS_ERR_TASK_NO_MORE_TCB   66u
 
#define OS_ERR_TASK_NOT_EXIST   67u
 
#define OS_ERR_TASK_NOT_SUSPENDED   68u
 
#define OS_ERR_TASK_OPT   69u
 
#define OS_ERR_TASK_RESUME_PRIO   70u
 
#define OS_ERR_TASK_SUSPEND_IDLE   71u
 
#define OS_ERR_TASK_SUSPEND_PRIO   72u
 
#define OS_ERR_TASK_WAITING   73u
 
#define OS_ERR_TIME_NOT_DLY   80u
 
#define OS_ERR_TIME_INVALID_MINUTES   81u
 
#define OS_ERR_TIME_INVALID_SECONDS   82u
 
#define OS_ERR_TIME_INVALID_MS   83u
 
#define OS_ERR_TIME_ZERO_DLY   84u
 
#define OS_ERR_TIME_DLY_ISR   85u
 
#define OS_ERR_MEM_INVALID_PART   90u
 
#define OS_ERR_MEM_INVALID_BLKS   91u
 
#define OS_ERR_MEM_INVALID_SIZE   92u
 
#define OS_ERR_MEM_NO_FREE_BLKS   93u
 
#define OS_ERR_MEM_FULL   94u
 
#define OS_ERR_MEM_INVALID_PBLK   95u
 
#define OS_ERR_MEM_INVALID_PMEM   96u
 
#define OS_ERR_MEM_INVALID_PDATA   97u
 
#define OS_ERR_MEM_INVALID_ADDR   98u
 
#define OS_ERR_MEM_NAME_TOO_LONG   99u
 
#define OS_ERR_NOT_MUTEX_OWNER   100u
 
#define OS_ERR_FLAG_INVALID_PGRP   110u
 
#define OS_ERR_FLAG_WAIT_TYPE   111u
 
#define OS_ERR_FLAG_NOT_RDY   112u
 
#define OS_ERR_FLAG_INVALID_OPT   113u
 
#define OS_ERR_FLAG_GRP_DEPLETED   114u
 
#define OS_ERR_FLAG_NAME_TOO_LONG   115u
 
#define OS_ERR_PIP_LOWER   120u
 
#define OS_ERR_TMR_INVALID_DLY   130u
 
#define OS_ERR_TMR_INVALID_PERIOD   131u
 
#define OS_ERR_TMR_INVALID_OPT   132u
 
#define OS_ERR_TMR_INVALID_NAME   133u
 
#define OS_ERR_TMR_NON_AVAIL   134u
 
#define OS_ERR_TMR_INACTIVE   135u
 
#define OS_ERR_TMR_INVALID_DEST   136u
 
#define OS_ERR_TMR_INVALID_TYPE   137u
 
#define OS_ERR_TMR_INVALID   138u
 
#define OS_ERR_TMR_ISR   139u
 
#define OS_ERR_TMR_NAME_TOO_LONG   140u
 
#define OS_ERR_TMR_INVALID_STATE   141u
 
#define OS_ERR_TMR_STOPPED   142u
 
#define OS_ERR_TMR_NO_CALLBACK   143u
 
#define OS_NO_ERR   OS_ERR_NONE
 
#define OS_TIMEOUT   OS_ERR_TIMEOUT
 
#define OS_TASK_NOT_EXIST   OS_ERR_TASK_NOT_EXIST
 
#define OS_MBOX_FULL   OS_ERR_MBOX_FULL
 
#define OS_Q_FULL   OS_ERR_Q_FULL
 
#define OS_Q_EMPTY   OS_ERR_Q_EMPTY
 
#define OS_PRIO_EXIST   OS_ERR_PRIO_EXIST
 
#define OS_PRIO_ERR   OS_ERR_PRIO
 
#define OS_PRIO_INVALID   OS_ERR_PRIO_INVALID
 
#define OS_SEM_OVF   OS_ERR_SEM_OVF
 
#define OS_TASK_DEL_ERR   OS_ERR_TASK_DEL
 
#define OS_TASK_DEL_IDLE   OS_ERR_TASK_DEL_IDLE
 
#define OS_TASK_DEL_REQ   OS_ERR_TASK_DEL_REQ
 
#define OS_TASK_DEL_ISR   OS_ERR_TASK_DEL_ISR
 
#define OS_NO_MORE_TCB   OS_ERR_TASK_NO_MORE_TCB
 
#define OS_TIME_NOT_DLY   OS_ERR_TIME_NOT_DLY
 
#define OS_TIME_INVALID_MINUTES   OS_ERR_TIME_INVALID_MINUTES
 
#define OS_TIME_INVALID_SECONDS   OS_ERR_TIME_INVALID_SECONDS
 
#define OS_TIME_INVALID_MS   OS_ERR_TIME_INVALID_MS
 
#define OS_TIME_ZERO_DLY   OS_ERR_TIME_ZERO_DLY
 
#define OS_TASK_SUSPEND_PRIO   OS_ERR_TASK_SUSPEND_PRIO
 
#define OS_TASK_SUSPEND_IDLE   OS_ERR_TASK_SUSPEND_IDLE
 
#define OS_TASK_RESUME_PRIO   OS_ERR_TASK_RESUME_PRIO
 
#define OS_TASK_NOT_SUSPENDED   OS_ERR_TASK_NOT_SUSPENDED
 
#define OS_MEM_INVALID_PART   OS_ERR_MEM_INVALID_PART
 
#define OS_MEM_INVALID_BLKS   OS_ERR_MEM_INVALID_BLKS
 
#define OS_MEM_INVALID_SIZE   OS_ERR_MEM_INVALID_SIZE
 
#define OS_MEM_NO_FREE_BLKS   OS_ERR_MEM_NO_FREE_BLKS
 
#define OS_MEM_FULL   OS_ERR_MEM_FULL
 
#define OS_MEM_INVALID_PBLK   OS_ERR_MEM_INVALID_PBLK
 
#define OS_MEM_INVALID_PMEM   OS_ERR_MEM_INVALID_PMEM
 
#define OS_MEM_INVALID_PDATA   OS_ERR_MEM_INVALID_PDATA
 
#define OS_MEM_INVALID_ADDR   OS_ERR_MEM_INVALID_ADDR
 
#define OS_MEM_NAME_TOO_LONG   OS_ERR_MEM_NAME_TOO_LONG
 
#define OS_TASK_OPT_ERR   OS_ERR_TASK_OPT
 
#define OS_FLAG_INVALID_PGRP   OS_ERR_FLAG_INVALID_PGRP
 
#define OS_FLAG_ERR_WAIT_TYPE   OS_ERR_FLAG_WAIT_TYPE
 
#define OS_FLAG_ERR_NOT_RDY   OS_ERR_FLAG_NOT_RDY
 
#define OS_FLAG_INVALID_OPT   OS_ERR_FLAG_INVALID_OPT
 
#define OS_FLAG_GRP_DEPLETED   OS_ERR_FLAG_GRP_DEPLETED
 

类型定义

typedef INT16U OS_FLAGS
 
typedef void(* OS_TMR_CALLBACK )(void *ptmr, void *parg)
 

函数

INT8U OSEventNameGet (OS_EVENT *pevent, INT8U **pname, INT8U *perr)
 
void OSEventNameSet (OS_EVENT *pevent, INT8U *pname, INT8U *perr)
 
INT16U OSEventPendMulti (OS_EVENT **pevents_pend, OS_EVENT **pevents_rdy, void **pmsgs_rdy, INT32U timeout, INT8U *perr)
 
OS_FLAGS OSFlagAccept (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT8U *perr)
 
OS_FLAG_GRPOSFlagCreate (OS_FLAGS flags, INT8U *perr)
 
OS_FLAG_GRPOSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *perr)
 
INT8U OSFlagNameGet (OS_FLAG_GRP *pgrp, INT8U **pname, INT8U *perr)
 
void OSFlagNameSet (OS_FLAG_GRP *pgrp, INT8U *pname, INT8U *perr)
 
OS_FLAGS OSFlagPend (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT32U timeout, INT8U *perr)
 
OS_FLAGS OSFlagPendGetFlagsRdy (void)
 
OS_FLAGS OSFlagPost (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U opt, INT8U *perr)
 
OS_FLAGS OSFlagQuery (OS_FLAG_GRP *pgrp, INT8U *perr)
 
void * OSMboxAccept (OS_EVENT *pevent)
 
OS_EVENTOSMboxCreate (void *pmsg)
 
OS_EVENTOSMboxDel (OS_EVENT *pevent, INT8U opt, INT8U *perr)
 
void * OSMboxPend (OS_EVENT *pevent, INT32U timeout, INT8U *perr)
 
INT8U OSMboxPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *perr)
 
INT8U OSMboxPost (OS_EVENT *pevent, void *pmsg)
 
INT8U OSMboxPostOpt (OS_EVENT *pevent, void *pmsg, INT8U opt)
 
INT8U OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *p_mbox_data)
 
OS_MEMOSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *perr)
 
void * OSMemGet (OS_MEM *pmem, INT8U *perr)
 
INT8U OSMemNameGet (OS_MEM *pmem, INT8U **pname, INT8U *perr)
 
void OSMemNameSet (OS_MEM *pmem, INT8U *pname, INT8U *perr)
 
INT8U OSMemPut (OS_MEM *pmem, void *pblk)
 
INT8U OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *p_mem_data)
 
BOOLEAN OSMutexAccept (OS_EVENT *pevent, INT8U *perr)
 
OS_EVENTOSMutexCreate (INT8U prio, INT8U *perr)
 
OS_EVENTOSMutexDel (OS_EVENT *pevent, INT8U opt, INT8U *perr)
 
void OSMutexPend (OS_EVENT *pevent, INT32U timeout, INT8U *perr)
 
INT8U OSMutexPost (OS_EVENT *pevent)
 
INT8U OSMutexQuery (OS_EVENT *pevent, OS_MUTEX_DATA *p_mutex_data)
 
void * OSQAccept (OS_EVENT *pevent, INT8U *perr)
 
OS_EVENTOSQCreate (void **start, INT16U size)
 
OS_EVENTOSQDel (OS_EVENT *pevent, INT8U opt, INT8U *perr)
 
INT8U OSQFlush (OS_EVENT *pevent)
 
void * OSQPend (OS_EVENT *pevent, INT32U timeout, INT8U *perr)
 
INT8U OSQPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *perr)
 
INT8U OSQPost (OS_EVENT *pevent, void *pmsg)
 
INT8U OSQPostFront (OS_EVENT *pevent, void *pmsg)
 
INT8U OSQPostOpt (OS_EVENT *pevent, void *pmsg, INT8U opt)
 
INT8U OSQQuery (OS_EVENT *pevent, OS_Q_DATA *p_q_data)
 
INT16U OSSemAccept (OS_EVENT *pevent)
 
OS_EVENTOSSemCreate (INT16U cnt)
 
OS_EVENTOSSemDel (OS_EVENT *pevent, INT8U opt, INT8U *perr)
 
void OSSemPend (OS_EVENT *pevent, INT32U timeout, INT8U *perr)
 
INT8U OSSemPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *perr)
 
INT8U OSSemPost (OS_EVENT *pevent)
 
INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *p_sem_data)
 
void OSSemSet (OS_EVENT *pevent, INT16U cnt, INT8U *perr)
 
INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)
 
INT8U OSTaskCreate (void(*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT8U prio)
 
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)
 
INT8U OSTaskDel (INT8U prio)
 
INT8U OSTaskDelReq (INT8U prio)
 
INT8U OSTaskNameGet (INT8U prio, INT8U **pname, INT8U *perr)
 
void OSTaskNameSet (INT8U prio, INT8U *pname, INT8U *perr)
 
INT8U OSTaskResume (INT8U prio)
 
INT8U OSTaskSuspend (INT8U prio)
 
INT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *p_stk_data)
 
INT8U OSTaskQuery (INT8U prio, OS_TCB *p_task_data)
 
INT32U OSTaskRegGet (INT8U prio, INT8U id, INT8U *perr)
 
void OSTaskRegSet (INT8U prio, INT8U id, INT32U value, INT8U *perr)
 
void OSTimeDly (INT32U ticks)
 
INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U ms)
 
INT8U OSTimeDlyResume (INT8U prio)
 
INT32U OSTimeGet (void)
 
void OSTimeSet (INT32U ticks)
 
void OSTimeTick (void)
 
OS_TMROSTmrCreate (INT32U dly, INT32U period, INT8U opt, OS_TMR_CALLBACK callback, void *callback_arg, INT8U *pname, INT8U *perr)
 
BOOLEAN OSTmrDel (OS_TMR *ptmr, INT8U *perr)
 
INT8U OSTmrNameGet (OS_TMR *ptmr, INT8U **pdest, INT8U *perr)
 
INT32U OSTmrRemainGet (OS_TMR *ptmr, INT8U *perr)
 
INT8U OSTmrStateGet (OS_TMR *ptmr, INT8U *perr)
 
BOOLEAN OSTmrStart (OS_TMR *ptmr, INT8U *perr)
 
BOOLEAN OSTmrStop (OS_TMR *ptmr, INT8U opt, void *callback_arg, INT8U *perr)
 
INT8U OSTmrSignal (void)
 
void OSInit (void)
 
void OSIntEnter (void)
 
void OSIntExit (void)
 
void OSSchedLock (void)
 
void OSSchedUnlock (void)
 
void OSStart (void)
 
void OSStatInit (void)
 
INT16U OSVersion (void)
 
void OS_Dummy (void)
 
INT8U OS_EventTaskRdy (OS_EVENT *pevent, void *pmsg, INT8U msk, INT8U pend_stat)
 
void OS_EventTaskWait (OS_EVENT *pevent)
 
void OS_EventTaskRemove (OS_TCB *ptcb, OS_EVENT *pevent)
 
void OS_EventTaskWaitMulti (OS_EVENT **pevents_wait)
 
void OS_EventTaskRemoveMulti (OS_TCB *ptcb, OS_EVENT **pevents_multi)
 
void OS_EventWaitListInit (OS_EVENT *pevent)
 
void OS_FlagInit (void)
 
void OS_FlagUnlink (OS_FLAG_NODE *pnode)
 
void OS_MemClr (INT8U *pdest, INT16U size)
 
void OS_MemCopy (INT8U *pdest, INT8U *psrc, INT16U size)
 
void OS_MemInit (void)
 
void OS_QInit (void)
 
void OS_Sched (void)
 
INT8U OS_StrLen (INT8U *psrc)
 
void OS_TaskIdle (void *p_arg)
 
void OS_TaskReturn (void)
 
void OS_TaskStat (void *p_arg)
 
void OS_TaskStkClr (OS_STK *pbos, INT32U size, INT16U opt)
 
void OS_TaskStatStkChk (void)
 
INT8U OS_TCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *pext, INT16U opt)
 
void OSTmr_Init (void)
 
void OSInitHookBegin (void)
 
void OSInitHookEnd (void)
 
void OSTaskCreateHook (OS_TCB *ptcb)
 
void OSTaskDelHook (OS_TCB *ptcb)
 
void OSTaskIdleHook (void)
 
void OSTaskReturnHook (OS_TCB *ptcb)
 
void OSTaskStatHook (void)
 
OS_STKOSTaskStkInit (void(*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
 
void OSTaskSwHook (void)
 
void OSTCBInitHook (OS_TCB *ptcb)
 
void OSTimeTickHook (void)
 
void App_TaskCreateHook (OS_TCB *ptcb)
 
void App_TaskDelHook (OS_TCB *ptcb)
 
void App_TaskIdleHook (void)
 
void App_TaskReturnHook (OS_TCB *ptcb)
 
void App_TaskStatHook (void)
 
void App_TaskSwHook (void)
 
void App_TCBInitHook (OS_TCB *ptcb)
 
void App_TimeTickHook (void)
 

变量

OS_EXT INT32U OSCtxSwCtr
 
OS_EXT OS_EVENTOSEventFreeList
 
OS_EXT OS_EVENT OSEventTbl [OS_MAX_EVENTS]
 
OS_EXT OS_FLAG_GRP OSFlagTbl [OS_MAX_FLAGS]
 
OS_EXT OS_FLAG_GRPOSFlagFreeList
 
OS_EXT INT8U OSCPUUsage
 
OS_EXT INT32U OSIdleCtrMax
 
OS_EXT INT32U OSIdleCtrRun
 
OS_EXT BOOLEAN OSStatRdy
 
OS_EXT OS_STK OSTaskStatStk [128u]
 
OS_EXT INT8U OSIntNesting
 
OS_EXT INT8U OSLockNesting
 
OS_EXT INT8U OSPrioCur
 
OS_EXT INT8U OSPrioHighRdy
 
OS_EXT INT8U OSRdyGrp
 
OS_EXT INT8U OSRdyTbl [OS_RDY_TBL_SIZE]
 
OS_EXT BOOLEAN OSRunning
 
OS_EXT INT8U OSTaskCtr
 
OS_EXT volatile INT32U OSIdleCtr
 
OS_EXT OS_STK OSTaskIdleStk [OS_TASK_IDLE_STK_SIZE]
 
OS_EXT OS_TCBOSTCBCur
 
OS_EXT OS_TCBOSTCBFreeList
 
OS_EXT OS_TCBOSTCBHighRdy
 
OS_EXT OS_TCBOSTCBList
 
OS_EXT OS_TCBOSTCBPrioTbl [OS_LOWEST_PRIO+1]
 
OS_EXT OS_TCB OSTCBTbl [OS_MAX_TASKS+OS_N_SYS_TASKS]
 
OS_EXT OS_MEMOSMemFreeList
 
OS_EXT OS_MEM OSMemTbl [OS_MAX_MEM_PART]
 
OS_EXT OS_QOSQFreeList
 
OS_EXT OS_Q OSQTbl [OS_MAX_QS]
 
OS_EXT volatile INT32U OSTime
 
OS_EXT INT16U OSTmrFree
 
OS_EXT INT16U OSTmrUsed
 
OS_EXT INT32U OSTmrTime
 
OS_EXT OS_EVENTOSTmrSem
 
OS_EXT OS_EVENTOSTmrSemSignal
 
OS_EXT OS_TMR OSTmrTbl [OS_TMR_CFG_MAX]
 
OS_EXT OS_TMROSTmrFreeList
 
OS_EXT OS_STK OSTmrTaskStk [OS_TASK_TMR_STK_SIZE]
 
OS_EXT OS_TMR_WHEEL OSTmrWheelTbl [OS_TMR_CFG_WHEEL_SIZE]
 
INT8U const OSUnMapTbl [256]
 

结构体说明

struct OS_EVENT

在文件 ucos_ii.h392 行定义.

OS_EVENT 的协作图:
Collaboration graph
成员变量
INT8U OSEventType
void * OSEventPtr
INT16U OSEventCnt
INT8U OSEventGrp
INT8U OSEventTbl[OS_EVENT_TBL_SIZE]
INT8U * OSEventName
struct OS_FLAG_GRP

在文件 ucos_ii.h432 行定义.

OS_FLAG_GRP 的协作图:
Collaboration graph
成员变量
INT8U OSFlagType
void * OSFlagWaitList
OS_FLAGS OSFlagFlags
INT8U * OSFlagName
struct OS_FLAG_NODE

在文件 ucos_ii.h443 行定义.

OS_FLAG_NODE 的协作图:
Collaboration graph
成员变量
void * OSFlagNodeNext
void * OSFlagNodePrev
void * OSFlagNodeTCB
void * OSFlagNodeFlagGrp
OS_FLAGS OSFlagNodeFlags
INT8U OSFlagNodeWaitType
struct OS_MBOX_DATA

在文件 ucos_ii.h465 行定义.

OS_MBOX_DATA 的协作图:
Collaboration graph
成员变量
void * OSMsg
INT8U OSEventTbl[OS_EVENT_TBL_SIZE]
INT8U OSEventGrp
struct OS_MEM

在文件 ucos_ii.h484 行定义.

OS_MEM 的协作图:
Collaboration graph
成员变量
void * OSMemAddr
void * OSMemFreeList
INT32U OSMemBlkSize
INT32U OSMemNBlks
INT32U OSMemNFree
INT8U * OSMemName
struct OS_MEM_DATA

在文件 ucos_ii.h496 行定义.

OS_MEM_DATA 的协作图:
Collaboration graph
成员变量
void * OSAddr
void * OSFreeList
INT32U OSBlkSize
INT32U OSNBlks
INT32U OSNFree
INT32U OSNUsed
struct OS_MUTEX_DATA

在文件 ucos_ii.h514 行定义.

OS_MUTEX_DATA 的协作图:
Collaboration graph
成员变量
INT8U OSEventTbl[OS_EVENT_TBL_SIZE]
INT8U OSEventGrp
BOOLEAN OSValue
INT8U OSOwnerPrio
INT8U OSMutexPIP
struct OS_Q

在文件 ucos_ii.h535 行定义.

OS_Q 的协作图:
Collaboration graph
成员变量
struct os_q * OSQPtr
void ** OSQStart
void ** OSQEnd
void ** OSQIn
void ** OSQOut
INT16U OSQSize
INT16U OSQEntries
struct OS_Q_DATA

在文件 ucos_ii.h546 行定义.

OS_Q_DATA 的协作图:
Collaboration graph
成员变量
void * OSMsg
INT16U OSNMsgs
INT16U OSQSize
INT8U OSEventTbl[OS_EVENT_TBL_SIZE]
INT8U OSEventGrp
struct OS_SEM_DATA

在文件 ucos_ii.h567 行定义.

OS_SEM_DATA 的协作图:
Collaboration graph
成员变量
INT16U OSCnt
INT8U OSEventTbl[OS_EVENT_TBL_SIZE]
INT8U OSEventGrp
struct OS_STK_DATA

在文件 ucos_ii.h586 行定义.

OS_STK_DATA 的协作图:
Collaboration graph
成员变量
INT32U OSFree
INT32U OSUsed
struct OS_TCB

在文件 ucos_ii.h599 行定义.

OS_TCB 的协作图:
Collaboration graph
成员变量
OS_STK * OSTCBStkPtr
void * OSTCBExtPtr
OS_STK * OSTCBStkBottom
INT32U OSTCBStkSize
INT16U OSTCBOpt
INT16U OSTCBId
struct os_tcb * OSTCBNext
struct os_tcb * OSTCBPrev
OS_EVENT * OSTCBEventPtr
OS_EVENT ** OSTCBEventMultiPtr
void * OSTCBMsg
OS_FLAG_NODE * OSTCBFlagNode
OS_FLAGS OSTCBFlagsRdy
INT32U OSTCBDly
INT8U OSTCBStat
INT8U OSTCBStatPend
INT8U OSTCBPrio
INT8U OSTCBX
INT8U OSTCBY
INT8U OSTCBBitX
INT8U OSTCBBitY
INT8U OSTCBDelReq
INT32U OSTCBCtxSwCtr
INT32U OSTCBCyclesTot
INT32U OSTCBCyclesStart
OS_STK * OSTCBStkBase
INT32U OSTCBStkUsed
INT8U * OSTCBTaskName
INT32U OSTCBRegTbl[OS_TASK_REG_TBL_SIZE]
struct OS_TMR

在文件 ucos_ii.h680 行定义.

OS_TMR 的协作图:
Collaboration graph
成员变量
INT8U OSTmrType
OS_TMR_CALLBACK OSTmrCallback
void * OSTmrCallbackArg
void * OSTmrNext
void * OSTmrPrev
INT32U OSTmrMatch
INT32U OSTmrDly
INT32U OSTmrPeriod
INT8U * OSTmrName
INT8U OSTmrOpt
INT8U OSTmrState
struct OS_TMR_WHEEL

在文件 ucos_ii.h701 行定义.

OS_TMR_WHEEL 的协作图:
Collaboration graph
成员变量
OS_TMR * OSTmrFirst
INT16U OSTmrEntries

宏定义说明

#define OS_VERSION   289u /* Version of uC/OS-II (Vx.yy mult. by 100) */

在文件 ucos_ii.h36 行定义.

参考自 OSVersion().

#define OS_EXT   extern

在文件 ucos_ii.h59 行定义.

#define OS_ASCII_NUL   (INT8U)0

在文件 ucos_ii.h70 行定义.

参考自 OS_StrLen().

#define OS_PRIO_SELF   0xFFu /* Indicate SELF priority */
#define OS_N_SYS_TASKS   2u /* Number of system tasks */

在文件 ucos_ii.h75 行定义.

参考自 OS_InitTCBList().

#define OS_TASK_STAT_PRIO   (OS_LOWEST_PRIO - 1u) /* Statistic task priority */

在文件 ucos_ii.h80 行定义.

参考自 OS_InitTaskStat().

#define OS_TASK_IDLE_PRIO   (OS_LOWEST_PRIO) /* IDLE task priority */
#define OS_EVENT_TBL_SIZE   ((OS_LOWEST_PRIO) / 8u + 1u) /* Size of event table */

在文件 ucos_ii.h84 行定义.

参考自 OS_EventWaitListInit(), OSMboxQuery(), OSMutexQuery(), OSQQuery() , 以及 OSSemQuery().

#define OS_RDY_TBL_SIZE   ((OS_LOWEST_PRIO) / 8u + 1u) /* Size of ready table */

在文件 ucos_ii.h85 行定义.

参考自 OS_InitRdyList().

#define OS_TASK_IDLE_ID   65535u /* ID numbers for Idle, Stat and Timer tasks */

在文件 ucos_ii.h91 行定义.

参考自 OS_InitTaskIdle().

#define OS_TASK_STAT_ID   65534u

在文件 ucos_ii.h92 行定义.

参考自 OS_InitTaskStat().

#define OS_TASK_TMR_ID   65533u

在文件 ucos_ii.h93 行定义.

参考自 OSTmr_InitTask().

#define OS_EVENT_EN   (((OS_Q_EN > 0u) && (OS_MAX_QS > 0u)) || (OS_MBOX_EN > 0u) || (OS_SEM_EN > 0u) || (OS_MUTEX_EN > 0u))

在文件 ucos_ii.h95 行定义.

#define OS_STAT_SEM   0x01u /* Pending on semaphore */

在文件 ucos_ii.h106 行定义.

参考自 OSEventPendMulti(), OSSemDel(), OSSemPend(), OSSemPendAbort() , 以及 OSSemPost().

#define OS_STAT_MBOX   0x02u /* Pending on mailbox */
#define OS_STAT_Q   0x04u /* Pending on queue */
#define OS_STAT_SUSPEND   0x08u /* Task is suspended */
#define OS_STAT_MUTEX   0x10u /* Pending on mutual exclusion semaphore */

在文件 ucos_ii.h110 行定义.

参考自 OSMutexDel(), OSMutexPend() , 以及 OSMutexPost().

#define OS_STAT_FLAG   0x20u /* Pending on event flag group */

在文件 ucos_ii.h111 行定义.

参考自 OS_FlagBlock() , 以及 OS_FlagTaskRdy().

#define OS_STAT_MULTI   0x80u /* Pending on multiple events */

在文件 ucos_ii.h112 行定义.

参考自 OSEventPendMulti().

#define OS_STAT_PEND_ANY   (OS_STAT_SEM | OS_STAT_MBOX | OS_STAT_Q | OS_STAT_MUTEX | OS_STAT_FLAG)

在文件 ucos_ii.h114 行定义.

参考自 OSTimeDlyResume() , 以及 OSTimeTick().

#define OS_STAT_PEND_TO   1u /* Pending timed out */
#define OS_STAT_PEND_ABORT   2u /* Pending aborted */
#define OS_EVENT_TYPE_UNUSED   0u
#define OS_EVENT_TYPE_MUTEX   4u
#define OS_EVENT_TYPE_FLAG   5u
#define OS_TMR_TYPE   100u /* Used to identify Timers ... */
#define OS_FLAG_WAIT_CLR_ALL   0u /* Wait for ALL the bits specified to be CLR (i.e. 0) */

在文件 ucos_ii.h145 行定义.

参考自 OSFlagAccept(), OSFlagPend() , 以及 OSFlagPost().

#define OS_FLAG_WAIT_CLR_AND   0u

在文件 ucos_ii.h146 行定义.

#define OS_FLAG_WAIT_CLR_ANY   1u /* Wait for ANY of the bits specified to be CLR (i.e. 0) */

在文件 ucos_ii.h148 行定义.

参考自 OSFlagAccept(), OSFlagPend() , 以及 OSFlagPost().

#define OS_FLAG_WAIT_CLR_OR   1u

在文件 ucos_ii.h149 行定义.

#define OS_FLAG_WAIT_SET_ALL   2u /* Wait for ALL the bits specified to be SET (i.e. 1) */

在文件 ucos_ii.h151 行定义.

参考自 OSFlagAccept(), OSFlagPend() , 以及 OSFlagPost().

#define OS_FLAG_WAIT_SET_AND   2u

在文件 ucos_ii.h152 行定义.

#define OS_FLAG_WAIT_SET_ANY   3u /* Wait for ANY of the bits specified to be SET (i.e. 1) */

在文件 ucos_ii.h154 行定义.

参考自 OSFlagAccept(), OSFlagPend() , 以及 OSFlagPost().

#define OS_FLAG_WAIT_SET_OR   3u

在文件 ucos_ii.h155 行定义.

#define OS_FLAG_CONSUME   0x80u /* Consume the flags if condition(s) satisfied */

在文件 ucos_ii.h158 行定义.

参考自 OSFlagAccept() , 以及 OSFlagPend().

#define OS_FLAG_CLR   0u

在文件 ucos_ii.h161 行定义.

参考自 OSFlagPost().

#define OS_FLAG_SET   1u

在文件 ucos_ii.h162 行定义.

参考自 OSFlagPost().

#define OS_DEL_NO_PEND   0u

在文件 ucos_ii.h183 行定义.

参考自 OSFlagDel(), OSMboxDel(), OSMutexDel(), OSQDel() , 以及 OSSemDel().

#define OS_DEL_ALWAYS   1u

在文件 ucos_ii.h184 行定义.

参考自 OSFlagDel(), OSMboxDel(), OSMutexDel(), OSQDel() , 以及 OSSemDel().

#define OS_PEND_OPT_NONE   0u /* NO option selected */

在文件 ucos_ii.h193 行定义.

参考自 OSMboxPendAbort(), OSQPendAbort() , 以及 OSSemPendAbort().

#define OS_PEND_OPT_BROADCAST   1u /* Broadcast action to ALL tasks waiting */

在文件 ucos_ii.h194 行定义.

参考自 OSMboxPendAbort(), OSQPendAbort() , 以及 OSSemPendAbort().

#define OS_POST_OPT_NONE   0x00u /* NO option selected */

在文件 ucos_ii.h203 行定义.

#define OS_POST_OPT_BROADCAST   0x01u /* Broadcast message to ALL tasks waiting */

在文件 ucos_ii.h204 行定义.

参考自 OSMboxPostOpt() , 以及 OSQPostOpt().

#define OS_POST_OPT_FRONT   0x02u /* Post to highest priority task waiting */

在文件 ucos_ii.h205 行定义.

参考自 OSQPostOpt().

#define OS_POST_OPT_NO_SCHED   0x04u /* Do not call the scheduler if this option is selected */

在文件 ucos_ii.h206 行定义.

参考自 OSMboxPostOpt() , 以及 OSQPostOpt().

#define OS_TASK_OPT_NONE   0x0000u /* NO option selected */

在文件 ucos_ii.h213 行定义.

#define OS_TASK_OPT_STK_CHK   0x0001u /* Enable stack checking for the task */
#define OS_TASK_OPT_STK_CLR   0x0002u /* Clear the stack when the task is create */
#define OS_TASK_OPT_SAVE_FP   0x0004u /* Save the contents of any floating-point registers */

在文件 ucos_ii.h216 行定义.

#define OS_TMR_OPT_NONE   0u /* No option selected */

在文件 ucos_ii.h223 行定义.

参考自 OSTmr_Free() , 以及 OSTmrStop().

#define OS_TMR_OPT_ONE_SHOT   1u /* Timer will not automatically restart when it expires */

在文件 ucos_ii.h225 行定义.

参考自 OSTmrCreate() , 以及 OSTmrRemainGet().

#define OS_TMR_OPT_PERIODIC   2u /* Timer will automatically restart when it expires */

在文件 ucos_ii.h226 行定义.

参考自 OSTmr_Task(), OSTmrCreate() , 以及 OSTmrRemainGet().

#define OS_TMR_OPT_CALLBACK   3u /* OSTmrStop() option to call 'callback' w/ timer arg. */

在文件 ucos_ii.h228 行定义.

参考自 OSTmrStop().

#define OS_TMR_OPT_CALLBACK_ARG   4u /* OSTmrStop() option to call 'callback' w/ new arg. */

在文件 ucos_ii.h229 行定义.

参考自 OSTmrStop().

#define OS_TMR_STATE_UNUSED   0u
#define OS_TMR_STATE_STOPPED   1u
#define OS_TMR_STATE_COMPLETED   2u
#define OS_TMR_STATE_RUNNING   3u
#define OS_ERR_PEND_ISR   2u
#define OS_ERR_POST_NULL_PTR   3u

在文件 ucos_ii.h250 行定义.

参考自 OSMboxPost() , 以及 OSMboxPostOpt().

#define OS_ERR_POST_ISR   5u

在文件 ucos_ii.h252 行定义.

参考自 OSMutexPost().

#define OS_ERR_QUERY_ISR   6u

在文件 ucos_ii.h253 行定义.

参考自 OSMutexQuery().

#define OS_ERR_INVALID_OPT   7u

在文件 ucos_ii.h254 行定义.

参考自 OSFlagDel(), OSMboxDel(), OSMutexDel(), OSQDel() , 以及 OSSemDel().

#define OS_ERR_ID_INVALID   8u

在文件 ucos_ii.h255 行定义.

参考自 OSTaskRegGet() , 以及 OSTaskRegSet().

#define OS_ERR_PDATA_NULL   9u
#define OS_ERR_TIMEOUT   10u

在文件 ucos_ii.h258 行定义.

参考自 OSEventPendMulti(), OSFlagPend(), OSMboxPend(), OSMutexPend(), OSQPend() , 以及 OSSemPend().

#define OS_ERR_EVENT_NAME_TOO_LONG   11u

在文件 ucos_ii.h259 行定义.

#define OS_ERR_PNAME_NULL   12u
#define OS_ERR_PEND_LOCKED   13u

在文件 ucos_ii.h261 行定义.

参考自 OSEventPendMulti(), OSFlagPend(), OSMboxPend(), OSMutexPend(), OSQPend() , 以及 OSSemPend().

#define OS_ERR_PEND_ABORT   14u
#define OS_ERR_DEL_ISR   15u

在文件 ucos_ii.h263 行定义.

参考自 OSFlagDel(), OSMboxDel(), OSMutexDel(), OSQDel() , 以及 OSSemDel().

#define OS_ERR_CREATE_ISR   16u

在文件 ucos_ii.h264 行定义.

参考自 OSFlagCreate() , 以及 OSMutexCreate().

#define OS_ERR_NAME_GET_ISR   17u
#define OS_ERR_NAME_SET_ISR   18u

在文件 ucos_ii.h266 行定义.

参考自 OSEventNameSet(), OSFlagNameSet(), OSMemNameSet() , 以及 OSTaskNameSet().

#define OS_ERR_MBOX_FULL   20u

在文件 ucos_ii.h268 行定义.

参考自 OSMboxPost() , 以及 OSMboxPostOpt().

#define OS_ERR_Q_FULL   30u

在文件 ucos_ii.h270 行定义.

参考自 OSQPost(), OSQPostFront() , 以及 OSQPostOpt().

#define OS_ERR_Q_EMPTY   31u

在文件 ucos_ii.h271 行定义.

参考自 OSQAccept().

#define OS_ERR_PRIO_EXIST   40u

在文件 ucos_ii.h273 行定义.

参考自 OSMutexCreate(), OSTaskChangePrio(), OSTaskCreate() , 以及 OSTaskCreateExt().

#define OS_ERR_PRIO   41u

在文件 ucos_ii.h274 行定义.

参考自 OSTaskChangePrio() , 以及 OSTaskQuery().

#define OS_ERR_SEM_OVF   50u

在文件 ucos_ii.h277 行定义.

参考自 OSSemPost().

#define OS_ERR_TASK_CREATE_ISR   60u

在文件 ucos_ii.h279 行定义.

参考自 OSTaskCreate() , 以及 OSTaskCreateExt().

#define OS_ERR_TASK_DEL   61u

在文件 ucos_ii.h280 行定义.

参考自 OSTaskDel() , 以及 OSTaskDelReq().

#define OS_ERR_TASK_DEL_IDLE   62u

在文件 ucos_ii.h281 行定义.

参考自 OSTaskDel() , 以及 OSTaskDelReq().

#define OS_ERR_TASK_DEL_REQ   63u

在文件 ucos_ii.h282 行定义.

参考自 OSTaskDelReq().

#define OS_ERR_TASK_DEL_ISR   64u

在文件 ucos_ii.h283 行定义.

参考自 OSTaskDel().

#define OS_ERR_TASK_NAME_TOO_LONG   65u

在文件 ucos_ii.h284 行定义.

#define OS_ERR_TASK_NO_MORE_TCB   66u

在文件 ucos_ii.h285 行定义.

参考自 OS_TCBInit().

#define OS_ERR_TASK_NOT_SUSPENDED   68u

在文件 ucos_ii.h287 行定义.

参考自 OSTaskResume().

#define OS_ERR_TASK_OPT   69u

在文件 ucos_ii.h288 行定义.

参考自 OSTaskStkChk().

#define OS_ERR_TASK_RESUME_PRIO   70u

在文件 ucos_ii.h289 行定义.

参考自 OSTaskResume().

#define OS_ERR_TASK_SUSPEND_IDLE   71u

在文件 ucos_ii.h290 行定义.

参考自 OSTaskSuspend().

#define OS_ERR_TASK_SUSPEND_PRIO   72u

在文件 ucos_ii.h291 行定义.

参考自 OSTaskSuspend().

#define OS_ERR_TASK_WAITING   73u

在文件 ucos_ii.h292 行定义.

参考自 OSFlagDel(), OSMboxDel(), OSMutexDel(), OSQDel(), OSSemDel() , 以及 OSSemSet().

#define OS_ERR_TIME_NOT_DLY   80u

在文件 ucos_ii.h294 行定义.

参考自 OSTimeDlyResume().

#define OS_ERR_TIME_INVALID_MINUTES   81u

在文件 ucos_ii.h295 行定义.

参考自 OSTimeDlyHMSM().

#define OS_ERR_TIME_INVALID_SECONDS   82u

在文件 ucos_ii.h296 行定义.

参考自 OSTimeDlyHMSM().

#define OS_ERR_TIME_INVALID_MS   83u

在文件 ucos_ii.h297 行定义.

参考自 OSTimeDlyHMSM().

#define OS_ERR_TIME_ZERO_DLY   84u

在文件 ucos_ii.h298 行定义.

参考自 OSTimeDlyHMSM().

#define OS_ERR_TIME_DLY_ISR   85u

在文件 ucos_ii.h299 行定义.

参考自 OSTimeDlyHMSM().

#define OS_ERR_MEM_INVALID_PART   90u

在文件 ucos_ii.h301 行定义.

参考自 OSMemCreate().

#define OS_ERR_MEM_INVALID_BLKS   91u

在文件 ucos_ii.h302 行定义.

参考自 OSMemCreate().

#define OS_ERR_MEM_INVALID_SIZE   92u

在文件 ucos_ii.h303 行定义.

参考自 OSMemCreate().

#define OS_ERR_MEM_NO_FREE_BLKS   93u

在文件 ucos_ii.h304 行定义.

参考自 OSMemGet().

#define OS_ERR_MEM_FULL   94u

在文件 ucos_ii.h305 行定义.

参考自 OSMemPut().

#define OS_ERR_MEM_INVALID_PBLK   95u

在文件 ucos_ii.h306 行定义.

参考自 OSMemPut().

#define OS_ERR_MEM_INVALID_PMEM   96u

在文件 ucos_ii.h307 行定义.

参考自 OSMemGet(), OSMemNameGet(), OSMemNameSet(), OSMemPut() , 以及 OSMemQuery().

#define OS_ERR_MEM_INVALID_PDATA   97u

在文件 ucos_ii.h308 行定义.

参考自 OSMemQuery().

#define OS_ERR_MEM_INVALID_ADDR   98u

在文件 ucos_ii.h309 行定义.

参考自 OSMemCreate().

#define OS_ERR_MEM_NAME_TOO_LONG   99u

在文件 ucos_ii.h310 行定义.

#define OS_ERR_NOT_MUTEX_OWNER   100u

在文件 ucos_ii.h312 行定义.

参考自 OSMutexPost().

#define OS_ERR_FLAG_INVALID_PGRP   110u
#define OS_ERR_FLAG_WAIT_TYPE   111u

在文件 ucos_ii.h315 行定义.

参考自 OSFlagAccept(), OSFlagPend() , 以及 OSFlagPost().

#define OS_ERR_FLAG_NOT_RDY   112u

在文件 ucos_ii.h316 行定义.

参考自 OSFlagAccept().

#define OS_ERR_FLAG_INVALID_OPT   113u

在文件 ucos_ii.h317 行定义.

参考自 OSFlagPost().

#define OS_ERR_FLAG_GRP_DEPLETED   114u

在文件 ucos_ii.h318 行定义.

参考自 OSFlagCreate().

#define OS_ERR_FLAG_NAME_TOO_LONG   115u

在文件 ucos_ii.h319 行定义.

#define OS_ERR_PIP_LOWER   120u

在文件 ucos_ii.h321 行定义.

参考自 OSMutexAccept(), OSMutexPend() , 以及 OSMutexPost().

#define OS_ERR_TMR_INVALID_DLY   130u

在文件 ucos_ii.h323 行定义.

参考自 OSTmrCreate().

#define OS_ERR_TMR_INVALID_PERIOD   131u

在文件 ucos_ii.h324 行定义.

参考自 OSTmrCreate().

#define OS_ERR_TMR_INVALID_OPT   132u

在文件 ucos_ii.h325 行定义.

参考自 OSTmrCreate() , 以及 OSTmrStop().

#define OS_ERR_TMR_INVALID_NAME   133u

在文件 ucos_ii.h326 行定义.

#define OS_ERR_TMR_NON_AVAIL   134u

在文件 ucos_ii.h327 行定义.

参考自 OSTmrCreate().

#define OS_ERR_TMR_INACTIVE   135u

在文件 ucos_ii.h328 行定义.

参考自 OSTmrDel(), OSTmrNameGet(), OSTmrRemainGet(), OSTmrStart() , 以及 OSTmrStop().

#define OS_ERR_TMR_INVALID_DEST   136u

在文件 ucos_ii.h329 行定义.

参考自 OSTmrNameGet().

#define OS_ERR_TMR_INVALID_TYPE   137u
#define OS_ERR_TMR_INVALID   138u
#define OS_ERR_TMR_ISR   139u
#define OS_ERR_TMR_NAME_TOO_LONG   140u

在文件 ucos_ii.h333 行定义.

#define OS_ERR_TMR_INVALID_STATE   141u
#define OS_ERR_TMR_STOPPED   142u

在文件 ucos_ii.h335 行定义.

参考自 OSTmrStop().

#define OS_ERR_TMR_NO_CALLBACK   143u

在文件 ucos_ii.h336 行定义.

参考自 OSTmrStop().

#define OS_NO_ERR   OS_ERR_NONE

在文件 ucos_ii.h343 行定义.

#define OS_TIMEOUT   OS_ERR_TIMEOUT

在文件 ucos_ii.h344 行定义.

#define OS_TASK_NOT_EXIST   OS_ERR_TASK_NOT_EXIST

在文件 ucos_ii.h345 行定义.

#define OS_MBOX_FULL   OS_ERR_MBOX_FULL

在文件 ucos_ii.h346 行定义.

#define OS_Q_FULL   OS_ERR_Q_FULL

在文件 ucos_ii.h347 行定义.

#define OS_Q_EMPTY   OS_ERR_Q_EMPTY

在文件 ucos_ii.h348 行定义.

#define OS_PRIO_EXIST   OS_ERR_PRIO_EXIST

在文件 ucos_ii.h349 行定义.

#define OS_PRIO_ERR   OS_ERR_PRIO

在文件 ucos_ii.h350 行定义.

#define OS_PRIO_INVALID   OS_ERR_PRIO_INVALID

在文件 ucos_ii.h351 行定义.

#define OS_SEM_OVF   OS_ERR_SEM_OVF

在文件 ucos_ii.h352 行定义.

#define OS_TASK_DEL_ERR   OS_ERR_TASK_DEL

在文件 ucos_ii.h353 行定义.

#define OS_TASK_DEL_IDLE   OS_ERR_TASK_DEL_IDLE

在文件 ucos_ii.h354 行定义.

#define OS_TASK_DEL_REQ   OS_ERR_TASK_DEL_REQ

在文件 ucos_ii.h355 行定义.

#define OS_TASK_DEL_ISR   OS_ERR_TASK_DEL_ISR

在文件 ucos_ii.h356 行定义.

#define OS_NO_MORE_TCB   OS_ERR_TASK_NO_MORE_TCB

在文件 ucos_ii.h357 行定义.

#define OS_TIME_NOT_DLY   OS_ERR_TIME_NOT_DLY

在文件 ucos_ii.h358 行定义.

#define OS_TIME_INVALID_MINUTES   OS_ERR_TIME_INVALID_MINUTES

在文件 ucos_ii.h359 行定义.

#define OS_TIME_INVALID_SECONDS   OS_ERR_TIME_INVALID_SECONDS

在文件 ucos_ii.h360 行定义.

#define OS_TIME_INVALID_MS   OS_ERR_TIME_INVALID_MS

在文件 ucos_ii.h361 行定义.

#define OS_TIME_ZERO_DLY   OS_ERR_TIME_ZERO_DLY

在文件 ucos_ii.h362 行定义.

#define OS_TASK_SUSPEND_PRIO   OS_ERR_TASK_SUSPEND_PRIO

在文件 ucos_ii.h363 行定义.

#define OS_TASK_SUSPEND_IDLE   OS_ERR_TASK_SUSPEND_IDLE

在文件 ucos_ii.h364 行定义.

#define OS_TASK_RESUME_PRIO   OS_ERR_TASK_RESUME_PRIO

在文件 ucos_ii.h365 行定义.

#define OS_TASK_NOT_SUSPENDED   OS_ERR_TASK_NOT_SUSPENDED

在文件 ucos_ii.h366 行定义.

#define OS_MEM_INVALID_PART   OS_ERR_MEM_INVALID_PART

在文件 ucos_ii.h367 行定义.

#define OS_MEM_INVALID_BLKS   OS_ERR_MEM_INVALID_BLKS

在文件 ucos_ii.h368 行定义.

#define OS_MEM_INVALID_SIZE   OS_ERR_MEM_INVALID_SIZE

在文件 ucos_ii.h369 行定义.

#define OS_MEM_NO_FREE_BLKS   OS_ERR_MEM_NO_FREE_BLKS

在文件 ucos_ii.h370 行定义.

#define OS_MEM_FULL   OS_ERR_MEM_FULL

在文件 ucos_ii.h371 行定义.

#define OS_MEM_INVALID_PBLK   OS_ERR_MEM_INVALID_PBLK

在文件 ucos_ii.h372 行定义.

#define OS_MEM_INVALID_PMEM   OS_ERR_MEM_INVALID_PMEM

在文件 ucos_ii.h373 行定义.

#define OS_MEM_INVALID_PDATA   OS_ERR_MEM_INVALID_PDATA

在文件 ucos_ii.h374 行定义.

#define OS_MEM_INVALID_ADDR   OS_ERR_MEM_INVALID_ADDR

在文件 ucos_ii.h375 行定义.

#define OS_MEM_NAME_TOO_LONG   OS_ERR_MEM_NAME_TOO_LONG

在文件 ucos_ii.h376 行定义.

#define OS_TASK_OPT_ERR   OS_ERR_TASK_OPT

在文件 ucos_ii.h377 行定义.

#define OS_FLAG_INVALID_PGRP   OS_ERR_FLAG_INVALID_PGRP

在文件 ucos_ii.h378 行定义.

#define OS_FLAG_ERR_WAIT_TYPE   OS_ERR_FLAG_WAIT_TYPE

在文件 ucos_ii.h379 行定义.

#define OS_FLAG_ERR_NOT_RDY   OS_ERR_FLAG_NOT_RDY

在文件 ucos_ii.h380 行定义.

#define OS_FLAG_INVALID_OPT   OS_ERR_FLAG_INVALID_OPT

在文件 ucos_ii.h381 行定义.

#define OS_FLAG_GRP_DEPLETED   OS_ERR_FLAG_GRP_DEPLETED

在文件 ucos_ii.h382 行定义.

类型定义说明

typedef INT16U OS_FLAGS

在文件 ucos_ii.h424 行定义.

typedef void(* OS_TMR_CALLBACK)(void *ptmr, void *parg)

在文件 ucos_ii.h676 行定义.

函数说明

INT8U OSEventNameGet ( OS_EVENT pevent,
INT8U **  pname,
INT8U perr 
)

在文件 os_core.c108 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NAME_GET_ISR, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_PNAME_NULL, OS_EVENT_TYPE_MBOX, OS_EVENT_TYPE_MUTEX, OS_EVENT_TYPE_Q, OS_EVENT_TYPE_SEM, OS_EXIT_CRITICAL, OS_StrLen(), OS_EVENT::OSEventName, OS_EVENT::OSEventType , 以及 OSIntNesting.

111 {
112  INT8U len;
113 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
114  OS_CPU_SR cpu_sr = 0u;
115 #endif
116 
117 
118 
119 #if OS_ARG_CHK_EN > 0u
120  if (perr == (INT8U *)0) { /* Validate 'perr' */
121  return (0u);
122  }
123  if (pevent == (OS_EVENT *)0) { /* Is 'pevent' a NULL pointer? */
124  *perr = OS_ERR_PEVENT_NULL;
125  return (0u);
126  }
127  if (pname == (INT8U **)0) { /* Is 'pname' a NULL pointer? */
128  *perr = OS_ERR_PNAME_NULL;
129  return (0u);
130  }
131 #endif
132  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
133  *perr = OS_ERR_NAME_GET_ISR;
134  return (0u);
135  }
136  switch (pevent->OSEventType) {
137  case OS_EVENT_TYPE_SEM:
138  case OS_EVENT_TYPE_MUTEX:
139  case OS_EVENT_TYPE_MBOX:
140  case OS_EVENT_TYPE_Q:
141  break;
142 
143  default:
144  *perr = OS_ERR_EVENT_TYPE;
145  return (0u);
146  }
148  *pname = pevent->OSEventName;
149  len = OS_StrLen(*pname);
151  *perr = OS_ERR_NONE;
152  return (len);
153 }

函数调用图:

void OSEventNameSet ( OS_EVENT pevent,
INT8U pname,
INT8U perr 
)

在文件 os_core.c184 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NAME_SET_ISR, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_PNAME_NULL, OS_EVENT_TYPE_MBOX, OS_EVENT_TYPE_MUTEX, OS_EVENT_TYPE_Q, OS_EVENT_TYPE_SEM, OS_EXIT_CRITICAL, OS_EVENT::OSEventName, OS_EVENT::OSEventType , 以及 OSIntNesting.

参考自 App_EventCreate() , 以及 OSTmr_Init().

187 {
188 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
189  OS_CPU_SR cpu_sr = 0u;
190 #endif
191 
192 
193 
194 #if OS_ARG_CHK_EN > 0u
195  if (perr == (INT8U *)0) { /* Validate 'perr' */
196  return;
197  }
198  if (pevent == (OS_EVENT *)0) { /* Is 'pevent' a NULL pointer? */
199  *perr = OS_ERR_PEVENT_NULL;
200  return;
201  }
202  if (pname == (INT8U *)0) { /* Is 'pname' a NULL pointer? */
203  *perr = OS_ERR_PNAME_NULL;
204  return;
205  }
206 #endif
207  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
208  *perr = OS_ERR_NAME_SET_ISR;
209  return;
210  }
211  switch (pevent->OSEventType) {
212  case OS_EVENT_TYPE_SEM:
213  case OS_EVENT_TYPE_MUTEX:
214  case OS_EVENT_TYPE_MBOX:
215  case OS_EVENT_TYPE_Q:
216  break;
217 
218  default:
219  *perr = OS_ERR_EVENT_TYPE;
220  return;
221  }
223  pevent->OSEventName = pname;
225  *perr = OS_ERR_NONE;
226 }

这是这个函数的调用关系图:

INT16U OSEventPendMulti ( OS_EVENT **  pevents_pend,
OS_EVENT **  pevents_rdy,
void **  pmsgs_rdy,
INT32U  timeout,
INT8U perr 
)

在文件 os_core.c302 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PEND_ABORT, OS_ERR_PEND_ISR, OS_ERR_PEND_LOCKED, OS_ERR_PEVENT_NULL, OS_ERR_TIMEOUT, OS_EVENT_TYPE_FLAG, OS_EVENT_TYPE_MBOX, OS_EVENT_TYPE_MUTEX, OS_EVENT_TYPE_Q, OS_EVENT_TYPE_SEM, OS_EventTaskRemoveMulti(), OS_EventTaskWaitMulti(), OS_EXIT_CRITICAL, OS_FALSE, OS_Sched(), OS_STAT_MBOX, OS_STAT_MULTI, OS_STAT_PEND_ABORT, OS_STAT_PEND_OK, OS_STAT_PEND_TO, OS_STAT_Q, OS_STAT_RDY, OS_STAT_SEM, OS_TRUE, OS_EVENT::OSEventCnt, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType, OSIntNesting, OSLockNesting, OS_Q::OSQEnd, OS_Q::OSQEntries, OS_Q::OSQOut, OS_Q::OSQStart, OSTCBCur, OS_TCB::OSTCBDly, OS_TCB::OSTCBEventMultiPtr, OS_TCB::OSTCBEventPtr, OS_TCB::OSTCBMsg, OS_TCB::OSTCBStat , 以及 OS_TCB::OSTCBStatPend.

307 {
308  OS_EVENT **pevents;
309  OS_EVENT *pevent;
310 #if ((OS_Q_EN > 0u) && (OS_MAX_QS > 0u))
311  OS_Q *pq;
312 #endif
313  BOOLEAN events_rdy;
314  INT16U events_rdy_nbr;
315  INT8U events_stat;
316 #if (OS_CRITICAL_METHOD == 3u) /* Allocate storage for CPU status register */
317  OS_CPU_SR cpu_sr = 0u;
318 #endif
319 
320 
321 
322 #if (OS_ARG_CHK_EN > 0u)
323  if (perr == (INT8U *)0) { /* Validate 'perr' */
324  return (0u);
325  }
326  if (pevents_pend == (OS_EVENT **)0) { /* Validate 'pevents_pend' */
327  *perr = OS_ERR_PEVENT_NULL;
328  return (0u);
329  }
330  if (*pevents_pend == (OS_EVENT *)0) { /* Validate 'pevents_pend' */
331  *perr = OS_ERR_PEVENT_NULL;
332  return (0u);
333  }
334  if (pevents_rdy == (OS_EVENT **)0) { /* Validate 'pevents_rdy' */
335  *perr = OS_ERR_PEVENT_NULL;
336  return (0u);
337  }
338  if (pmsgs_rdy == (void **)0) { /* Validate 'pmsgs_rdy' */
339  *perr = OS_ERR_PEVENT_NULL;
340  return (0u);
341  }
342 #endif
343 
344  *pevents_rdy = (OS_EVENT *)0; /* Init array to NULL in case of errors */
345 
346  pevents = pevents_pend;
347  pevent = *pevents;
348  while (pevent != (OS_EVENT *)0) {
349  switch (pevent->OSEventType) { /* Validate event block types */
350 #if (OS_SEM_EN > 0u)
351  case OS_EVENT_TYPE_SEM:
352  break;
353 #endif
354 #if (OS_MBOX_EN > 0u)
355  case OS_EVENT_TYPE_MBOX:
356  break;
357 #endif
358 #if ((OS_Q_EN > 0u) && (OS_MAX_QS > 0u))
359  case OS_EVENT_TYPE_Q:
360  break;
361 #endif
362 
363  case OS_EVENT_TYPE_MUTEX:
364  case OS_EVENT_TYPE_FLAG:
365  default:
366  *perr = OS_ERR_EVENT_TYPE;
367  return (0u);
368  }
369  pevents++;
370  pevent = *pevents;
371  }
372 
373  if (OSIntNesting > 0u) { /* See if called from ISR ... */
374  *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
375  return (0u);
376  }
377  if (OSLockNesting > 0u) { /* See if called with scheduler locked ... */
378  *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
379  return (0u);
380  }
381 
382 /*$PAGE*/
384  events_rdy = OS_FALSE;
385  events_rdy_nbr = 0u;
386  events_stat = OS_STAT_RDY;
387  pevents = pevents_pend;
388  pevent = *pevents;
389  while (pevent != (OS_EVENT *)0) { /* See if any events already available */
390  switch (pevent->OSEventType) {
391 #if (OS_SEM_EN > 0u)
392  case OS_EVENT_TYPE_SEM:
393  if (pevent->OSEventCnt > 0u) { /* If semaphore count > 0, resource available; */
394  pevent->OSEventCnt--; /* ... decrement semaphore, ... */
395  *pevents_rdy++ = pevent; /* ... and return available semaphore event */
396  events_rdy = OS_TRUE;
397  *pmsgs_rdy++ = (void *)0; /* NO message returned for semaphores */
398  events_rdy_nbr++;
399 
400  } else {
401  events_stat |= OS_STAT_SEM; /* Configure multi-pend for semaphore events */
402  }
403  break;
404 #endif
405 
406 #if (OS_MBOX_EN > 0u)
407  case OS_EVENT_TYPE_MBOX:
408  if (pevent->OSEventPtr != (void *)0) { /* If mailbox NOT empty; ... */
409  /* ... return available message, ... */
410  *pmsgs_rdy++ = (void *)pevent->OSEventPtr;
411  pevent->OSEventPtr = (void *)0;
412  *pevents_rdy++ = pevent; /* ... and return available mailbox event */
413  events_rdy = OS_TRUE;
414  events_rdy_nbr++;
415 
416  } else {
417  events_stat |= OS_STAT_MBOX; /* Configure multi-pend for mailbox events */
418  }
419  break;
420 #endif
421 
422 #if ((OS_Q_EN > 0u) && (OS_MAX_QS > 0u))
423  case OS_EVENT_TYPE_Q:
424  pq = (OS_Q *)pevent->OSEventPtr;
425  if (pq->OSQEntries > 0u) { /* If queue NOT empty; ... */
426  /* ... return available message, ... */
427  *pmsgs_rdy++ = (void *)*pq->OSQOut++;
428  if (pq->OSQOut == pq->OSQEnd) { /* If OUT ptr at queue end, ... */
429  pq->OSQOut = pq->OSQStart; /* ... wrap to queue start */
430  }
431  pq->OSQEntries--; /* Update number of queue entries */
432  *pevents_rdy++ = pevent; /* ... and return available queue event */
433  events_rdy = OS_TRUE;
434  events_rdy_nbr++;
435 
436  } else {
437  events_stat |= OS_STAT_Q; /* Configure multi-pend for queue events */
438  }
439  break;
440 #endif
441 
442  case OS_EVENT_TYPE_MUTEX:
443  case OS_EVENT_TYPE_FLAG:
444  default:
446  *pevents_rdy = (OS_EVENT *)0; /* NULL terminate return event array */
447  *perr = OS_ERR_EVENT_TYPE;
448  return (events_rdy_nbr);
449  }
450  pevents++;
451  pevent = *pevents;
452  }
453 
454  if ( events_rdy == OS_TRUE) { /* Return any events already available */
455  *pevents_rdy = (OS_EVENT *)0; /* NULL terminate return event array */
457  *perr = OS_ERR_NONE;
458  return (events_rdy_nbr);
459  }
460 /*$PAGE*/
461  /* Otherwise, must wait until any event occurs */
462  OSTCBCur->OSTCBStat |= events_stat | /* Resource not available, ... */
463  OS_STAT_MULTI; /* ... pend on multiple events */
465  OSTCBCur->OSTCBDly = timeout; /* Store pend timeout in TCB */
466  OS_EventTaskWaitMulti(pevents_pend); /* Suspend task until events or timeout occurs */
467 
469  OS_Sched(); /* Find next highest priority task ready */
471 
472  switch (OSTCBCur->OSTCBStatPend) { /* Handle event posted, aborted, or timed-out */
473  case OS_STAT_PEND_OK:
474  case OS_STAT_PEND_ABORT:
475  pevent = OSTCBCur->OSTCBEventPtr;
476  if (pevent != (OS_EVENT *)0) { /* If task event ptr != NULL, ... */
477  *pevents_rdy++ = pevent; /* ... return available event ... */
478  *pevents_rdy = (OS_EVENT *)0; /* ... & NULL terminate return event array */
479  events_rdy_nbr++;
480 
481  } else { /* Else NO event available, handle as timeout */
483  OS_EventTaskRemoveMulti(OSTCBCur, pevents_pend);
484  }
485  break;
486 
487  case OS_STAT_PEND_TO: /* If events timed out, ... */
488  default: /* ... remove task from events' wait lists */
489  OS_EventTaskRemoveMulti(OSTCBCur, pevents_pend);
490  break;
491  }
492 
493  switch (OSTCBCur->OSTCBStatPend) {
494  case OS_STAT_PEND_OK:
495  switch (pevent->OSEventType) { /* Return event's message */
496 #if (OS_SEM_EN > 0u)
497  case OS_EVENT_TYPE_SEM:
498  *pmsgs_rdy++ = (void *)0; /* NO message returned for semaphores */
499  break;
500 #endif
501 
502 #if ((OS_MBOX_EN > 0u) || \
503  ((OS_Q_EN > 0u) && (OS_MAX_QS > 0u)))
504  case OS_EVENT_TYPE_MBOX:
505  case OS_EVENT_TYPE_Q:
506  *pmsgs_rdy++ = (void *)OSTCBCur->OSTCBMsg; /* Return received message */
507  break;
508 #endif
509 
510 #if 0 /* Unreachable code */
511  case OS_EVENT_TYPE_MUTEX:
512  case OS_EVENT_TYPE_FLAG:
513 #endif
514  default:
516  *pevents_rdy = (OS_EVENT *)0; /* NULL terminate return event array */
517  *perr = OS_ERR_EVENT_TYPE;
518  return (events_rdy_nbr);
519  }
520  *perr = OS_ERR_NONE;
521  break;
522 
523  case OS_STAT_PEND_ABORT:
524  *pmsgs_rdy++ = (void *)0; /* NO message returned for abort */
525  *perr = OS_ERR_PEND_ABORT; /* Indicate that event aborted */
526  break;
527 
528  case OS_STAT_PEND_TO:
529  default:
530  *pmsgs_rdy++ = (void *)0; /* NO message returned for timeout */
531  *perr = OS_ERR_TIMEOUT; /* Indicate that events timed out */
532  break;
533  }
534 
535  OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Set task status to ready */
536  OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK; /* Clear pend status */
537  OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* Clear event pointers */
539 #if ((OS_MBOX_EN > 0u) || \
540  ((OS_Q_EN > 0u) && (OS_MAX_QS > 0u)))
541  OSTCBCur->OSTCBMsg = (void *)0; /* Clear task message */
542 #endif
544 
545  return (events_rdy_nbr);
546 }

函数调用图:

OS_FLAGS OSFlagAccept ( OS_FLAG_GRP pgrp,
OS_FLAGS  flags,
INT8U  wait_type,
INT8U perr 
)

在文件 os_flag.c92 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_FLAG_INVALID_PGRP, OS_ERR_FLAG_NOT_RDY, OS_ERR_FLAG_WAIT_TYPE, OS_ERR_NONE, OS_EVENT_TYPE_FLAG, OS_EXIT_CRITICAL, OS_FALSE, OS_FLAG_CONSUME, OS_FLAG_WAIT_CLR_ALL, OS_FLAG_WAIT_CLR_ANY, OS_FLAG_WAIT_SET_ALL, OS_FLAG_WAIT_SET_ANY, OS_TRUE, OS_FLAG_GRP::OSFlagFlags , 以及 OS_FLAG_GRP::OSFlagType.

96 {
97  OS_FLAGS flags_rdy;
98  INT8U result;
99  BOOLEAN consume;
100 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
101  OS_CPU_SR cpu_sr = 0u;
102 #endif
103 
104 
105 
106 #if OS_ARG_CHK_EN > 0u
107  if (perr == (INT8U *)0) { /* Validate 'perr' */
108  return ((OS_FLAGS)0);
109  }
110  if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
111  *perr = OS_ERR_FLAG_INVALID_PGRP;
112  return ((OS_FLAGS)0);
113  }
114 #endif
115  if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event block type */
116  *perr = OS_ERR_EVENT_TYPE;
117  return ((OS_FLAGS)0);
118  }
119  result = (INT8U)(wait_type & OS_FLAG_CONSUME);
120  if (result != (INT8U)0) { /* See if we need to consume the flags */
121  wait_type &= ~OS_FLAG_CONSUME;
122  consume = OS_TRUE;
123  } else {
124  consume = OS_FALSE;
125  }
126 /*$PAGE*/
127  *perr = OS_ERR_NONE; /* Assume NO error until proven otherwise. */
129  switch (wait_type) {
130  case OS_FLAG_WAIT_SET_ALL: /* See if all required flags are set */
131  flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
132  if (flags_rdy == flags) { /* Must match ALL the bits that we want */
133  if (consume == OS_TRUE) { /* See if we need to consume the flags */
134  pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we wanted */
135  }
136  } else {
137  *perr = OS_ERR_FLAG_NOT_RDY;
138  }
140  break;
141 
143  flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
144  if (flags_rdy != (OS_FLAGS)0) { /* See if any flag set */
145  if (consume == OS_TRUE) { /* See if we need to consume the flags */
146  pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we got */
147  }
148  } else {
149  *perr = OS_ERR_FLAG_NOT_RDY;
150  }
152  break;
153 
154 #if OS_FLAG_WAIT_CLR_EN > 0u
155  case OS_FLAG_WAIT_CLR_ALL: /* See if all required flags are cleared */
156  flags_rdy = (OS_FLAGS)(~pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
157  if (flags_rdy == flags) { /* Must match ALL the bits that we want */
158  if (consume == OS_TRUE) { /* See if we need to consume the flags */
159  pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we wanted */
160  }
161  } else {
162  *perr = OS_ERR_FLAG_NOT_RDY;
163  }
165  break;
166 
168  flags_rdy = (OS_FLAGS)(~pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
169  if (flags_rdy != (OS_FLAGS)0) { /* See if any flag cleared */
170  if (consume == OS_TRUE) { /* See if we need to consume the flags */
171  pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we got */
172  }
173  } else {
174  *perr = OS_ERR_FLAG_NOT_RDY;
175  }
177  break;
178 #endif
179 
180  default:
182  flags_rdy = (OS_FLAGS)0;
183  *perr = OS_ERR_FLAG_WAIT_TYPE;
184  break;
185  }
186  return (flags_rdy);
187 }
OS_FLAG_GRP* OSFlagCreate ( OS_FLAGS  flags,
INT8U perr 
)

在文件 os_flag.c211 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_CREATE_ISR, OS_ERR_FLAG_GRP_DEPLETED, OS_ERR_NONE, OS_EVENT_TYPE_FLAG, OS_EXIT_CRITICAL, OS_FLAG_GRP::OSFlagFlags, OSFlagFreeList, OS_FLAG_GRP::OSFlagName, OS_FLAG_GRP::OSFlagType, OS_FLAG_GRP::OSFlagWaitList , 以及 OSIntNesting.

213 {
214  OS_FLAG_GRP *pgrp;
215 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
216  OS_CPU_SR cpu_sr = 0u;
217 #endif
218 
219 
220 
221 #if OS_ARG_CHK_EN > 0u
222  if (perr == (INT8U *)0) { /* Validate 'perr' */
223  return ((OS_FLAG_GRP *)0);
224  }
225 #endif
226  if (OSIntNesting > 0u) { /* See if called from ISR ... */
227  *perr = OS_ERR_CREATE_ISR; /* ... can't CREATE from an ISR */
228  return ((OS_FLAG_GRP *)0);
229  }
231  pgrp = OSFlagFreeList; /* Get next free event flag */
232  if (pgrp != (OS_FLAG_GRP *)0) { /* See if we have event flag groups available */
233  /* Adjust free list */
235  pgrp->OSFlagType = OS_EVENT_TYPE_FLAG; /* Set to event flag group type */
236  pgrp->OSFlagFlags = flags; /* Set to desired initial value */
237  pgrp->OSFlagWaitList = (void *)0; /* Clear list of tasks waiting on flags */
238 #if OS_FLAG_NAME_EN > 0u
239  pgrp->OSFlagName = (INT8U *)"?";
240 #endif
242  *perr = OS_ERR_NONE;
243  } else {
245  *perr = OS_ERR_FLAG_GRP_DEPLETED;
246  }
247  return (pgrp); /* Return pointer to event flag group */
248 }
OS_FLAG_GRP* OSFlagDel ( OS_FLAG_GRP pgrp,
INT8U  opt,
INT8U perr 
)

在文件 os_flag.c288 行定义.

参考 OS_DEL_ALWAYS, OS_DEL_NO_PEND, OS_ENTER_CRITICAL, OS_ERR_DEL_ISR, OS_ERR_EVENT_TYPE, OS_ERR_FLAG_INVALID_PGRP, OS_ERR_INVALID_OPT, OS_ERR_NONE, OS_ERR_TASK_WAITING, OS_EVENT_TYPE_FLAG, OS_EVENT_TYPE_UNUSED, OS_EXIT_CRITICAL, OS_FALSE, OS_FlagTaskRdy(), OS_Sched(), OS_TRUE, OS_FLAG_GRP::OSFlagFlags, OSFlagFreeList, OS_FLAG_GRP::OSFlagName, OS_FLAG_NODE::OSFlagNodeNext, OS_FLAG_GRP::OSFlagType, OS_FLAG_GRP::OSFlagWaitList , 以及 OSIntNesting.

291 {
292  BOOLEAN tasks_waiting;
293  OS_FLAG_NODE *pnode;
294  OS_FLAG_GRP *pgrp_return;
295 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
296  OS_CPU_SR cpu_sr = 0u;
297 #endif
298 
299 
300 
301 #if OS_ARG_CHK_EN > 0u
302  if (perr == (INT8U *)0) { /* Validate 'perr' */
303  return (pgrp);
304  }
305  if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
306  *perr = OS_ERR_FLAG_INVALID_PGRP;
307  return (pgrp);
308  }
309 #endif
310  if (OSIntNesting > 0u) { /* See if called from ISR ... */
311  *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
312  return (pgrp);
313  }
314  if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event group type */
315  *perr = OS_ERR_EVENT_TYPE;
316  return (pgrp);
317  }
319  if (pgrp->OSFlagWaitList != (void *)0) { /* See if any tasks waiting on event flags */
320  tasks_waiting = OS_TRUE; /* Yes */
321  } else {
322  tasks_waiting = OS_FALSE; /* No */
323  }
324  switch (opt) {
325  case OS_DEL_NO_PEND: /* Delete group if no task waiting */
326  if (tasks_waiting == OS_FALSE) {
327 #if OS_FLAG_NAME_EN > 0u
328  pgrp->OSFlagName = (INT8U *)"?";
329 #endif
331  pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list */
332  pgrp->OSFlagFlags = (OS_FLAGS)0;
333  OSFlagFreeList = pgrp;
335  *perr = OS_ERR_NONE;
336  pgrp_return = (OS_FLAG_GRP *)0; /* Event Flag Group has been deleted */
337  } else {
339  *perr = OS_ERR_TASK_WAITING;
340  pgrp_return = pgrp;
341  }
342  break;
343 
344  case OS_DEL_ALWAYS: /* Always delete the event flag group */
345  pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
346  while (pnode != (OS_FLAG_NODE *)0) { /* Ready ALL tasks waiting for flags */
347  (void)OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
348  pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
349  }
350 #if OS_FLAG_NAME_EN > 0u
351  pgrp->OSFlagName = (INT8U *)"?";
352 #endif
354  pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list */
355  pgrp->OSFlagFlags = (OS_FLAGS)0;
356  OSFlagFreeList = pgrp;
358  if (tasks_waiting == OS_TRUE) { /* Reschedule only if task(s) were waiting */
359  OS_Sched(); /* Find highest priority task ready to run */
360  }
361  *perr = OS_ERR_NONE;
362  pgrp_return = (OS_FLAG_GRP *)0; /* Event Flag Group has been deleted */
363  break;
364 
365  default:
367  *perr = OS_ERR_INVALID_OPT;
368  pgrp_return = pgrp;
369  break;
370  }
371  return (pgrp_return);
372 }

函数调用图:

INT8U OSFlagNameGet ( OS_FLAG_GRP pgrp,
INT8U **  pname,
INT8U perr 
)

在文件 os_flag.c399 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_FLAG_INVALID_PGRP, OS_ERR_NAME_GET_ISR, OS_ERR_NONE, OS_ERR_PNAME_NULL, OS_EVENT_TYPE_FLAG, OS_EXIT_CRITICAL, OS_StrLen(), OS_FLAG_GRP::OSFlagName, OS_FLAG_GRP::OSFlagType , 以及 OSIntNesting.

402 {
403  INT8U len;
404 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
405  OS_CPU_SR cpu_sr = 0u;
406 #endif
407 
408 
409 
410 #if OS_ARG_CHK_EN > 0u
411  if (perr == (INT8U *)0) { /* Validate 'perr' */
412  return (0u);
413  }
414  if (pgrp == (OS_FLAG_GRP *)0) { /* Is 'pgrp' a NULL pointer? */
415  *perr = OS_ERR_FLAG_INVALID_PGRP;
416  return (0u);
417  }
418  if (pname == (INT8U **)0) { /* Is 'pname' a NULL pointer? */
419  *perr = OS_ERR_PNAME_NULL;
420  return (0u);
421  }
422 #endif
423  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
424  *perr = OS_ERR_NAME_GET_ISR;
425  return (0u);
426  }
428  if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {
430  *perr = OS_ERR_EVENT_TYPE;
431  return (0u);
432  }
433  *pname = pgrp->OSFlagName;
434  len = OS_StrLen(*pname);
436  *perr = OS_ERR_NONE;
437  return (len);
438 }

函数调用图:

void OSFlagNameSet ( OS_FLAG_GRP pgrp,
INT8U pname,
INT8U perr 
)

在文件 os_flag.c466 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_FLAG_INVALID_PGRP, OS_ERR_NAME_SET_ISR, OS_ERR_NONE, OS_ERR_PNAME_NULL, OS_EVENT_TYPE_FLAG, OS_EXIT_CRITICAL, OS_FLAG_GRP::OSFlagName, OS_FLAG_GRP::OSFlagType , 以及 OSIntNesting.

469 {
470 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
471  OS_CPU_SR cpu_sr = 0u;
472 #endif
473 
474 
475 
476 #if OS_ARG_CHK_EN > 0u
477  if (perr == (INT8U *)0) { /* Validate 'perr' */
478  return;
479  }
480  if (pgrp == (OS_FLAG_GRP *)0) { /* Is 'pgrp' a NULL pointer? */
481  *perr = OS_ERR_FLAG_INVALID_PGRP;
482  return;
483  }
484  if (pname == (INT8U *)0) { /* Is 'pname' a NULL pointer? */
485  *perr = OS_ERR_PNAME_NULL;
486  return;
487  }
488 #endif
489  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
490  *perr = OS_ERR_NAME_SET_ISR;
491  return;
492  }
494  if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {
496  *perr = OS_ERR_EVENT_TYPE;
497  return;
498  }
499  pgrp->OSFlagName = pname;
501  *perr = OS_ERR_NONE;
502  return;
503 }
OS_FLAGS OSFlagPend ( OS_FLAG_GRP pgrp,
OS_FLAGS  flags,
INT8U  wait_type,
INT32U  timeout,
INT8U perr 
)

在文件 os_flag.c561 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_FLAG_INVALID_PGRP, OS_ERR_FLAG_WAIT_TYPE, OS_ERR_NONE, OS_ERR_PEND_ABORT, OS_ERR_PEND_ISR, OS_ERR_PEND_LOCKED, OS_ERR_TIMEOUT, OS_EVENT_TYPE_FLAG, OS_EXIT_CRITICAL, OS_FALSE, OS_FLAG_CONSUME, OS_FLAG_WAIT_CLR_ALL, OS_FLAG_WAIT_CLR_ANY, OS_FLAG_WAIT_SET_ALL, OS_FLAG_WAIT_SET_ANY, OS_FlagBlock(), OS_FlagUnlink(), OS_Sched(), OS_STAT_PEND_ABORT, OS_STAT_PEND_OK, OS_STAT_PEND_TO, OS_STAT_RDY, OS_TRUE, OS_FLAG_GRP::OSFlagFlags, OS_FLAG_GRP::OSFlagType, OSIntNesting, OSLockNesting, OSTCBCur, OS_TCB::OSTCBFlagsRdy, OS_TCB::OSTCBStat , 以及 OS_TCB::OSTCBStatPend.

566 {
567  OS_FLAG_NODE node;
568  OS_FLAGS flags_rdy;
569  INT8U result;
570  INT8U pend_stat;
571  BOOLEAN consume;
572 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
573  OS_CPU_SR cpu_sr = 0u;
574 #endif
575 
576 
577 
578 #if OS_ARG_CHK_EN > 0u
579  if (perr == (INT8U *)0) { /* Validate 'perr' */
580  return ((OS_FLAGS)0);
581  }
582  if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
583  *perr = OS_ERR_FLAG_INVALID_PGRP;
584  return ((OS_FLAGS)0);
585  }
586 #endif
587  if (OSIntNesting > 0u) { /* See if called from ISR ... */
588  *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
589  return ((OS_FLAGS)0);
590  }
591  if (OSLockNesting > 0u) { /* See if called with scheduler locked ... */
592  *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
593  return ((OS_FLAGS)0);
594  }
595  if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event block type */
596  *perr = OS_ERR_EVENT_TYPE;
597  return ((OS_FLAGS)0);
598  }
599  result = (INT8U)(wait_type & OS_FLAG_CONSUME);
600  if (result != (INT8U)0) { /* See if we need to consume the flags */
601  wait_type &= ~(INT8U)OS_FLAG_CONSUME;
602  consume = OS_TRUE;
603  } else {
604  consume = OS_FALSE;
605  }
606 /*$PAGE*/
608  switch (wait_type) {
609  case OS_FLAG_WAIT_SET_ALL: /* See if all required flags are set */
610  flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
611  if (flags_rdy == flags) { /* Must match ALL the bits that we want */
612  if (consume == OS_TRUE) { /* See if we need to consume the flags */
613  pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we wanted */
614  }
615  OSTCBCur->OSTCBFlagsRdy = flags_rdy; /* Save flags that were ready */
616  OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
617  *perr = OS_ERR_NONE;
618  return (flags_rdy);
619  } else { /* Block task until events occur or timeout */
620  OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
622  }
623  break;
624 
626  flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
627  if (flags_rdy != (OS_FLAGS)0) { /* See if any flag set */
628  if (consume == OS_TRUE) { /* See if we need to consume the flags */
629  pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we got */
630  }
631  OSTCBCur->OSTCBFlagsRdy = flags_rdy; /* Save flags that were ready */
632  OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
633  *perr = OS_ERR_NONE;
634  return (flags_rdy);
635  } else { /* Block task until events occur or timeout */
636  OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
638  }
639  break;
640 
641 #if OS_FLAG_WAIT_CLR_EN > 0u
642  case OS_FLAG_WAIT_CLR_ALL: /* See if all required flags are cleared */
643  flags_rdy = (OS_FLAGS)(~pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
644  if (flags_rdy == flags) { /* Must match ALL the bits that we want */
645  if (consume == OS_TRUE) { /* See if we need to consume the flags */
646  pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we wanted */
647  }
648  OSTCBCur->OSTCBFlagsRdy = flags_rdy; /* Save flags that were ready */
649  OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
650  *perr = OS_ERR_NONE;
651  return (flags_rdy);
652  } else { /* Block task until events occur or timeout */
653  OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
655  }
656  break;
657 
659  flags_rdy = (OS_FLAGS)(~pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
660  if (flags_rdy != (OS_FLAGS)0) { /* See if any flag cleared */
661  if (consume == OS_TRUE) { /* See if we need to consume the flags */
662  pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we got */
663  }
664  OSTCBCur->OSTCBFlagsRdy = flags_rdy; /* Save flags that were ready */
665  OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
666  *perr = OS_ERR_NONE;
667  return (flags_rdy);
668  } else { /* Block task until events occur or timeout */
669  OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
671  }
672  break;
673 #endif
674 
675  default:
677  flags_rdy = (OS_FLAGS)0;
678  *perr = OS_ERR_FLAG_WAIT_TYPE;
679  return (flags_rdy);
680  }
681 /*$PAGE*/
682  OS_Sched(); /* Find next HPT ready to run */
684  if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* Have we timed-out or aborted? */
685  pend_stat = OSTCBCur->OSTCBStatPend;
687  OS_FlagUnlink(&node);
688  OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Yes, make task ready-to-run */
690  flags_rdy = (OS_FLAGS)0;
691  switch (pend_stat) {
692  case OS_STAT_PEND_ABORT:
693  *perr = OS_ERR_PEND_ABORT; /* Indicate that we aborted waiting */
694  break;
695 
696  case OS_STAT_PEND_TO:
697  default:
698  *perr = OS_ERR_TIMEOUT; /* Indicate that we timed-out waiting */
699  break;
700  }
701  return (flags_rdy);
702  }
703  flags_rdy = OSTCBCur->OSTCBFlagsRdy;
704  if (consume == OS_TRUE) { /* See if we need to consume the flags */
705  switch (wait_type) {
707  case OS_FLAG_WAIT_SET_ANY: /* Clear ONLY the flags we got */
708  pgrp->OSFlagFlags &= ~flags_rdy;
709  break;
710 
711 #if OS_FLAG_WAIT_CLR_EN > 0u
713  case OS_FLAG_WAIT_CLR_ANY: /* Set ONLY the flags we got */
714  pgrp->OSFlagFlags |= flags_rdy;
715  break;
716 #endif
717  default:
719  *perr = OS_ERR_FLAG_WAIT_TYPE;
720  return ((OS_FLAGS)0);
721  }
722  }
724  *perr = OS_ERR_NONE; /* Event(s) must have occurred */
725  return (flags_rdy);
726 }

函数调用图:

OS_FLAGS OSFlagPendGetFlagsRdy ( void  )

在文件 os_flag.c743 行定义.

参考 OS_ENTER_CRITICAL, OS_EXIT_CRITICAL, OSTCBCur , 以及 OS_TCB::OSTCBFlagsRdy.

744 {
745  OS_FLAGS flags;
746 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
747  OS_CPU_SR cpu_sr = 0u;
748 #endif
749 
750 
751 
753  flags = OSTCBCur->OSTCBFlagsRdy;
755  return (flags);
756 }
OS_FLAGS OSFlagPost ( OS_FLAG_GRP pgrp,
OS_FLAGS  flags,
INT8U  opt,
INT8U perr 
)

在文件 os_flag.c800 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_FLAG_INVALID_OPT, OS_ERR_FLAG_INVALID_PGRP, OS_ERR_FLAG_WAIT_TYPE, OS_ERR_NONE, OS_EVENT_TYPE_FLAG, OS_EXIT_CRITICAL, OS_FALSE, OS_FLAG_CLR, OS_FLAG_SET, OS_FLAG_WAIT_CLR_ALL, OS_FLAG_WAIT_CLR_ANY, OS_FLAG_WAIT_SET_ALL, OS_FLAG_WAIT_SET_ANY, OS_FlagTaskRdy(), OS_Sched(), OS_TRUE, OS_FLAG_GRP::OSFlagFlags, OS_FLAG_NODE::OSFlagNodeFlags, OS_FLAG_NODE::OSFlagNodeNext, OS_FLAG_NODE::OSFlagNodeWaitType, OS_FLAG_GRP::OSFlagType , 以及 OS_FLAG_GRP::OSFlagWaitList.

804 {
805  OS_FLAG_NODE *pnode;
806  BOOLEAN sched;
807  OS_FLAGS flags_cur;
808  OS_FLAGS flags_rdy;
809  BOOLEAN rdy;
810 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
811  OS_CPU_SR cpu_sr = 0u;
812 #endif
813 
814 
815 
816 #if OS_ARG_CHK_EN > 0u
817  if (perr == (INT8U *)0) { /* Validate 'perr' */
818  return ((OS_FLAGS)0);
819  }
820  if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
821  *perr = OS_ERR_FLAG_INVALID_PGRP;
822  return ((OS_FLAGS)0);
823  }
824 #endif
825  if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Make sure we are pointing to an event flag grp */
826  *perr = OS_ERR_EVENT_TYPE;
827  return ((OS_FLAGS)0);
828  }
829 /*$PAGE*/
831  switch (opt) {
832  case OS_FLAG_CLR:
833  pgrp->OSFlagFlags &= ~flags; /* Clear the flags specified in the group */
834  break;
835 
836  case OS_FLAG_SET:
837  pgrp->OSFlagFlags |= flags; /* Set the flags specified in the group */
838  break;
839 
840  default:
841  OS_EXIT_CRITICAL(); /* INVALID option */
842  *perr = OS_ERR_FLAG_INVALID_OPT;
843  return ((OS_FLAGS)0);
844  }
845  sched = OS_FALSE; /* Indicate that we don't need rescheduling */
846  pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
847  while (pnode != (OS_FLAG_NODE *)0) { /* Go through all tasks waiting on event flag(s) */
848  switch (pnode->OSFlagNodeWaitType) {
849  case OS_FLAG_WAIT_SET_ALL: /* See if all req. flags are set for current node */
850  flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & pnode->OSFlagNodeFlags);
851  if (flags_rdy == pnode->OSFlagNodeFlags) {
852  rdy = OS_FlagTaskRdy(pnode, flags_rdy); /* Make task RTR, event(s) Rx'd */
853  if (rdy == OS_TRUE) {
854  sched = OS_TRUE; /* When done we will reschedule */
855  }
856  }
857  break;
858 
859  case OS_FLAG_WAIT_SET_ANY: /* See if any flag set */
860  flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & pnode->OSFlagNodeFlags);
861  if (flags_rdy != (OS_FLAGS)0) {
862  rdy = OS_FlagTaskRdy(pnode, flags_rdy); /* Make task RTR, event(s) Rx'd */
863  if (rdy == OS_TRUE) {
864  sched = OS_TRUE; /* When done we will reschedule */
865  }
866  }
867  break;
868 
869 #if OS_FLAG_WAIT_CLR_EN > 0u
870  case OS_FLAG_WAIT_CLR_ALL: /* See if all req. flags are set for current node */
871  flags_rdy = (OS_FLAGS)(~pgrp->OSFlagFlags & pnode->OSFlagNodeFlags);
872  if (flags_rdy == pnode->OSFlagNodeFlags) {
873  rdy = OS_FlagTaskRdy(pnode, flags_rdy); /* Make task RTR, event(s) Rx'd */
874  if (rdy == OS_TRUE) {
875  sched = OS_TRUE; /* When done we will reschedule */
876  }
877  }
878  break;
879 
880  case OS_FLAG_WAIT_CLR_ANY: /* See if any flag set */
881  flags_rdy = (OS_FLAGS)(~pgrp->OSFlagFlags & pnode->OSFlagNodeFlags);
882  if (flags_rdy != (OS_FLAGS)0) {
883  rdy = OS_FlagTaskRdy(pnode, flags_rdy); /* Make task RTR, event(s) Rx'd */
884  if (rdy == OS_TRUE) {
885  sched = OS_TRUE; /* When done we will reschedule */
886  }
887  }
888  break;
889 #endif
890  default:
892  *perr = OS_ERR_FLAG_WAIT_TYPE;
893  return ((OS_FLAGS)0);
894  }
895  pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext; /* Point to next task waiting for event flag(s) */
896  }
898  if (sched == OS_TRUE) {
899  OS_Sched();
900  }
902  flags_cur = pgrp->OSFlagFlags;
904  *perr = OS_ERR_NONE;
905  return (flags_cur);
906 }

函数调用图:

OS_FLAGS OSFlagQuery ( OS_FLAG_GRP pgrp,
INT8U perr 
)

在文件 os_flag.c928 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_FLAG_INVALID_PGRP, OS_ERR_NONE, OS_EVENT_TYPE_FLAG, OS_EXIT_CRITICAL, OS_FLAG_GRP::OSFlagFlags , 以及 OS_FLAG_GRP::OSFlagType.

930 {
931  OS_FLAGS flags;
932 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
933  OS_CPU_SR cpu_sr = 0u;
934 #endif
935 
936 
937 
938 #if OS_ARG_CHK_EN > 0u
939  if (perr == (INT8U *)0) { /* Validate 'perr' */
940  return ((OS_FLAGS)0);
941  }
942  if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
943  *perr = OS_ERR_FLAG_INVALID_PGRP;
944  return ((OS_FLAGS)0);
945  }
946 #endif
947  if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event block type */
948  *perr = OS_ERR_EVENT_TYPE;
949  return ((OS_FLAGS)0);
950  }
952  flags = pgrp->OSFlagFlags;
954  *perr = OS_ERR_NONE;
955  return (flags); /* Return the current value of the event flags */
956 }
void* OSMboxAccept ( OS_EVENT pevent)

在文件 os_mbox.c47 行定义.

参考 OS_ENTER_CRITICAL, OS_EVENT_TYPE_MBOX, OS_EXIT_CRITICAL, OS_EVENT::OSEventPtr , 以及 OS_EVENT::OSEventType.

48 {
49  void *pmsg;
50 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
51  OS_CPU_SR cpu_sr = 0u;
52 #endif
53 
54 
55 
56 #if OS_ARG_CHK_EN > 0u
57  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
58  return ((void *)0);
59  }
60 #endif
61  if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
62  return ((void *)0);
63  }
65  pmsg = pevent->OSEventPtr;
66  pevent->OSEventPtr = (void *)0; /* Clear the mailbox */
68  return (pmsg); /* Return the message received (or NULL) */
69 }
OS_EVENT* OSMboxCreate ( void *  pmsg)

在文件 os_mbox.c88 行定义.

参考 OS_ENTER_CRITICAL, OS_EVENT_TYPE_MBOX, OS_EventWaitListInit(), OS_EXIT_CRITICAL, OS_EVENT::OSEventCnt, OSEventFreeList, OS_EVENT::OSEventName, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType , 以及 OSIntNesting.

参考自 App_EventCreate().

89 {
90  OS_EVENT *pevent;
91 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
92  OS_CPU_SR cpu_sr = 0u;
93 #endif
94 
95 
96 
97  if (OSIntNesting > 0u) { /* See if called from ISR ... */
98  return ((OS_EVENT *)0); /* ... can't CREATE from an ISR */
99  }
101  pevent = OSEventFreeList; /* Get next free event control block */
102  if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB pool was empty */
104  }
106  if (pevent != (OS_EVENT *)0) {
108  pevent->OSEventCnt = 0u;
109  pevent->OSEventPtr = pmsg; /* Deposit message in event control block */
110 #if OS_EVENT_NAME_EN > 0u
111  pevent->OSEventName = (INT8U *)"?";
112 #endif
113  OS_EventWaitListInit(pevent);
114  }
115  return (pevent); /* Return pointer to event control block */
116 }

函数调用图:

这是这个函数的调用关系图:

OS_EVENT* OSMboxDel ( OS_EVENT pevent,
INT8U  opt,
INT8U perr 
)

在文件 os_mbox.c155 行定义.

参考 OS_DEL_ALWAYS, OS_DEL_NO_PEND, OS_ENTER_CRITICAL, OS_ERR_DEL_ISR, OS_ERR_EVENT_TYPE, OS_ERR_INVALID_OPT, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_TASK_WAITING, OS_EVENT_TYPE_MBOX, OS_EVENT_TYPE_UNUSED, OS_EventTaskRdy(), OS_EXIT_CRITICAL, OS_FALSE, OS_Sched(), OS_STAT_MBOX, OS_STAT_PEND_OK, OS_TRUE, OS_EVENT::OSEventCnt, OSEventFreeList, OS_EVENT::OSEventGrp, OS_EVENT::OSEventName, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType , 以及 OSIntNesting.

158 {
159  BOOLEAN tasks_waiting;
160  OS_EVENT *pevent_return;
161 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
162  OS_CPU_SR cpu_sr = 0u;
163 #endif
164 
165 
166 
167 #if OS_ARG_CHK_EN > 0u
168  if (perr == (INT8U *)0) { /* Validate 'perr' */
169  return (pevent);
170  }
171  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
172  *perr = OS_ERR_PEVENT_NULL;
173  return (pevent);
174  }
175 #endif
176  if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
177  *perr = OS_ERR_EVENT_TYPE;
178  return (pevent);
179  }
180  if (OSIntNesting > 0u) { /* See if called from ISR ... */
181  *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
182  return (pevent);
183  }
185  if (pevent->OSEventGrp != 0u) { /* See if any tasks waiting on mailbox */
186  tasks_waiting = OS_TRUE; /* Yes */
187  } else {
188  tasks_waiting = OS_FALSE; /* No */
189  }
190  switch (opt) {
191  case OS_DEL_NO_PEND: /* Delete mailbox only if no task waiting */
192  if (tasks_waiting == OS_FALSE) {
193 #if OS_EVENT_NAME_EN > 0u
194  pevent->OSEventName = (INT8U *)"?";
195 #endif
197  pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
198  pevent->OSEventCnt = 0u;
199  OSEventFreeList = pevent; /* Get next free event control block */
201  *perr = OS_ERR_NONE;
202  pevent_return = (OS_EVENT *)0; /* Mailbox has been deleted */
203  } else {
205  *perr = OS_ERR_TASK_WAITING;
206  pevent_return = pevent;
207  }
208  break;
209 
210  case OS_DEL_ALWAYS: /* Always delete the mailbox */
211  while (pevent->OSEventGrp != 0u) { /* Ready ALL tasks waiting for mailbox */
212  (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MBOX, OS_STAT_PEND_OK);
213  }
214 #if OS_EVENT_NAME_EN > 0u
215  pevent->OSEventName = (INT8U *)"?";
216 #endif
218  pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
219  pevent->OSEventCnt = 0u;
220  OSEventFreeList = pevent; /* Get next free event control block */
222  if (tasks_waiting == OS_TRUE) { /* Reschedule only if task(s) were waiting */
223  OS_Sched(); /* Find highest priority task ready to run */
224  }
225  *perr = OS_ERR_NONE;
226  pevent_return = (OS_EVENT *)0; /* Mailbox has been deleted */
227  break;
228 
229  default:
231  *perr = OS_ERR_INVALID_OPT;
232  pevent_return = pevent;
233  break;
234  }
235  return (pevent_return);
236 }

函数调用图:

void* OSMboxPend ( OS_EVENT pevent,
INT32U  timeout,
INT8U perr 
)

在文件 os_mbox.c273 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PEND_ABORT, OS_ERR_PEND_ISR, OS_ERR_PEND_LOCKED, OS_ERR_PEVENT_NULL, OS_ERR_TIMEOUT, OS_EVENT_TYPE_MBOX, OS_EventTaskRemove(), OS_EventTaskWait(), OS_EXIT_CRITICAL, OS_Sched(), OS_STAT_MBOX, OS_STAT_PEND_ABORT, OS_STAT_PEND_OK, OS_STAT_PEND_TO, OS_STAT_RDY, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType, OSIntNesting, OSLockNesting, OSTCBCur, OS_TCB::OSTCBDly, OS_TCB::OSTCBEventMultiPtr, OS_TCB::OSTCBEventPtr, OS_TCB::OSTCBMsg, OS_TCB::OSTCBStat , 以及 OS_TCB::OSTCBStatPend.

参考自 App_TaskUserIF().

276 {
277  void *pmsg;
278 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
279  OS_CPU_SR cpu_sr = 0u;
280 #endif
281 
282 
283 
284 #if OS_ARG_CHK_EN > 0u
285  if (perr == (INT8U *)0) { /* Validate 'perr' */
286  return ((void *)0);
287  }
288  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
289  *perr = OS_ERR_PEVENT_NULL;
290  return ((void *)0);
291  }
292 #endif
293  if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
294  *perr = OS_ERR_EVENT_TYPE;
295  return ((void *)0);
296  }
297  if (OSIntNesting > 0u) { /* See if called from ISR ... */
298  *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
299  return ((void *)0);
300  }
301  if (OSLockNesting > 0u) { /* See if called with scheduler locked ... */
302  *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
303  return ((void *)0);
304  }
306  pmsg = pevent->OSEventPtr;
307  if (pmsg != (void *)0) { /* See if there is already a message */
308  pevent->OSEventPtr = (void *)0; /* Clear the mailbox */
310  *perr = OS_ERR_NONE;
311  return (pmsg); /* Return the message received (or NULL) */
312  }
313  OSTCBCur->OSTCBStat |= OS_STAT_MBOX; /* Message not available, task will pend */
315  OSTCBCur->OSTCBDly = timeout; /* Load timeout in TCB */
316  OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
318  OS_Sched(); /* Find next highest priority task ready to run */
320  switch (OSTCBCur->OSTCBStatPend) { /* See if we timed-out or aborted */
321  case OS_STAT_PEND_OK:
322  pmsg = OSTCBCur->OSTCBMsg;
323  *perr = OS_ERR_NONE;
324  break;
325 
326  case OS_STAT_PEND_ABORT:
327  pmsg = (void *)0;
328  *perr = OS_ERR_PEND_ABORT; /* Indicate that we aborted */
329  break;
330 
331  case OS_STAT_PEND_TO:
332  default:
333  OS_EventTaskRemove(OSTCBCur, pevent);
334  pmsg = (void *)0;
335  *perr = OS_ERR_TIMEOUT; /* Indicate that we didn't get event within TO */
336  break;
337  }
338  OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Set task status to ready */
339  OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK; /* Clear pend status */
340  OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* Clear event pointers */
341 #if (OS_EVENT_MULTI_EN > 0u)
343 #endif
344  OSTCBCur->OSTCBMsg = (void *)0; /* Clear received message */
346  return (pmsg); /* Return received message */
347 }

函数调用图:

这是这个函数的调用关系图:

INT8U OSMboxPendAbort ( OS_EVENT pevent,
INT8U  opt,
INT8U perr 
)

在文件 os_mbox.c382 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PEND_ABORT, OS_ERR_PEVENT_NULL, OS_EVENT_TYPE_MBOX, OS_EventTaskRdy(), OS_EXIT_CRITICAL, OS_PEND_OPT_BROADCAST, OS_PEND_OPT_NONE, OS_Sched(), OS_STAT_MBOX, OS_STAT_PEND_ABORT, OS_EVENT::OSEventGrp , 以及 OS_EVENT::OSEventType.

385 {
386  INT8U nbr_tasks;
387 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
388  OS_CPU_SR cpu_sr = 0u;
389 #endif
390 
391 
392 
393 #if OS_ARG_CHK_EN > 0u
394  if (perr == (INT8U *)0) { /* Validate 'perr' */
395  return (0u);
396  }
397  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
398  *perr = OS_ERR_PEVENT_NULL;
399  return (0u);
400  }
401 #endif
402  if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
403  *perr = OS_ERR_EVENT_TYPE;
404  return (0u);
405  }
407  if (pevent->OSEventGrp != 0u) { /* See if any task waiting on mailbox? */
408  nbr_tasks = 0u;
409  switch (opt) {
410  case OS_PEND_OPT_BROADCAST: /* Do we need to abort ALL waiting tasks? */
411  while (pevent->OSEventGrp != 0u) { /* Yes, ready ALL tasks waiting on mailbox */
412  (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MBOX, OS_STAT_PEND_ABORT);
413  nbr_tasks++;
414  }
415  break;
416 
417  case OS_PEND_OPT_NONE:
418  default: /* No, ready HPT waiting on mailbox */
419  (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MBOX, OS_STAT_PEND_ABORT);
420  nbr_tasks++;
421  break;
422  }
424  OS_Sched(); /* Find HPT ready to run */
425  *perr = OS_ERR_PEND_ABORT;
426  return (nbr_tasks);
427  }
429  *perr = OS_ERR_NONE;
430  return (0u); /* No tasks waiting on mailbox */
431 }

函数调用图:

INT8U OSMboxPost ( OS_EVENT pevent,
void *  pmsg 
)

在文件 os_mbox.c458 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_MBOX_FULL, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_POST_NULL_PTR, OS_EVENT_TYPE_MBOX, OS_EventTaskRdy(), OS_EXIT_CRITICAL, OS_Sched(), OS_STAT_MBOX, OS_STAT_PEND_OK, OS_EVENT::OSEventGrp, OS_EVENT::OSEventPtr , 以及 OS_EVENT::OSEventType.

参考自 App_TaskKbd().

460 {
461 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
462  OS_CPU_SR cpu_sr = 0u;
463 #endif
464 
465 
466 
467 #if OS_ARG_CHK_EN > 0u
468  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
469  return (OS_ERR_PEVENT_NULL);
470  }
471  if (pmsg == (void *)0) { /* Make sure we are not posting a NULL pointer */
472  return (OS_ERR_POST_NULL_PTR);
473  }
474 #endif
475  if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
476  return (OS_ERR_EVENT_TYPE);
477  }
479  if (pevent->OSEventGrp != 0u) { /* See if any task pending on mailbox */
480  /* Ready HPT waiting on event */
481  (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);
483  OS_Sched(); /* Find highest priority task ready to run */
484  return (OS_ERR_NONE);
485  }
486  if (pevent->OSEventPtr != (void *)0) { /* Make sure mailbox doesn't already have a msg */
488  return (OS_ERR_MBOX_FULL);
489  }
490  pevent->OSEventPtr = pmsg; /* Place message in mailbox */
492  return (OS_ERR_NONE);
493 }

函数调用图:

这是这个函数的调用关系图:

INT8U OSMboxPostOpt ( OS_EVENT pevent,
void *  pmsg,
INT8U  opt 
)

在文件 os_mbox.c530 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_MBOX_FULL, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_POST_NULL_PTR, OS_EVENT_TYPE_MBOX, OS_EventTaskRdy(), OS_EXIT_CRITICAL, OS_POST_OPT_BROADCAST, OS_POST_OPT_NO_SCHED, OS_Sched(), OS_STAT_MBOX, OS_STAT_PEND_OK, OS_EVENT::OSEventGrp, OS_EVENT::OSEventPtr , 以及 OS_EVENT::OSEventType.

533 {
534 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
535  OS_CPU_SR cpu_sr = 0u;
536 #endif
537 
538 
539 
540 #if OS_ARG_CHK_EN > 0u
541  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
542  return (OS_ERR_PEVENT_NULL);
543  }
544  if (pmsg == (void *)0) { /* Make sure we are not posting a NULL pointer */
545  return (OS_ERR_POST_NULL_PTR);
546  }
547 #endif
548  if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
549  return (OS_ERR_EVENT_TYPE);
550  }
552  if (pevent->OSEventGrp != 0u) { /* See if any task pending on mailbox */
553  if ((opt & OS_POST_OPT_BROADCAST) != 0x00u) { /* Do we need to post msg to ALL waiting tasks ? */
554  while (pevent->OSEventGrp != 0u) { /* Yes, Post to ALL tasks waiting on mailbox */
555  (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);
556  }
557  } else { /* No, Post to HPT waiting on mbox */
558  (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);
559  }
561  if ((opt & OS_POST_OPT_NO_SCHED) == 0u) { /* See if scheduler needs to be invoked */
562  OS_Sched(); /* Find HPT ready to run */
563  }
564  return (OS_ERR_NONE);
565  }
566  if (pevent->OSEventPtr != (void *)0) { /* Make sure mailbox doesn't already have a msg */
568  return (OS_ERR_MBOX_FULL);
569  }
570  pevent->OSEventPtr = pmsg; /* Place message in mailbox */
572  return (OS_ERR_NONE);
573 }

函数调用图:

INT8U OSMboxQuery ( OS_EVENT pevent,
OS_MBOX_DATA p_mbox_data 
)

在文件 os_mbox.c596 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PDATA_NULL, OS_ERR_PEVENT_NULL, OS_EVENT_TBL_SIZE, OS_EVENT_TYPE_MBOX, OS_EXIT_CRITICAL, OS_EVENT::OSEventGrp, OS_MBOX_DATA::OSEventGrp, OS_EVENT::OSEventPtr, OS_EVENT::OSEventTbl, OS_MBOX_DATA::OSEventTbl, OS_EVENT::OSEventType , 以及 OS_MBOX_DATA::OSMsg.

598 {
599  INT8U i;
600 #if OS_LOWEST_PRIO <= 63u
601  INT8U *psrc;
602  INT8U *pdest;
603 #else
604  INT16U *psrc;
605  INT16U *pdest;
606 #endif
607 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
608  OS_CPU_SR cpu_sr = 0u;
609 #endif
610 
611 
612 
613 #if OS_ARG_CHK_EN > 0u
614  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
615  return (OS_ERR_PEVENT_NULL);
616  }
617  if (p_mbox_data == (OS_MBOX_DATA *)0) { /* Validate 'p_mbox_data' */
618  return (OS_ERR_PDATA_NULL);
619  }
620 #endif
621  if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
622  return (OS_ERR_EVENT_TYPE);
623  }
625  p_mbox_data->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list */
626  psrc = &pevent->OSEventTbl[0];
627  pdest = &p_mbox_data->OSEventTbl[0];
628  for (i = 0u; i < OS_EVENT_TBL_SIZE; i++) {
629  *pdest++ = *psrc++;
630  }
631  p_mbox_data->OSMsg = pevent->OSEventPtr; /* Get message from mailbox */
633  return (OS_ERR_NONE);
634 }
OS_MEM* OSMemCreate ( void *  addr,
INT32U  nblks,
INT32U  blksize,
INT8U perr 
)

在文件 os_mem.c59 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_MEM_INVALID_ADDR, OS_ERR_MEM_INVALID_BLKS, OS_ERR_MEM_INVALID_PART, OS_ERR_MEM_INVALID_SIZE, OS_ERR_NONE, OS_EXIT_CRITICAL, OS_MEM::OSMemAddr, OS_MEM::OSMemBlkSize, OS_MEM::OSMemFreeList, OSMemFreeList, OS_MEM::OSMemNBlks , 以及 OS_MEM::OSMemNFree.

63 {
64  OS_MEM *pmem;
65  INT8U *pblk;
66  void **plink;
67  INT32U i;
68 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
69  OS_CPU_SR cpu_sr = 0u;
70 #endif
71 
72 
73 
74 #if OS_ARG_CHK_EN > 0u
75  if (perr == (INT8U *)0) { /* Validate 'perr' */
76  return ((OS_MEM *)0);
77  }
78  if (addr == (void *)0) { /* Must pass a valid address for the memory part.*/
80  return ((OS_MEM *)0);
81  }
82  if (((INT32U)addr & (sizeof(void *) - 1u)) != 0u){ /* Must be pointer size aligned */
84  return ((OS_MEM *)0);
85  }
86  if (nblks < 2u) { /* Must have at least 2 blocks per partition */
88  return ((OS_MEM *)0);
89  }
90  if (blksize < sizeof(void *)) { /* Must contain space for at least a pointer */
92  return ((OS_MEM *)0);
93  }
94 #endif
96  pmem = OSMemFreeList; /* Get next free memory partition */
97  if (OSMemFreeList != (OS_MEM *)0) { /* See if pool of free partitions was empty */
99  }
101  if (pmem == (OS_MEM *)0) { /* See if we have a memory partition */
102  *perr = OS_ERR_MEM_INVALID_PART;
103  return ((OS_MEM *)0);
104  }
105  plink = (void **)addr; /* Create linked list of free memory blocks */
106  pblk = (INT8U *)((INT32U)addr + blksize);
107  for (i = 0u; i < (nblks - 1u); i++) {
108  *plink = (void *)pblk; /* Save pointer to NEXT block in CURRENT block */
109  plink = (void **)pblk; /* Position to NEXT block */
110  pblk = (INT8U *)((INT32U)pblk + blksize); /* Point to the FOLLOWING block */
111  }
112  *plink = (void *)0; /* Last memory block points to NULL */
113  pmem->OSMemAddr = addr; /* Store start address of memory partition */
114  pmem->OSMemFreeList = addr; /* Initialize pointer to pool of free blocks */
115  pmem->OSMemNFree = nblks; /* Store number of free blocks in MCB */
116  pmem->OSMemNBlks = nblks;
117  pmem->OSMemBlkSize = blksize; /* Store block size of each memory blocks */
118  *perr = OS_ERR_NONE;
119  return (pmem);
120 }
void* OSMemGet ( OS_MEM pmem,
INT8U perr 
)

在文件 os_mem.c142 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_MEM_INVALID_PMEM, OS_ERR_MEM_NO_FREE_BLKS, OS_ERR_NONE, OS_EXIT_CRITICAL, OS_MEM::OSMemFreeList , 以及 OS_MEM::OSMemNFree.

144 {
145  void *pblk;
146 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
147  OS_CPU_SR cpu_sr = 0u;
148 #endif
149 
150 
151 
152 #if OS_ARG_CHK_EN > 0u
153  if (perr == (INT8U *)0) { /* Validate 'perr' */
154  return ((void *)0);
155  }
156  if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition */
157  *perr = OS_ERR_MEM_INVALID_PMEM;
158  return ((void *)0);
159  }
160 #endif
162  if (pmem->OSMemNFree > 0u) { /* See if there are any free memory blocks */
163  pblk = pmem->OSMemFreeList; /* Yes, point to next free memory block */
164  pmem->OSMemFreeList = *(void **)pblk; /* Adjust pointer to new free list */
165  pmem->OSMemNFree--; /* One less memory block in this partition */
167  *perr = OS_ERR_NONE; /* No error */
168  return (pblk); /* Return memory block to caller */
169  }
171  *perr = OS_ERR_MEM_NO_FREE_BLKS; /* No, Notify caller of empty memory partition */
172  return ((void *)0); /* Return NULL pointer to caller */
173 }
INT8U OSMemNameGet ( OS_MEM pmem,
INT8U **  pname,
INT8U perr 
)

在文件 os_mem.c197 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_MEM_INVALID_PMEM, OS_ERR_NAME_GET_ISR, OS_ERR_NONE, OS_ERR_PNAME_NULL, OS_EXIT_CRITICAL, OS_StrLen(), OSIntNesting , 以及 OS_MEM::OSMemName.

200 {
201  INT8U len;
202 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
203  OS_CPU_SR cpu_sr = 0u;
204 #endif
205 
206 
207 
208 #if OS_ARG_CHK_EN > 0u
209  if (perr == (INT8U *)0) { /* Validate 'perr' */
210  return (0u);
211  }
212  if (pmem == (OS_MEM *)0) { /* Is 'pmem' a NULL pointer? */
213  *perr = OS_ERR_MEM_INVALID_PMEM;
214  return (0u);
215  }
216  if (pname == (INT8U **)0) { /* Is 'pname' a NULL pointer? */
217  *perr = OS_ERR_PNAME_NULL;
218  return (0u);
219  }
220 #endif
221  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
222  *perr = OS_ERR_NAME_GET_ISR;
223  return (0u);
224  }
226  *pname = pmem->OSMemName;
227  len = OS_StrLen(*pname);
229  *perr = OS_ERR_NONE;
230  return (len);
231 }

函数调用图:

void OSMemNameSet ( OS_MEM pmem,
INT8U pname,
INT8U perr 
)

在文件 os_mem.c258 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_MEM_INVALID_PMEM, OS_ERR_NAME_SET_ISR, OS_ERR_NONE, OS_ERR_PNAME_NULL, OS_EXIT_CRITICAL, OSIntNesting , 以及 OS_MEM::OSMemName.

261 {
262 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
263  OS_CPU_SR cpu_sr = 0u;
264 #endif
265 
266 
267 
268 #if OS_ARG_CHK_EN > 0u
269  if (perr == (INT8U *)0) { /* Validate 'perr' */
270  return;
271  }
272  if (pmem == (OS_MEM *)0) { /* Is 'pmem' a NULL pointer? */
273  *perr = OS_ERR_MEM_INVALID_PMEM;
274  return;
275  }
276  if (pname == (INT8U *)0) { /* Is 'pname' a NULL pointer? */
277  *perr = OS_ERR_PNAME_NULL;
278  return;
279  }
280 #endif
281  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
282  *perr = OS_ERR_NAME_SET_ISR;
283  return;
284  }
286  pmem->OSMemName = pname;
288  *perr = OS_ERR_NONE;
289 }
INT8U OSMemPut ( OS_MEM pmem,
void *  pblk 
)

在文件 os_mem.c311 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_MEM_FULL, OS_ERR_MEM_INVALID_PBLK, OS_ERR_MEM_INVALID_PMEM, OS_ERR_NONE, OS_EXIT_CRITICAL, OS_MEM::OSMemFreeList, OS_MEM::OSMemNBlks , 以及 OS_MEM::OSMemNFree.

313 {
314 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
315  OS_CPU_SR cpu_sr = 0u;
316 #endif
317 
318 
319 
320 #if OS_ARG_CHK_EN > 0u
321  if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition */
322  return (OS_ERR_MEM_INVALID_PMEM);
323  }
324  if (pblk == (void *)0) { /* Must release a valid block */
325  return (OS_ERR_MEM_INVALID_PBLK);
326  }
327 #endif
329  if (pmem->OSMemNFree >= pmem->OSMemNBlks) { /* Make sure all blocks not already returned */
331  return (OS_ERR_MEM_FULL);
332  }
333  *(void **)pblk = pmem->OSMemFreeList; /* Insert released block into free block list */
334  pmem->OSMemFreeList = pblk;
335  pmem->OSMemNFree++; /* One more memory block in this partition */
337  return (OS_ERR_NONE); /* Notify caller that memory block was released */
338 }
INT8U OSMemQuery ( OS_MEM pmem,
OS_MEM_DATA p_mem_data 
)

在文件 os_mem.c359 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_MEM_INVALID_PDATA, OS_ERR_MEM_INVALID_PMEM, OS_ERR_NONE, OS_EXIT_CRITICAL, OS_MEM_DATA::OSAddr, OS_MEM_DATA::OSBlkSize, OS_MEM_DATA::OSFreeList, OS_MEM::OSMemAddr, OS_MEM::OSMemBlkSize, OS_MEM::OSMemFreeList, OS_MEM::OSMemNBlks, OS_MEM::OSMemNFree, OS_MEM_DATA::OSNBlks, OS_MEM_DATA::OSNFree , 以及 OS_MEM_DATA::OSNUsed.

361 {
362 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
363  OS_CPU_SR cpu_sr = 0u;
364 #endif
365 
366 
367 
368 #if OS_ARG_CHK_EN > 0u
369  if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition */
370  return (OS_ERR_MEM_INVALID_PMEM);
371  }
372  if (p_mem_data == (OS_MEM_DATA *)0) { /* Must release a valid storage area for the data */
373  return (OS_ERR_MEM_INVALID_PDATA);
374  }
375 #endif
377  p_mem_data->OSAddr = pmem->OSMemAddr;
378  p_mem_data->OSFreeList = pmem->OSMemFreeList;
379  p_mem_data->OSBlkSize = pmem->OSMemBlkSize;
380  p_mem_data->OSNBlks = pmem->OSMemNBlks;
381  p_mem_data->OSNFree = pmem->OSMemNFree;
383  p_mem_data->OSNUsed = p_mem_data->OSNBlks - p_mem_data->OSNFree;
384  return (OS_ERR_NONE);
385 }
BOOLEAN OSMutexAccept ( OS_EVENT pevent,
INT8U perr 
)

在文件 os_mutex.c84 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PEND_ISR, OS_ERR_PEVENT_NULL, OS_ERR_PIP_LOWER, OS_EVENT_TYPE_MUTEX, OS_EXIT_CRITICAL, OS_FALSE, OS_MUTEX_AVAILABLE, OS_MUTEX_KEEP_LOWER_8, OS_MUTEX_KEEP_UPPER_8, OS_TRUE, OS_EVENT::OSEventCnt, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType, OSIntNesting, OSTCBCur , 以及 OS_TCB::OSTCBPrio.

86 {
87  INT8U pip; /* Priority Inheritance Priority (PIP) */
88 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
89  OS_CPU_SR cpu_sr = 0u;
90 #endif
91 
92 
93 
94 #if OS_ARG_CHK_EN > 0u
95  if (perr == (INT8U *)0) { /* Validate 'perr' */
96  return (OS_FALSE);
97  }
98  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
99  *perr = OS_ERR_PEVENT_NULL;
100  return (OS_FALSE);
101  }
102 #endif
103  if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
104  *perr = OS_ERR_EVENT_TYPE;
105  return (OS_FALSE);
106  }
107  if (OSIntNesting > 0u) { /* Make sure it's not called from an ISR */
108  *perr = OS_ERR_PEND_ISR;
109  return (OS_FALSE);
110  }
111  OS_ENTER_CRITICAL(); /* Get value (0 or 1) of Mutex */
112  pip = (INT8U)(pevent->OSEventCnt >> 8u); /* Get PIP from mutex */
114  pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Mask off LSByte (Acquire Mutex) */
115  pevent->OSEventCnt |= OSTCBCur->OSTCBPrio; /* Save current task priority in LSByte */
116  pevent->OSEventPtr = (void *)OSTCBCur; /* Link TCB of task owning Mutex */
117  if (OSTCBCur->OSTCBPrio <= pip) { /* PIP 'must' have a SMALLER prio ... */
118  OS_EXIT_CRITICAL(); /* ... than current task! */
119  *perr = OS_ERR_PIP_LOWER;
120  } else {
122  *perr = OS_ERR_NONE;
123  }
124  return (OS_TRUE);
125  }
127  *perr = OS_ERR_NONE;
128  return (OS_FALSE);
129 }
OS_EVENT* OSMutexCreate ( INT8U  prio,
INT8U perr 
)

在文件 os_mutex.c167 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_CREATE_ISR, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_PRIO_EXIST, OS_ERR_PRIO_INVALID, OS_EVENT_TYPE_MUTEX, OS_EventWaitListInit(), OS_EXIT_CRITICAL, OS_LOWEST_PRIO, OS_MUTEX_AVAILABLE, OS_TCB_RESERVED, OS_EVENT::OSEventCnt, OSEventFreeList, OS_EVENT::OSEventName, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType, OSIntNesting , 以及 OSTCBPrioTbl.

169 {
170  OS_EVENT *pevent;
171 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
172  OS_CPU_SR cpu_sr = 0u;
173 #endif
174 
175 
176 
177 #if OS_ARG_CHK_EN > 0u
178  if (perr == (INT8U *)0) { /* Validate 'perr' */
179  return ((OS_EVENT *)0);
180  }
181  if (prio >= OS_LOWEST_PRIO) { /* Validate PIP */
182  *perr = OS_ERR_PRIO_INVALID;
183  return ((OS_EVENT *)0);
184  }
185 #endif
186  if (OSIntNesting > 0u) { /* See if called from ISR ... */
187  *perr = OS_ERR_CREATE_ISR; /* ... can't CREATE mutex from an ISR */
188  return ((OS_EVENT *)0);
189  }
191  if (OSTCBPrioTbl[prio] != (OS_TCB *)0) { /* Mutex priority must not already exist */
192  OS_EXIT_CRITICAL(); /* Task already exist at priority ... */
193  *perr = OS_ERR_PRIO_EXIST; /* ... inheritance priority */
194  return ((OS_EVENT *)0);
195  }
196  OSTCBPrioTbl[prio] = OS_TCB_RESERVED; /* Reserve the table entry */
197  pevent = OSEventFreeList; /* Get next free event control block */
198  if (pevent == (OS_EVENT *)0) { /* See if an ECB was available */
199  OSTCBPrioTbl[prio] = (OS_TCB *)0; /* No, Release the table entry */
201  *perr = OS_ERR_PEVENT_NULL; /* No more event control blocks */
202  return (pevent);
203  }
204  OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr; /* Adjust the free list */
207  pevent->OSEventCnt = (INT16U)((INT16U)prio << 8u) | OS_MUTEX_AVAILABLE; /* Resource is avail. */
208  pevent->OSEventPtr = (void *)0; /* No task owning the mutex */
209 #if OS_EVENT_NAME_EN > 0u
210  pevent->OSEventName = (INT8U *)"?";
211 #endif
212  OS_EventWaitListInit(pevent);
213  *perr = OS_ERR_NONE;
214  return (pevent);
215 }

函数调用图:

OS_EVENT* OSMutexDel ( OS_EVENT pevent,
INT8U  opt,
INT8U perr 
)

在文件 os_mutex.c259 行定义.

参考 OS_DEL_ALWAYS, OS_DEL_NO_PEND, OS_ENTER_CRITICAL, OS_ERR_DEL_ISR, OS_ERR_EVENT_TYPE, OS_ERR_INVALID_OPT, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_TASK_WAITING, OS_EVENT_TYPE_MUTEX, OS_EVENT_TYPE_UNUSED, OS_EventTaskRdy(), OS_EXIT_CRITICAL, OS_FALSE, OS_MUTEX_KEEP_LOWER_8, OS_Sched(), OS_STAT_MUTEX, OS_STAT_PEND_OK, OS_TRUE, OS_EVENT::OSEventCnt, OSEventFreeList, OS_EVENT::OSEventGrp, OS_EVENT::OSEventName, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType, OSIntNesting, OSMutex_RdyAtPrio(), OS_TCB::OSTCBPrio , 以及 OSTCBPrioTbl.

262 {
263  BOOLEAN tasks_waiting;
264  OS_EVENT *pevent_return;
265  INT8U pip; /* Priority inheritance priority */
266  INT8U prio;
267  OS_TCB *ptcb;
268 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
269  OS_CPU_SR cpu_sr = 0u;
270 #endif
271 
272 
273 
274 #if OS_ARG_CHK_EN > 0u
275  if (perr == (INT8U *)0) { /* Validate 'perr' */
276  return (pevent);
277  }
278  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
279  *perr = OS_ERR_PEVENT_NULL;
280  return (pevent);
281  }
282 #endif
283  if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
284  *perr = OS_ERR_EVENT_TYPE;
285  return (pevent);
286  }
287  if (OSIntNesting > 0u) { /* See if called from ISR ... */
288  *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
289  return (pevent);
290  }
292  if (pevent->OSEventGrp != 0u) { /* See if any tasks waiting on mutex */
293  tasks_waiting = OS_TRUE; /* Yes */
294  } else {
295  tasks_waiting = OS_FALSE; /* No */
296  }
297  switch (opt) {
298  case OS_DEL_NO_PEND: /* DELETE MUTEX ONLY IF NO TASK WAITING --- */
299  if (tasks_waiting == OS_FALSE) {
300 #if OS_EVENT_NAME_EN > 0u
301  pevent->OSEventName = (INT8U *)"?";
302 #endif
303  pip = (INT8U)(pevent->OSEventCnt >> 8u);
304  OSTCBPrioTbl[pip] = (OS_TCB *)0; /* Free up the PIP */
306  pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
307  pevent->OSEventCnt = 0u;
308  OSEventFreeList = pevent;
310  *perr = OS_ERR_NONE;
311  pevent_return = (OS_EVENT *)0; /* Mutex has been deleted */
312  } else {
314  *perr = OS_ERR_TASK_WAITING;
315  pevent_return = pevent;
316  }
317  break;
318 
319  case OS_DEL_ALWAYS: /* ALWAYS DELETE THE MUTEX ---------------- */
320  pip = (INT8U)(pevent->OSEventCnt >> 8u); /* Get PIP of mutex */
321  prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* Get owner's original prio */
322  ptcb = (OS_TCB *)pevent->OSEventPtr;
323  if (ptcb != (OS_TCB *)0) { /* See if any task owns the mutex */
324  if (ptcb->OSTCBPrio == pip) { /* See if original prio was changed */
325  OSMutex_RdyAtPrio(ptcb, prio); /* Yes, Restore the task's original prio */
326  }
327  }
328  while (pevent->OSEventGrp != 0u) { /* Ready ALL tasks waiting for mutex */
329  (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX, OS_STAT_PEND_OK);
330  }
331 #if OS_EVENT_NAME_EN > 0u
332  pevent->OSEventName = (INT8U *)"?";
333 #endif
334  pip = (INT8U)(pevent->OSEventCnt >> 8u);
335  OSTCBPrioTbl[pip] = (OS_TCB *)0; /* Free up the PIP */
337  pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
338  pevent->OSEventCnt = 0u;
339  OSEventFreeList = pevent; /* Get next free event control block */
341  if (tasks_waiting == OS_TRUE) { /* Reschedule only if task(s) were waiting */
342  OS_Sched(); /* Find highest priority task ready to run */
343  }
344  *perr = OS_ERR_NONE;
345  pevent_return = (OS_EVENT *)0; /* Mutex has been deleted */
346  break;
347 
348  default:
350  *perr = OS_ERR_INVALID_OPT;
351  pevent_return = pevent;
352  break;
353  }
354  return (pevent_return);
355 }

函数调用图:

void OSMutexPend ( OS_EVENT pevent,
INT32U  timeout,
INT8U perr 
)

在文件 os_mutex.c399 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PEND_ABORT, OS_ERR_PEND_ISR, OS_ERR_PEND_LOCKED, OS_ERR_PEVENT_NULL, OS_ERR_PIP_LOWER, OS_ERR_TIMEOUT, OS_EVENT_TYPE_MUTEX, OS_EventTaskRemove(), OS_EventTaskWait(), OS_EXIT_CRITICAL, OS_FALSE, OS_MUTEX_AVAILABLE, OS_MUTEX_KEEP_LOWER_8, OS_MUTEX_KEEP_UPPER_8, OS_Sched(), OS_STAT_MUTEX, OS_STAT_PEND_ABORT, OS_STAT_PEND_OK, OS_STAT_PEND_TO, OS_STAT_RDY, OS_TRUE, OS_EVENT::OSEventCnt, OS_EVENT::OSEventGrp, OS_EVENT::OSEventPtr, OS_EVENT::OSEventTbl, OS_EVENT::OSEventType, OSIntNesting, OSLockNesting, OSRdyGrp, OSRdyTbl, OS_TCB::OSTCBBitX, OS_TCB::OSTCBBitY, OSTCBCur, OS_TCB::OSTCBDly, OS_TCB::OSTCBEventMultiPtr, OS_TCB::OSTCBEventPtr, OS_TCB::OSTCBPrio, OSTCBPrioTbl, OS_TCB::OSTCBStat, OS_TCB::OSTCBStatPend, OS_TCB::OSTCBX , 以及 OS_TCB::OSTCBY.

402 {
403  INT8U pip; /* Priority Inheritance Priority (PIP) */
404  INT8U mprio; /* Mutex owner priority */
405  BOOLEAN rdy; /* Flag indicating task was ready */
406  OS_TCB *ptcb;
407  OS_EVENT *pevent2;
408  INT8U y;
409 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
410  OS_CPU_SR cpu_sr = 0u;
411 #endif
412 
413 
414 
415 #if OS_ARG_CHK_EN > 0u
416  if (perr == (INT8U *)0) { /* Validate 'perr' */
417  return;
418  }
419  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
420  *perr = OS_ERR_PEVENT_NULL;
421  return;
422  }
423 #endif
424  if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
425  *perr = OS_ERR_EVENT_TYPE;
426  return;
427  }
428  if (OSIntNesting > 0u) { /* See if called from ISR ... */
429  *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
430  return;
431  }
432  if (OSLockNesting > 0u) { /* See if called with scheduler locked ... */
433  *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
434  return;
435  }
436 /*$PAGE*/
438  pip = (INT8U)(pevent->OSEventCnt >> 8u); /* Get PIP from mutex */
439  /* Is Mutex available? */
441  pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Yes, Acquire the resource */
442  pevent->OSEventCnt |= OSTCBCur->OSTCBPrio; /* Save priority of owning task */
443  pevent->OSEventPtr = (void *)OSTCBCur; /* Point to owning task's OS_TCB */
444  if (OSTCBCur->OSTCBPrio <= pip) { /* PIP 'must' have a SMALLER prio ... */
445  OS_EXIT_CRITICAL(); /* ... than current task! */
446  *perr = OS_ERR_PIP_LOWER;
447  } else {
449  *perr = OS_ERR_NONE;
450  }
451  return;
452  }
453  mprio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* No, Get priority of mutex owner */
454  ptcb = (OS_TCB *)(pevent->OSEventPtr); /* Point to TCB of mutex owner */
455  if (ptcb->OSTCBPrio > pip) { /* Need to promote prio of owner?*/
456  if (mprio > OSTCBCur->OSTCBPrio) {
457  y = ptcb->OSTCBY;
458  if ((OSRdyTbl[y] & ptcb->OSTCBBitX) != 0u) { /* See if mutex owner is ready */
459  OSRdyTbl[y] &= ~ptcb->OSTCBBitX; /* Yes, Remove owner from Rdy ...*/
460  if (OSRdyTbl[y] == 0u) { /* ... list at current prio */
461  OSRdyGrp &= ~ptcb->OSTCBBitY;
462  }
463  rdy = OS_TRUE;
464  } else {
465  pevent2 = ptcb->OSTCBEventPtr;
466  if (pevent2 != (OS_EVENT *)0) { /* Remove from event wait list */
467  if ((pevent2->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
468  pevent2->OSEventGrp &= ~ptcb->OSTCBBitY;
469  }
470  }
471  rdy = OS_FALSE; /* No */
472  }
473  ptcb->OSTCBPrio = pip; /* Change owner task prio to PIP */
474 #if OS_LOWEST_PRIO <= 63u
475  ptcb->OSTCBY = (INT8U)( ptcb->OSTCBPrio >> 3u);
476  ptcb->OSTCBX = (INT8U)( ptcb->OSTCBPrio & 0x07u);
477  ptcb->OSTCBBitY = (INT8U)(1u << ptcb->OSTCBY);
478  ptcb->OSTCBBitX = (INT8U)(1u << ptcb->OSTCBX);
479 #else
480  ptcb->OSTCBY = (INT8U)((ptcb->OSTCBPrio >> 4u) & 0xFFu);
481  ptcb->OSTCBX = (INT8U)( ptcb->OSTCBPrio & 0x0Fu);
482  ptcb->OSTCBBitY = (INT16U)(1u << ptcb->OSTCBY);
483  ptcb->OSTCBBitX = (INT16U)(1u << ptcb->OSTCBX);
484 #endif
485  if (rdy == OS_TRUE) { /* If task was ready at owner's priority ...*/
486  OSRdyGrp |= ptcb->OSTCBBitY; /* ... make it ready at new priority. */
487  OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
488  } else {
489  pevent2 = ptcb->OSTCBEventPtr;
490  if (pevent2 != (OS_EVENT *)0) { /* Add to event wait list */
491  pevent2->OSEventGrp |= ptcb->OSTCBBitY;
492  pevent2->OSEventTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
493  }
494  }
495  OSTCBPrioTbl[pip] = ptcb;
496  }
497  }
498  OSTCBCur->OSTCBStat |= OS_STAT_MUTEX; /* Mutex not available, pend current task */
500  OSTCBCur->OSTCBDly = timeout; /* Store timeout in current task's TCB */
501  OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
503  OS_Sched(); /* Find next highest priority task ready */
505  switch (OSTCBCur->OSTCBStatPend) { /* See if we timed-out or aborted */
506  case OS_STAT_PEND_OK:
507  *perr = OS_ERR_NONE;
508  break;
509 
510  case OS_STAT_PEND_ABORT:
511  *perr = OS_ERR_PEND_ABORT; /* Indicate that we aborted getting mutex */
512  break;
513 
514  case OS_STAT_PEND_TO:
515  default:
516  OS_EventTaskRemove(OSTCBCur, pevent);
517  *perr = OS_ERR_TIMEOUT; /* Indicate that we didn't get mutex within TO */
518  break;
519  }
520  OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Set task status to ready */
521  OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK; /* Clear pend status */
522  OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* Clear event pointers */
523 #if (OS_EVENT_MULTI_EN > 0u)
525 #endif
527 }

函数调用图:

INT8U OSMutexPost ( OS_EVENT pevent)

在文件 os_mutex.c553 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_NOT_MUTEX_OWNER, OS_ERR_PEVENT_NULL, OS_ERR_PIP_LOWER, OS_ERR_POST_ISR, OS_EVENT_TYPE_MUTEX, OS_EventTaskRdy(), OS_EXIT_CRITICAL, OS_MUTEX_AVAILABLE, OS_MUTEX_KEEP_LOWER_8, OS_MUTEX_KEEP_UPPER_8, OS_Sched(), OS_STAT_MUTEX, OS_STAT_PEND_OK, OS_TCB_RESERVED, OS_EVENT::OSEventCnt, OS_EVENT::OSEventGrp, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType, OSIntNesting, OSMutex_RdyAtPrio(), OSTCBCur, OS_TCB::OSTCBPrio , 以及 OSTCBPrioTbl.

554 {
555  INT8U pip; /* Priority inheritance priority */
556  INT8U prio;
557 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
558  OS_CPU_SR cpu_sr = 0u;
559 #endif
560 
561 
562 
563  if (OSIntNesting > 0u) { /* See if called from ISR ... */
564  return (OS_ERR_POST_ISR); /* ... can't POST mutex from an ISR */
565  }
566 #if OS_ARG_CHK_EN > 0u
567  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
568  return (OS_ERR_PEVENT_NULL);
569  }
570 #endif
571  if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
572  return (OS_ERR_EVENT_TYPE);
573  }
575  pip = (INT8U)(pevent->OSEventCnt >> 8u); /* Get priority inheritance priority of mutex */
576  prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* Get owner's original priority */
577  if (OSTCBCur != (OS_TCB *)pevent->OSEventPtr) { /* See if posting task owns the MUTEX */
579  return (OS_ERR_NOT_MUTEX_OWNER);
580  }
581  if (OSTCBCur->OSTCBPrio == pip) { /* Did we have to raise current task's priority? */
582  OSMutex_RdyAtPrio(OSTCBCur, prio); /* Restore the task's original priority */
583  }
584  OSTCBPrioTbl[pip] = OS_TCB_RESERVED; /* Reserve table entry */
585  if (pevent->OSEventGrp != 0u) { /* Any task waiting for the mutex? */
586  /* Yes, Make HPT waiting for mutex ready */
587  prio = OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX, OS_STAT_PEND_OK);
588  pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Save priority of mutex's new owner */
589  pevent->OSEventCnt |= prio;
590  pevent->OSEventPtr = OSTCBPrioTbl[prio]; /* Link to new mutex owner's OS_TCB */
591  if (prio <= pip) { /* PIP 'must' have a SMALLER prio ... */
592  OS_EXIT_CRITICAL(); /* ... than current task! */
593  OS_Sched(); /* Find highest priority task ready to run */
594  return (OS_ERR_PIP_LOWER);
595  } else {
597  OS_Sched(); /* Find highest priority task ready to run */
598  return (OS_ERR_NONE);
599  }
600  }
601  pevent->OSEventCnt |= OS_MUTEX_AVAILABLE; /* No, Mutex is now available */
602  pevent->OSEventPtr = (void *)0;
604  return (OS_ERR_NONE);
605 }

函数调用图:

INT8U OSMutexQuery ( OS_EVENT pevent,
OS_MUTEX_DATA p_mutex_data 
)

在文件 os_mutex.c626 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PDATA_NULL, OS_ERR_PEVENT_NULL, OS_ERR_QUERY_ISR, OS_EVENT_TBL_SIZE, OS_EVENT_TYPE_MUTEX, OS_EXIT_CRITICAL, OS_FALSE, OS_MUTEX_KEEP_LOWER_8, OS_TRUE, OS_EVENT::OSEventCnt, OS_EVENT::OSEventGrp, OS_MUTEX_DATA::OSEventGrp, OS_EVENT::OSEventTbl, OS_MUTEX_DATA::OSEventTbl, OS_EVENT::OSEventType, OSIntNesting, OS_MUTEX_DATA::OSMutexPIP, OS_MUTEX_DATA::OSOwnerPrio , 以及 OS_MUTEX_DATA::OSValue.

628 {
629  INT8U i;
630 #if OS_LOWEST_PRIO <= 63u
631  INT8U *psrc;
632  INT8U *pdest;
633 #else
634  INT16U *psrc;
635  INT16U *pdest;
636 #endif
637 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
638  OS_CPU_SR cpu_sr = 0u;
639 #endif
640 
641 
642 
643  if (OSIntNesting > 0u) { /* See if called from ISR ... */
644  return (OS_ERR_QUERY_ISR); /* ... can't QUERY mutex from an ISR */
645  }
646 #if OS_ARG_CHK_EN > 0u
647  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
648  return (OS_ERR_PEVENT_NULL);
649  }
650  if (p_mutex_data == (OS_MUTEX_DATA *)0) { /* Validate 'p_mutex_data' */
651  return (OS_ERR_PDATA_NULL);
652  }
653 #endif
654  if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
655  return (OS_ERR_EVENT_TYPE);
656  }
658  p_mutex_data->OSMutexPIP = (INT8U)(pevent->OSEventCnt >> 8u);
659  p_mutex_data->OSOwnerPrio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);
660  if (p_mutex_data->OSOwnerPrio == 0xFFu) {
661  p_mutex_data->OSValue = OS_TRUE;
662  } else {
663  p_mutex_data->OSValue = OS_FALSE;
664  }
665  p_mutex_data->OSEventGrp = pevent->OSEventGrp; /* Copy wait list */
666  psrc = &pevent->OSEventTbl[0];
667  pdest = &p_mutex_data->OSEventTbl[0];
668  for (i = 0u; i < OS_EVENT_TBL_SIZE; i++) {
669  *pdest++ = *psrc++;
670  }
672  return (OS_ERR_NONE);
673 }
void* OSQAccept ( OS_EVENT pevent,
INT8U perr 
)

在文件 os_q.c61 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_Q_EMPTY, OS_EVENT_TYPE_Q, OS_EXIT_CRITICAL, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType, OS_Q::OSQEnd, OS_Q::OSQEntries, OS_Q::OSQOut , 以及 OS_Q::OSQStart.

63 {
64  void *pmsg;
65  OS_Q *pq;
66 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
67  OS_CPU_SR cpu_sr = 0u;
68 #endif
69 
70 
71 
72 #if OS_ARG_CHK_EN > 0u
73  if (perr == (INT8U *)0) { /* Validate 'perr' */
74  return ((void *)0);
75  }
76  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
77  *perr = OS_ERR_PEVENT_NULL;
78  return ((void *)0);
79  }
80 #endif
81  if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* Validate event block type */
82  *perr = OS_ERR_EVENT_TYPE;
83  return ((void *)0);
84  }
86  pq = (OS_Q *)pevent->OSEventPtr; /* Point at queue control block */
87  if (pq->OSQEntries > 0u) { /* See if any messages in the queue */
88  pmsg = *pq->OSQOut++; /* Yes, extract oldest message from the queue */
89  pq->OSQEntries--; /* Update the number of entries in the queue */
90  if (pq->OSQOut == pq->OSQEnd) { /* Wrap OUT pointer if we are at the end of the queue */
91  pq->OSQOut = pq->OSQStart;
92  }
93  *perr = OS_ERR_NONE;
94  } else {
95  *perr = OS_ERR_Q_EMPTY;
96  pmsg = (void *)0; /* Queue is empty */
97  }
99  return (pmsg); /* Return message received (or NULL) */
100 }
OS_EVENT* OSQCreate ( void **  start,
INT16U  size 
)

在文件 os_q.c122 行定义.

参考 OS_ENTER_CRITICAL, OS_EVENT_TYPE_Q, OS_EventWaitListInit(), OS_EXIT_CRITICAL, OS_EVENT::OSEventCnt, OSEventFreeList, OS_EVENT::OSEventName, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType, OSIntNesting, OS_Q::OSQEnd, OS_Q::OSQEntries, OSQFreeList, OS_Q::OSQIn, OS_Q::OSQOut, OS_Q::OSQPtr, OS_Q::OSQSize , 以及 OS_Q::OSQStart.

124 {
125  OS_EVENT *pevent;
126  OS_Q *pq;
127 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
128  OS_CPU_SR cpu_sr = 0u;
129 #endif
130 
131 
132 
133  if (OSIntNesting > 0u) { /* See if called from ISR ... */
134  return ((OS_EVENT *)0); /* ... can't CREATE from an ISR */
135  }
137  pevent = OSEventFreeList; /* Get next free event control block */
138  if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB pool was empty */
140  }
142  if (pevent != (OS_EVENT *)0) { /* See if we have an event control block */
144  pq = OSQFreeList; /* Get a free queue control block */
145  if (pq != (OS_Q *)0) { /* Were we able to get a queue control block ? */
146  OSQFreeList = OSQFreeList->OSQPtr; /* Yes, Adjust free list pointer to next free*/
148  pq->OSQStart = start; /* Initialize the queue */
149  pq->OSQEnd = &start[size];
150  pq->OSQIn = start;
151  pq->OSQOut = start;
152  pq->OSQSize = size;
153  pq->OSQEntries = 0u;
154  pevent->OSEventType = OS_EVENT_TYPE_Q;
155  pevent->OSEventCnt = 0u;
156  pevent->OSEventPtr = pq;
157 #if OS_EVENT_NAME_EN > 0u
158  pevent->OSEventName = (INT8U *)"?";
159 #endif
160  OS_EventWaitListInit(pevent); /* Initalize the wait list */
161  } else {
162  pevent->OSEventPtr = (void *)OSEventFreeList; /* No, Return event control block on error */
163  OSEventFreeList = pevent;
165  pevent = (OS_EVENT *)0;
166  }
167  }
168  return (pevent);
169 }

函数调用图:

OS_EVENT* OSQDel ( OS_EVENT pevent,
INT8U  opt,
INT8U perr 
)

在文件 os_q.c213 行定义.

参考 OS_DEL_ALWAYS, OS_DEL_NO_PEND, OS_ENTER_CRITICAL, OS_ERR_DEL_ISR, OS_ERR_EVENT_TYPE, OS_ERR_INVALID_OPT, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_TASK_WAITING, OS_EVENT_TYPE_Q, OS_EVENT_TYPE_UNUSED, OS_EventTaskRdy(), OS_EXIT_CRITICAL, OS_FALSE, OS_Sched(), OS_STAT_PEND_OK, OS_STAT_Q, OS_TRUE, OS_EVENT::OSEventCnt, OSEventFreeList, OS_EVENT::OSEventGrp, OS_EVENT::OSEventName, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType, OSIntNesting, OSQFreeList , 以及 OS_Q::OSQPtr.

216 {
217  BOOLEAN tasks_waiting;
218  OS_EVENT *pevent_return;
219  OS_Q *pq;
220 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
221  OS_CPU_SR cpu_sr = 0u;
222 #endif
223 
224 
225 
226 #if OS_ARG_CHK_EN > 0u
227  if (perr == (INT8U *)0) { /* Validate 'perr' */
228  return (pevent);
229  }
230  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
231  *perr = OS_ERR_PEVENT_NULL;
232  return (pevent);
233  }
234 #endif
235  if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
236  *perr = OS_ERR_EVENT_TYPE;
237  return (pevent);
238  }
239  if (OSIntNesting > 0u) { /* See if called from ISR ... */
240  *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
241  return (pevent);
242  }
244  if (pevent->OSEventGrp != 0u) { /* See if any tasks waiting on queue */
245  tasks_waiting = OS_TRUE; /* Yes */
246  } else {
247  tasks_waiting = OS_FALSE; /* No */
248  }
249  switch (opt) {
250  case OS_DEL_NO_PEND: /* Delete queue only if no task waiting */
251  if (tasks_waiting == OS_FALSE) {
252 #if OS_EVENT_NAME_EN > 0u
253  pevent->OSEventName = (INT8U *)"?";
254 #endif
255  pq = (OS_Q *)pevent->OSEventPtr; /* Return OS_Q to free list */
256  pq->OSQPtr = OSQFreeList;
257  OSQFreeList = pq;
259  pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
260  pevent->OSEventCnt = 0u;
261  OSEventFreeList = pevent; /* Get next free event control block */
263  *perr = OS_ERR_NONE;
264  pevent_return = (OS_EVENT *)0; /* Queue has been deleted */
265  } else {
267  *perr = OS_ERR_TASK_WAITING;
268  pevent_return = pevent;
269  }
270  break;
271 
272  case OS_DEL_ALWAYS: /* Always delete the queue */
273  while (pevent->OSEventGrp != 0u) { /* Ready ALL tasks waiting for queue */
274  (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q, OS_STAT_PEND_OK);
275  }
276 #if OS_EVENT_NAME_EN > 0u
277  pevent->OSEventName = (INT8U *)"?";
278 #endif
279  pq = (OS_Q *)pevent->OSEventPtr; /* Return OS_Q to free list */
280  pq->OSQPtr = OSQFreeList;
281  OSQFreeList = pq;
283  pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
284  pevent->OSEventCnt = 0u;
285  OSEventFreeList = pevent; /* Get next free event control block */
287  if (tasks_waiting == OS_TRUE) { /* Reschedule only if task(s) were waiting */
288  OS_Sched(); /* Find highest priority task ready to run */
289  }
290  *perr = OS_ERR_NONE;
291  pevent_return = (OS_EVENT *)0; /* Queue has been deleted */
292  break;
293 
294  default:
296  *perr = OS_ERR_INVALID_OPT;
297  pevent_return = pevent;
298  break;
299  }
300  return (pevent_return);
301 }

函数调用图:

INT8U OSQFlush ( OS_EVENT pevent)

在文件 os_q.c325 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_EVENT_TYPE_Q, OS_EXIT_CRITICAL, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType, OS_Q::OSQEntries, OS_Q::OSQIn, OS_Q::OSQOut , 以及 OS_Q::OSQStart.

326 {
327  OS_Q *pq;
328 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
329  OS_CPU_SR cpu_sr = 0u;
330 #endif
331 
332 
333 
334 #if OS_ARG_CHK_EN > 0u
335  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
336  return (OS_ERR_PEVENT_NULL);
337  }
338  if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
339  return (OS_ERR_EVENT_TYPE);
340  }
341 #endif
343  pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue storage structure */
344  pq->OSQIn = pq->OSQStart;
345  pq->OSQOut = pq->OSQStart;
346  pq->OSQEntries = 0u;
348  return (OS_ERR_NONE);
349 }
void* OSQPend ( OS_EVENT pevent,
INT32U  timeout,
INT8U perr 
)

在文件 os_q.c389 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PEND_ABORT, OS_ERR_PEND_ISR, OS_ERR_PEND_LOCKED, OS_ERR_PEVENT_NULL, OS_ERR_TIMEOUT, OS_EVENT_TYPE_Q, OS_EventTaskRemove(), OS_EventTaskWait(), OS_EXIT_CRITICAL, OS_Sched(), OS_STAT_PEND_ABORT, OS_STAT_PEND_OK, OS_STAT_PEND_TO, OS_STAT_Q, OS_STAT_RDY, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType, OSIntNesting, OSLockNesting, OS_Q::OSQEnd, OS_Q::OSQEntries, OS_Q::OSQOut, OS_Q::OSQStart, OSTCBCur, OS_TCB::OSTCBDly, OS_TCB::OSTCBEventMultiPtr, OS_TCB::OSTCBEventPtr, OS_TCB::OSTCBMsg, OS_TCB::OSTCBStat , 以及 OS_TCB::OSTCBStatPend.

392 {
393  void *pmsg;
394  OS_Q *pq;
395 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
396  OS_CPU_SR cpu_sr = 0u;
397 #endif
398 
399 
400 
401 #if OS_ARG_CHK_EN > 0u
402  if (perr == (INT8U *)0) { /* Validate 'perr' */
403  return ((void *)0);
404  }
405  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
406  *perr = OS_ERR_PEVENT_NULL;
407  return ((void *)0);
408  }
409 #endif
410  if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* Validate event block type */
411  *perr = OS_ERR_EVENT_TYPE;
412  return ((void *)0);
413  }
414  if (OSIntNesting > 0u) { /* See if called from ISR ... */
415  *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
416  return ((void *)0);
417  }
418  if (OSLockNesting > 0u) { /* See if called with scheduler locked ... */
419  *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
420  return ((void *)0);
421  }
423  pq = (OS_Q *)pevent->OSEventPtr; /* Point at queue control block */
424  if (pq->OSQEntries > 0u) { /* See if any messages in the queue */
425  pmsg = *pq->OSQOut++; /* Yes, extract oldest message from the queue */
426  pq->OSQEntries--; /* Update the number of entries in the queue */
427  if (pq->OSQOut == pq->OSQEnd) { /* Wrap OUT pointer if we are at the end of the queue */
428  pq->OSQOut = pq->OSQStart;
429  }
431  *perr = OS_ERR_NONE;
432  return (pmsg); /* Return message received */
433  }
434  OSTCBCur->OSTCBStat |= OS_STAT_Q; /* Task will have to pend for a message to be posted */
436  OSTCBCur->OSTCBDly = timeout; /* Load timeout into TCB */
437  OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
439  OS_Sched(); /* Find next highest priority task ready to run */
441  switch (OSTCBCur->OSTCBStatPend) { /* See if we timed-out or aborted */
442  case OS_STAT_PEND_OK: /* Extract message from TCB (Put there by QPost) */
443  pmsg = OSTCBCur->OSTCBMsg;
444  *perr = OS_ERR_NONE;
445  break;
446 
447  case OS_STAT_PEND_ABORT:
448  pmsg = (void *)0;
449  *perr = OS_ERR_PEND_ABORT; /* Indicate that we aborted */
450  break;
451 
452  case OS_STAT_PEND_TO:
453  default:
454  OS_EventTaskRemove(OSTCBCur, pevent);
455  pmsg = (void *)0;
456  *perr = OS_ERR_TIMEOUT; /* Indicate that we didn't get event within TO */
457  break;
458  }
459  OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Set task status to ready */
460  OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK; /* Clear pend status */
461  OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* Clear event pointers */
462 #if (OS_EVENT_MULTI_EN > 0u)
464 #endif
465  OSTCBCur->OSTCBMsg = (void *)0; /* Clear received message */
467  return (pmsg); /* Return received message */
468 }

函数调用图:

INT8U OSQPendAbort ( OS_EVENT pevent,
INT8U  opt,
INT8U perr 
)

在文件 os_q.c503 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PEND_ABORT, OS_ERR_PEVENT_NULL, OS_EVENT_TYPE_Q, OS_EventTaskRdy(), OS_EXIT_CRITICAL, OS_PEND_OPT_BROADCAST, OS_PEND_OPT_NONE, OS_Sched(), OS_STAT_PEND_ABORT, OS_STAT_Q, OS_EVENT::OSEventGrp , 以及 OS_EVENT::OSEventType.

506 {
507  INT8U nbr_tasks;
508 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
509  OS_CPU_SR cpu_sr = 0u;
510 #endif
511 
512 
513 
514 #if OS_ARG_CHK_EN > 0u
515  if (perr == (INT8U *)0) { /* Validate 'perr' */
516  return (0u);
517  }
518  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
519  *perr = OS_ERR_PEVENT_NULL;
520  return (0u);
521  }
522 #endif
523  if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
524  *perr = OS_ERR_EVENT_TYPE;
525  return (0u);
526  }
528  if (pevent->OSEventGrp != 0u) { /* See if any task waiting on queue? */
529  nbr_tasks = 0u;
530  switch (opt) {
531  case OS_PEND_OPT_BROADCAST: /* Do we need to abort ALL waiting tasks? */
532  while (pevent->OSEventGrp != 0u) { /* Yes, ready ALL tasks waiting on queue */
533  (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q, OS_STAT_PEND_ABORT);
534  nbr_tasks++;
535  }
536  break;
537 
538  case OS_PEND_OPT_NONE:
539  default: /* No, ready HPT waiting on queue */
540  (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q, OS_STAT_PEND_ABORT);
541  nbr_tasks++;
542  break;
543  }
545  OS_Sched(); /* Find HPT ready to run */
546  *perr = OS_ERR_PEND_ABORT;
547  return (nbr_tasks);
548  }
550  *perr = OS_ERR_NONE;
551  return (0u); /* No tasks waiting on queue */
552 }

函数调用图:

INT8U OSQPost ( OS_EVENT pevent,
void *  pmsg 
)

在文件 os_q.c576 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_Q_FULL, OS_EVENT_TYPE_Q, OS_EventTaskRdy(), OS_EXIT_CRITICAL, OS_Sched(), OS_STAT_PEND_OK, OS_STAT_Q, OS_EVENT::OSEventGrp, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType, OS_Q::OSQEnd, OS_Q::OSQEntries, OS_Q::OSQIn, OS_Q::OSQSize , 以及 OS_Q::OSQStart.

578 {
579  OS_Q *pq;
580 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
581  OS_CPU_SR cpu_sr = 0u;
582 #endif
583 
584 
585 
586 #if OS_ARG_CHK_EN > 0u
587  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
588  return (OS_ERR_PEVENT_NULL);
589  }
590 #endif
591  if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
592  return (OS_ERR_EVENT_TYPE);
593  }
595  if (pevent->OSEventGrp != 0u) { /* See if any task pending on queue */
596  /* Ready highest priority task waiting on event */
597  (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_Q, OS_STAT_PEND_OK);
599  OS_Sched(); /* Find highest priority task ready to run */
600  return (OS_ERR_NONE);
601  }
602  pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue control block */
603  if (pq->OSQEntries >= pq->OSQSize) { /* Make sure queue is not full */
605  return (OS_ERR_Q_FULL);
606  }
607  *pq->OSQIn++ = pmsg; /* Insert message into queue */
608  pq->OSQEntries++; /* Update the nbr of entries in the queue */
609  if (pq->OSQIn == pq->OSQEnd) { /* Wrap IN ptr if we are at end of queue */
610  pq->OSQIn = pq->OSQStart;
611  }
613  return (OS_ERR_NONE);
614 }

函数调用图:

INT8U OSQPostFront ( OS_EVENT pevent,
void *  pmsg 
)

在文件 os_q.c639 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_Q_FULL, OS_EVENT_TYPE_Q, OS_EventTaskRdy(), OS_EXIT_CRITICAL, OS_Sched(), OS_STAT_PEND_OK, OS_STAT_Q, OS_EVENT::OSEventGrp, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType, OS_Q::OSQEnd, OS_Q::OSQEntries, OS_Q::OSQOut, OS_Q::OSQSize , 以及 OS_Q::OSQStart.

641 {
642  OS_Q *pq;
643 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
644  OS_CPU_SR cpu_sr = 0u;
645 #endif
646 
647 
648 
649 #if OS_ARG_CHK_EN > 0u
650  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
651  return (OS_ERR_PEVENT_NULL);
652  }
653 #endif
654  if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
655  return (OS_ERR_EVENT_TYPE);
656  }
658  if (pevent->OSEventGrp != 0u) { /* See if any task pending on queue */
659  /* Ready highest priority task waiting on event */
660  (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_Q, OS_STAT_PEND_OK);
662  OS_Sched(); /* Find highest priority task ready to run */
663  return (OS_ERR_NONE);
664  }
665  pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue control block */
666  if (pq->OSQEntries >= pq->OSQSize) { /* Make sure queue is not full */
668  return (OS_ERR_Q_FULL);
669  }
670  if (pq->OSQOut == pq->OSQStart) { /* Wrap OUT ptr if we are at the 1st queue entry */
671  pq->OSQOut = pq->OSQEnd;
672  }
673  pq->OSQOut--;
674  *pq->OSQOut = pmsg; /* Insert message into queue */
675  pq->OSQEntries++; /* Update the nbr of entries in the queue */
677  return (OS_ERR_NONE);
678 }

函数调用图:

INT8U OSQPostOpt ( OS_EVENT pevent,
void *  pmsg,
INT8U  opt 
)

在文件 os_q.c711 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_Q_FULL, OS_EVENT_TYPE_Q, OS_EventTaskRdy(), OS_EXIT_CRITICAL, OS_POST_OPT_BROADCAST, OS_POST_OPT_FRONT, OS_POST_OPT_NO_SCHED, OS_Sched(), OS_STAT_PEND_OK, OS_STAT_Q, OS_EVENT::OSEventGrp, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType, OS_Q::OSQEnd, OS_Q::OSQEntries, OS_Q::OSQIn, OS_Q::OSQOut, OS_Q::OSQSize , 以及 OS_Q::OSQStart.

714 {
715  OS_Q *pq;
716 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
717  OS_CPU_SR cpu_sr = 0u;
718 #endif
719 
720 
721 
722 #if OS_ARG_CHK_EN > 0u
723  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
724  return (OS_ERR_PEVENT_NULL);
725  }
726 #endif
727  if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
728  return (OS_ERR_EVENT_TYPE);
729  }
731  if (pevent->OSEventGrp != 0x00u) { /* See if any task pending on queue */
732  if ((opt & OS_POST_OPT_BROADCAST) != 0x00u) { /* Do we need to post msg to ALL waiting tasks ? */
733  while (pevent->OSEventGrp != 0u) { /* Yes, Post to ALL tasks waiting on queue */
734  (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_Q, OS_STAT_PEND_OK);
735  }
736  } else { /* No, Post to HPT waiting on queue */
737  (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_Q, OS_STAT_PEND_OK);
738  }
740  if ((opt & OS_POST_OPT_NO_SCHED) == 0u) { /* See if scheduler needs to be invoked */
741  OS_Sched(); /* Find highest priority task ready to run */
742  }
743  return (OS_ERR_NONE);
744  }
745  pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue control block */
746  if (pq->OSQEntries >= pq->OSQSize) { /* Make sure queue is not full */
748  return (OS_ERR_Q_FULL);
749  }
750  if ((opt & OS_POST_OPT_FRONT) != 0x00u) { /* Do we post to the FRONT of the queue? */
751  if (pq->OSQOut == pq->OSQStart) { /* Yes, Post as LIFO, Wrap OUT pointer if we ... */
752  pq->OSQOut = pq->OSQEnd; /* ... are at the 1st queue entry */
753  }
754  pq->OSQOut--;
755  *pq->OSQOut = pmsg; /* Insert message into queue */
756  } else { /* No, Post as FIFO */
757  *pq->OSQIn++ = pmsg; /* Insert message into queue */
758  if (pq->OSQIn == pq->OSQEnd) { /* Wrap IN ptr if we are at end of queue */
759  pq->OSQIn = pq->OSQStart;
760  }
761  }
762  pq->OSQEntries++; /* Update the nbr of entries in the queue */
764  return (OS_ERR_NONE);
765 }

函数调用图:

INT8U OSQQuery ( OS_EVENT pevent,
OS_Q_DATA p_q_data 
)

在文件 os_q.c787 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PDATA_NULL, OS_ERR_PEVENT_NULL, OS_EVENT_TBL_SIZE, OS_EVENT_TYPE_Q, OS_EXIT_CRITICAL, OS_EVENT::OSEventGrp, OS_Q_DATA::OSEventGrp, OS_EVENT::OSEventPtr, OS_EVENT::OSEventTbl, OS_Q_DATA::OSEventTbl, OS_EVENT::OSEventType, OS_Q_DATA::OSMsg, OS_Q_DATA::OSNMsgs, OS_Q::OSQEntries, OS_Q::OSQOut, OS_Q::OSQSize , 以及 OS_Q_DATA::OSQSize.

789 {
790  OS_Q *pq;
791  INT8U i;
792 #if OS_LOWEST_PRIO <= 63u
793  INT8U *psrc;
794  INT8U *pdest;
795 #else
796  INT16U *psrc;
797  INT16U *pdest;
798 #endif
799 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
800  OS_CPU_SR cpu_sr = 0u;
801 #endif
802 
803 
804 
805 #if OS_ARG_CHK_EN > 0u
806  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
807  return (OS_ERR_PEVENT_NULL);
808  }
809  if (p_q_data == (OS_Q_DATA *)0) { /* Validate 'p_q_data' */
810  return (OS_ERR_PDATA_NULL);
811  }
812 #endif
813  if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
814  return (OS_ERR_EVENT_TYPE);
815  }
817  p_q_data->OSEventGrp = pevent->OSEventGrp; /* Copy message queue wait list */
818  psrc = &pevent->OSEventTbl[0];
819  pdest = &p_q_data->OSEventTbl[0];
820  for (i = 0u; i < OS_EVENT_TBL_SIZE; i++) {
821  *pdest++ = *psrc++;
822  }
823  pq = (OS_Q *)pevent->OSEventPtr;
824  if (pq->OSQEntries > 0u) {
825  p_q_data->OSMsg = *pq->OSQOut; /* Get next message to return if available */
826  } else {
827  p_q_data->OSMsg = (void *)0;
828  }
829  p_q_data->OSNMsgs = pq->OSQEntries;
830  p_q_data->OSQSize = pq->OSQSize;
832  return (OS_ERR_NONE);
833 }
INT16U OSSemAccept ( OS_EVENT pevent)

在文件 os_sem.c49 行定义.

参考 OS_ENTER_CRITICAL, OS_EVENT_TYPE_SEM, OS_EXIT_CRITICAL, OS_EVENT::OSEventCnt , 以及 OS_EVENT::OSEventType.

50 {
51  INT16U cnt;
52 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
53  OS_CPU_SR cpu_sr = 0u;
54 #endif
55 
56 
57 
58 #if OS_ARG_CHK_EN > 0u
59  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
60  return (0u);
61  }
62 #endif
63  if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
64  return (0u);
65  }
67  cnt = pevent->OSEventCnt;
68  if (cnt > 0u) { /* See if resource is available */
69  pevent->OSEventCnt--; /* Yes, decrement semaphore and notify caller */
70  }
72  return (cnt); /* Return semaphore count */
73 }
OS_EVENT* OSSemCreate ( INT16U  cnt)

在文件 os_sem.c94 行定义.

参考 OS_ENTER_CRITICAL, OS_EVENT_TYPE_SEM, OS_EventWaitListInit(), OS_EXIT_CRITICAL, OS_EVENT::OSEventCnt, OSEventFreeList, OS_EVENT::OSEventName, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType , 以及 OSIntNesting.

参考自 OSTmr_Init().

95 {
96  OS_EVENT *pevent;
97 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
98  OS_CPU_SR cpu_sr = 0u;
99 #endif
100 
101 
102 
103  if (OSIntNesting > 0u) { /* See if called from ISR ... */
104  return ((OS_EVENT *)0); /* ... can't CREATE from an ISR */
105  }
107  pevent = OSEventFreeList; /* Get next free event control block */
108  if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB pool was empty */
110  }
112  if (pevent != (OS_EVENT *)0) { /* Get an event control block */
113  pevent->OSEventType = OS_EVENT_TYPE_SEM;
114  pevent->OSEventCnt = cnt; /* Set semaphore value */
115  pevent->OSEventPtr = (void *)0; /* Unlink from ECB free list */
116 #if OS_EVENT_NAME_EN > 0u
117  pevent->OSEventName = (INT8U *)"?";
118 #endif
119  OS_EventWaitListInit(pevent); /* Initialize to 'nobody waiting' on sem. */
120  }
121  return (pevent);
122 }

函数调用图:

这是这个函数的调用关系图:

OS_EVENT* OSSemDel ( OS_EVENT pevent,
INT8U  opt,
INT8U perr 
)

在文件 os_sem.c163 行定义.

参考 OS_DEL_ALWAYS, OS_DEL_NO_PEND, OS_ENTER_CRITICAL, OS_ERR_DEL_ISR, OS_ERR_EVENT_TYPE, OS_ERR_INVALID_OPT, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_TASK_WAITING, OS_EVENT_TYPE_SEM, OS_EVENT_TYPE_UNUSED, OS_EventTaskRdy(), OS_EXIT_CRITICAL, OS_FALSE, OS_Sched(), OS_STAT_PEND_OK, OS_STAT_SEM, OS_TRUE, OS_EVENT::OSEventCnt, OSEventFreeList, OS_EVENT::OSEventGrp, OS_EVENT::OSEventName, OS_EVENT::OSEventPtr, OS_EVENT::OSEventType , 以及 OSIntNesting.

166 {
167  BOOLEAN tasks_waiting;
168  OS_EVENT *pevent_return;
169 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
170  OS_CPU_SR cpu_sr = 0u;
171 #endif
172 
173 
174 
175 #if OS_ARG_CHK_EN > 0u
176  if (perr == (INT8U *)0) { /* Validate 'perr' */
177  return (pevent);
178  }
179  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
180  *perr = OS_ERR_PEVENT_NULL;
181  return (pevent);
182  }
183 #endif
184  if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
185  *perr = OS_ERR_EVENT_TYPE;
186  return (pevent);
187  }
188  if (OSIntNesting > 0u) { /* See if called from ISR ... */
189  *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
190  return (pevent);
191  }
193  if (pevent->OSEventGrp != 0u) { /* See if any tasks waiting on semaphore */
194  tasks_waiting = OS_TRUE; /* Yes */
195  } else {
196  tasks_waiting = OS_FALSE; /* No */
197  }
198  switch (opt) {
199  case OS_DEL_NO_PEND: /* Delete semaphore only if no task waiting */
200  if (tasks_waiting == OS_FALSE) {
201 #if OS_EVENT_NAME_EN > 0u
202  pevent->OSEventName = (INT8U *)"?";
203 #endif
205  pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
206  pevent->OSEventCnt = 0u;
207  OSEventFreeList = pevent; /* Get next free event control block */
209  *perr = OS_ERR_NONE;
210  pevent_return = (OS_EVENT *)0; /* Semaphore has been deleted */
211  } else {
213  *perr = OS_ERR_TASK_WAITING;
214  pevent_return = pevent;
215  }
216  break;
217 
218  case OS_DEL_ALWAYS: /* Always delete the semaphore */
219  while (pevent->OSEventGrp != 0u) { /* Ready ALL tasks waiting for semaphore */
220  (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_OK);
221  }
222 #if OS_EVENT_NAME_EN > 0u
223  pevent->OSEventName = (INT8U *)"?";
224 #endif
226  pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
227  pevent->OSEventCnt = 0u;
228  OSEventFreeList = pevent; /* Get next free event control block */
230  if (tasks_waiting == OS_TRUE) { /* Reschedule only if task(s) were waiting */
231  OS_Sched(); /* Find highest priority task ready to run */
232  }
233  *perr = OS_ERR_NONE;
234  pevent_return = (OS_EVENT *)0; /* Semaphore has been deleted */
235  break;
236 
237  default:
239  *perr = OS_ERR_INVALID_OPT;
240  pevent_return = pevent;
241  break;
242  }
243  return (pevent_return);
244 }

函数调用图:

void OSSemPend ( OS_EVENT pevent,
INT32U  timeout,
INT8U perr 
)

在文件 os_sem.c280 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PEND_ABORT, OS_ERR_PEND_ISR, OS_ERR_PEND_LOCKED, OS_ERR_PEVENT_NULL, OS_ERR_TIMEOUT, OS_EVENT_TYPE_SEM, OS_EventTaskRemove(), OS_EventTaskWait(), OS_EXIT_CRITICAL, OS_Sched(), OS_STAT_PEND_ABORT, OS_STAT_PEND_OK, OS_STAT_PEND_TO, OS_STAT_RDY, OS_STAT_SEM, OS_EVENT::OSEventCnt, OS_EVENT::OSEventType, OSIntNesting, OSLockNesting, OSTCBCur, OS_TCB::OSTCBDly, OS_TCB::OSTCBEventMultiPtr, OS_TCB::OSTCBEventPtr, OS_TCB::OSTCBStat , 以及 OS_TCB::OSTCBStatPend.

参考自 OSTmr_Task().

283 {
284 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
285  OS_CPU_SR cpu_sr = 0u;
286 #endif
287 
288 
289 
290 #if OS_ARG_CHK_EN > 0u
291  if (perr == (INT8U *)0) { /* Validate 'perr' */
292  return;
293  }
294  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
295  *perr = OS_ERR_PEVENT_NULL;
296  return;
297  }
298 #endif
299  if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
300  *perr = OS_ERR_EVENT_TYPE;
301  return;
302  }
303  if (OSIntNesting > 0u) { /* See if called from ISR ... */
304  *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
305  return;
306  }
307  if (OSLockNesting > 0u) { /* See if called with scheduler locked ... */
308  *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
309  return;
310  }
312  if (pevent->OSEventCnt > 0u) { /* If sem. is positive, resource available ... */
313  pevent->OSEventCnt--; /* ... decrement semaphore only if positive. */
315  *perr = OS_ERR_NONE;
316  return;
317  }
318  /* Otherwise, must wait until event occurs */
319  OSTCBCur->OSTCBStat |= OS_STAT_SEM; /* Resource not available, pend on semaphore */
321  OSTCBCur->OSTCBDly = timeout; /* Store pend timeout in TCB */
322  OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
324  OS_Sched(); /* Find next highest priority task ready */
326  switch (OSTCBCur->OSTCBStatPend) { /* See if we timed-out or aborted */
327  case OS_STAT_PEND_OK:
328  *perr = OS_ERR_NONE;
329  break;
330 
331  case OS_STAT_PEND_ABORT:
332  *perr = OS_ERR_PEND_ABORT; /* Indicate that we aborted */
333  break;
334 
335  case OS_STAT_PEND_TO:
336  default:
337  OS_EventTaskRemove(OSTCBCur, pevent);
338  *perr = OS_ERR_TIMEOUT; /* Indicate that we didn't get event within TO */
339  break;
340  }
341  OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Set task status to ready */
342  OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK; /* Clear pend status */
343  OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* Clear event pointers */
344 #if (OS_EVENT_MULTI_EN > 0u)
346 #endif
348 }

函数调用图:

这是这个函数的调用关系图:

INT8U OSSemPendAbort ( OS_EVENT pevent,
INT8U  opt,
INT8U perr 
)

在文件 os_sem.c385 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PEND_ABORT, OS_ERR_PEVENT_NULL, OS_EVENT_TYPE_SEM, OS_EventTaskRdy(), OS_EXIT_CRITICAL, OS_PEND_OPT_BROADCAST, OS_PEND_OPT_NONE, OS_Sched(), OS_STAT_PEND_ABORT, OS_STAT_SEM, OS_EVENT::OSEventGrp , 以及 OS_EVENT::OSEventType.

388 {
389  INT8U nbr_tasks;
390 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
391  OS_CPU_SR cpu_sr = 0u;
392 #endif
393 
394 
395 
396 #if OS_ARG_CHK_EN > 0u
397  if (perr == (INT8U *)0) { /* Validate 'perr' */
398  return (0u);
399  }
400  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
401  *perr = OS_ERR_PEVENT_NULL;
402  return (0u);
403  }
404 #endif
405  if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
406  *perr = OS_ERR_EVENT_TYPE;
407  return (0u);
408  }
410  if (pevent->OSEventGrp != 0u) { /* See if any task waiting on semaphore? */
411  nbr_tasks = 0u;
412  switch (opt) {
413  case OS_PEND_OPT_BROADCAST: /* Do we need to abort ALL waiting tasks? */
414  while (pevent->OSEventGrp != 0u) { /* Yes, ready ALL tasks waiting on semaphore */
415  (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_ABORT);
416  nbr_tasks++;
417  }
418  break;
419 
420  case OS_PEND_OPT_NONE:
421  default: /* No, ready HPT waiting on semaphore */
422  (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_ABORT);
423  nbr_tasks++;
424  break;
425  }
427  OS_Sched(); /* Find HPT ready to run */
428  *perr = OS_ERR_PEND_ABORT;
429  return (nbr_tasks);
430  }
432  *perr = OS_ERR_NONE;
433  return (0); /* No tasks waiting on semaphore */
434 }

函数调用图:

INT8U OSSemPost ( OS_EVENT pevent)

在文件 os_sem.c456 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_SEM_OVF, OS_EVENT_TYPE_SEM, OS_EventTaskRdy(), OS_EXIT_CRITICAL, OS_Sched(), OS_STAT_PEND_OK, OS_STAT_SEM, OS_EVENT::OSEventCnt, OS_EVENT::OSEventGrp , 以及 OS_EVENT::OSEventType.

参考自 OSTmrSignal().

457 {
458 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
459  OS_CPU_SR cpu_sr = 0u;
460 #endif
461 
462 
463 
464 #if OS_ARG_CHK_EN > 0u
465  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
466  return (OS_ERR_PEVENT_NULL);
467  }
468 #endif
469  if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
470  return (OS_ERR_EVENT_TYPE);
471  }
473  if (pevent->OSEventGrp != 0u) { /* See if any task waiting for semaphore */
474  /* Ready HPT waiting on event */
475  (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_OK);
477  OS_Sched(); /* Find HPT ready to run */
478  return (OS_ERR_NONE);
479  }
480  if (pevent->OSEventCnt < 65535u) { /* Make sure semaphore will not overflow */
481  pevent->OSEventCnt++; /* Increment semaphore count to register event */
483  return (OS_ERR_NONE);
484  }
485  OS_EXIT_CRITICAL(); /* Semaphore value has reached its maximum */
486  return (OS_ERR_SEM_OVF);
487 }

函数调用图:

这是这个函数的调用关系图:

INT8U OSSemQuery ( OS_EVENT pevent,
OS_SEM_DATA p_sem_data 
)

在文件 os_sem.c510 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PDATA_NULL, OS_ERR_PEVENT_NULL, OS_EVENT_TBL_SIZE, OS_EVENT_TYPE_SEM, OS_EXIT_CRITICAL, OS_SEM_DATA::OSCnt, OS_EVENT::OSEventCnt, OS_EVENT::OSEventGrp, OS_SEM_DATA::OSEventGrp, OS_EVENT::OSEventTbl, OS_SEM_DATA::OSEventTbl , 以及 OS_EVENT::OSEventType.

512 {
513 #if OS_LOWEST_PRIO <= 63u
514  INT8U *psrc;
515  INT8U *pdest;
516 #else
517  INT16U *psrc;
518  INT16U *pdest;
519 #endif
520  INT8U i;
521 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
522  OS_CPU_SR cpu_sr = 0u;
523 #endif
524 
525 
526 
527 #if OS_ARG_CHK_EN > 0u
528  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
529  return (OS_ERR_PEVENT_NULL);
530  }
531  if (p_sem_data == (OS_SEM_DATA *)0) { /* Validate 'p_sem_data' */
532  return (OS_ERR_PDATA_NULL);
533  }
534 #endif
535  if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
536  return (OS_ERR_EVENT_TYPE);
537  }
539  p_sem_data->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list */
540  psrc = &pevent->OSEventTbl[0];
541  pdest = &p_sem_data->OSEventTbl[0];
542  for (i = 0u; i < OS_EVENT_TBL_SIZE; i++) {
543  *pdest++ = *psrc++;
544  }
545  p_sem_data->OSCnt = pevent->OSEventCnt; /* Get semaphore count */
547  return (OS_ERR_NONE);
548 }
void OSSemSet ( OS_EVENT pevent,
INT16U  cnt,
INT8U perr 
)

在文件 os_sem.c577 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_EVENT_TYPE, OS_ERR_NONE, OS_ERR_PEVENT_NULL, OS_ERR_TASK_WAITING, OS_EVENT_TYPE_SEM, OS_EXIT_CRITICAL, OS_EVENT::OSEventCnt, OS_EVENT::OSEventGrp , 以及 OS_EVENT::OSEventType.

580 {
581 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
582  OS_CPU_SR cpu_sr = 0u;
583 #endif
584 
585 
586 
587 #if OS_ARG_CHK_EN > 0u
588  if (perr == (INT8U *)0) { /* Validate 'perr' */
589  return;
590  }
591  if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
592  *perr = OS_ERR_PEVENT_NULL;
593  return;
594  }
595 #endif
596  if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
597  *perr = OS_ERR_EVENT_TYPE;
598  return;
599  }
601  *perr = OS_ERR_NONE;
602  if (pevent->OSEventCnt > 0u) { /* See if semaphore already has a count */
603  pevent->OSEventCnt = cnt; /* Yes, set it to the new value specified. */
604  } else { /* No */
605  if (pevent->OSEventGrp == 0u) { /* See if task(s) waiting? */
606  pevent->OSEventCnt = cnt; /* No, OK to set the value */
607  } else {
608  *perr = OS_ERR_TASK_WAITING;
609  }
610  }
612 }
INT8U OSTaskChangePrio ( INT8U  oldprio,
INT8U  newprio 
)

在文件 os_task.c51 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_NONE, OS_ERR_PRIO, OS_ERR_PRIO_EXIST, OS_ERR_PRIO_INVALID, OS_ERR_TASK_NOT_EXIST, OS_EXIT_CRITICAL, OS_LOWEST_PRIO, OS_PRIO_SELF, OS_Sched(), OS_TCB_RESERVED, OS_TRUE, OS_EVENT::OSEventGrp, OS_EVENT::OSEventTbl, OSRdyGrp, OSRdyTbl, OSRunning, OS_TCB::OSTCBBitX, OS_TCB::OSTCBBitY, OSTCBCur, OS_TCB::OSTCBEventMultiPtr, OS_TCB::OSTCBEventPtr, OS_TCB::OSTCBPrio, OSTCBPrioTbl, OS_TCB::OSTCBX , 以及 OS_TCB::OSTCBY.

53 {
54 #if (OS_EVENT_EN)
55  OS_EVENT *pevent;
56 #if (OS_EVENT_MULTI_EN > 0u)
57  OS_EVENT **pevents;
58 #endif
59 #endif
60  OS_TCB *ptcb;
61  INT8U y_new;
62  INT8U x_new;
63  INT8U y_old;
64 #if OS_LOWEST_PRIO <= 63u
65  INT8U bity_new;
66  INT8U bitx_new;
67  INT8U bity_old;
68  INT8U bitx_old;
69 #else
70  INT16U bity_new;
71  INT16U bitx_new;
72  INT16U bity_old;
73  INT16U bitx_old;
74 #endif
75 #if OS_CRITICAL_METHOD == 3u
76  OS_CPU_SR cpu_sr = 0u; /* Storage for CPU status register */
77 #endif
78 
79 
80 /*$PAGE*/
81 #if OS_ARG_CHK_EN > 0u
82  if (oldprio >= OS_LOWEST_PRIO) {
83  if (oldprio != OS_PRIO_SELF) {
84  return (OS_ERR_PRIO_INVALID);
85  }
86  }
87  if (newprio >= OS_LOWEST_PRIO) {
88  return (OS_ERR_PRIO_INVALID);
89  }
90 #endif
92  if (OSTCBPrioTbl[newprio] != (OS_TCB *)0) { /* New priority must not already exist */
94  return (OS_ERR_PRIO_EXIST);
95  }
96  if (oldprio == OS_PRIO_SELF) { /* See if changing self */
97  oldprio = OSTCBCur->OSTCBPrio; /* Yes, get priority */
98  }
99  ptcb = OSTCBPrioTbl[oldprio];
100  if (ptcb == (OS_TCB *)0) { /* Does task to change exist? */
101  OS_EXIT_CRITICAL(); /* No, can't change its priority! */
102  return (OS_ERR_PRIO);
103  }
104  if (ptcb == OS_TCB_RESERVED) { /* Is task assigned to Mutex */
105  OS_EXIT_CRITICAL(); /* No, can't change its priority! */
106  return (OS_ERR_TASK_NOT_EXIST);
107  }
108 #if OS_LOWEST_PRIO <= 63u
109  y_new = (INT8U)(newprio >> 3); /* Yes, compute new TCB fields */
110  x_new = (INT8U)(newprio & 0x07);
111  bity_new = (INT8U)(1u << y_new);
112  bitx_new = (INT8U)(1u << x_new);
113 #else
114  y_new = (INT8U)((newprio >> 4) & 0x0F);
115  x_new = (INT8U)( newprio & 0x0F);
116  bity_new = (INT16U)(1u << y_new);
117  bitx_new = (INT16U)(1u << x_new);
118 #endif
119 
120  OSTCBPrioTbl[oldprio] = (OS_TCB *)0; /* Remove TCB from old priority */
121  OSTCBPrioTbl[newprio] = ptcb; /* Place pointer to TCB @ new priority */
122  y_old = ptcb->OSTCBY;
123  bity_old = ptcb->OSTCBBitY;
124  bitx_old = ptcb->OSTCBBitX;
125  if ((OSRdyTbl[y_old] & bitx_old) != 0u) { /* If task is ready make it not */
126  OSRdyTbl[y_old] &= ~bitx_old;
127  if (OSRdyTbl[y_old] == 0u) {
128  OSRdyGrp &= ~bity_old;
129  }
130  OSRdyGrp |= bity_new; /* Make new priority ready to run */
131  OSRdyTbl[y_new] |= bitx_new;
132  }
133 
134 #if (OS_EVENT_EN)
135  pevent = ptcb->OSTCBEventPtr;
136  if (pevent != (OS_EVENT *)0) {
137  pevent->OSEventTbl[y_old] &= ~bitx_old; /* Remove old task prio from wait list */
138  if (pevent->OSEventTbl[y_old] == 0u) {
139  pevent->OSEventGrp &= ~bity_old;
140  }
141  pevent->OSEventGrp |= bity_new; /* Add new task prio to wait list */
142  pevent->OSEventTbl[y_new] |= bitx_new;
143  }
144 #if (OS_EVENT_MULTI_EN > 0u)
145  if (ptcb->OSTCBEventMultiPtr != (OS_EVENT **)0) {
146  pevents = ptcb->OSTCBEventMultiPtr;
147  pevent = *pevents;
148  while (pevent != (OS_EVENT *)0) {
149  pevent->OSEventTbl[y_old] &= ~bitx_old; /* Remove old task prio from wait lists */
150  if (pevent->OSEventTbl[y_old] == 0u) {
151  pevent->OSEventGrp &= ~bity_old;
152  }
153  pevent->OSEventGrp |= bity_new; /* Add new task prio to wait lists */
154  pevent->OSEventTbl[y_new] |= bitx_new;
155  pevents++;
156  pevent = *pevents;
157  }
158  }
159 #endif
160 #endif
161 
162  ptcb->OSTCBPrio = newprio; /* Set new task priority */
163  ptcb->OSTCBY = y_new;
164  ptcb->OSTCBX = x_new;
165  ptcb->OSTCBBitY = bity_new;
166  ptcb->OSTCBBitX = bitx_new;
168  if (OSRunning == OS_TRUE) {
169  OS_Sched(); /* Find new highest priority task */
170  }
171  return (OS_ERR_NONE);
172 }

函数调用图:

INT8U OSTaskCreate ( void(*)(void *p_arg)  task,
void *  p_arg,
OS_STK ptos,
INT8U  prio 
)

在文件 os_task.c216 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_NONE, OS_ERR_PRIO_EXIST, OS_ERR_PRIO_INVALID, OS_ERR_TASK_CREATE_ISR, OS_EXIT_CRITICAL, OS_LOWEST_PRIO, OS_Sched(), OS_TCB_RESERVED, OS_TCBInit(), OS_TRUE, OSIntNesting, OSRunning, OSTaskStkInit() , 以及 OSTCBPrioTbl.

参考自 OS_InitTaskIdle(), OS_InitTaskStat() , 以及 OSTmr_InitTask().

220 {
221  OS_STK *psp;
222  INT8U err;
223 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
224  OS_CPU_SR cpu_sr = 0u;
225 #endif
226 
227 
228 
229 #if OS_ARG_CHK_EN > 0u
230  if (prio > OS_LOWEST_PRIO) { /* Make sure priority is within allowable range */
231  return (OS_ERR_PRIO_INVALID);
232  }
233 #endif
235  if (OSIntNesting > 0u) { /* Make sure we don't create the task from within an ISR */
237  return (OS_ERR_TASK_CREATE_ISR);
238  }
239  if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority */
240  OSTCBPrioTbl[prio] = OS_TCB_RESERVED;/* Reserve the priority to prevent others from doing ... */
241  /* ... the same thing until task is created. */
243  psp = OSTaskStkInit(task, p_arg, ptos, 0u); /* Initialize the task's stack */
244  err = OS_TCBInit(prio, psp, (OS_STK *)0, 0u, 0u, (void *)0, 0u);
245  if (err == OS_ERR_NONE) {
246  if (OSRunning == OS_TRUE) { /* Find highest priority task if multitasking has started */
247  OS_Sched();
248  }
249  } else {
251  OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others */
253  }
254  return (err);
255  }
257  return (OS_ERR_PRIO_EXIST);
258 }

函数调用图:

这是这个函数的调用关系图:

INT8U OSTaskCreateExt ( void(*)(void *p_arg)  task,
void *  p_arg,
OS_STK ptos,
INT8U  prio,
INT16U  id,
OS_STK pbos,
INT32U  stk_size,
void *  pext,
INT16U  opt 
)

在文件 os_task.c332 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_NONE, OS_ERR_PRIO_EXIST, OS_ERR_PRIO_INVALID, OS_ERR_TASK_CREATE_ISR, OS_EXIT_CRITICAL, OS_LOWEST_PRIO, OS_Sched(), OS_TaskStkClr(), OS_TCB_RESERVED, OS_TCBInit(), OS_TRUE, OSIntNesting, OSRunning, OSTaskStkInit() , 以及 OSTCBPrioTbl.

参考自 App_TaskCreate(), main(), OS_InitTaskIdle(), OS_InitTaskStat() , 以及 OSTmr_InitTask().

341 {
342  OS_STK *psp;
343  INT8U err;
344 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
345  OS_CPU_SR cpu_sr = 0u;
346 #endif
347 
348 
349 
350 #if OS_ARG_CHK_EN > 0u
351  if (prio > OS_LOWEST_PRIO) { /* Make sure priority is within allowable range */
352  return (OS_ERR_PRIO_INVALID);
353  }
354 #endif
356  if (OSIntNesting > 0u) { /* Make sure we don't create the task from within an ISR */
358  return (OS_ERR_TASK_CREATE_ISR);
359  }
360  if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority */
361  OSTCBPrioTbl[prio] = OS_TCB_RESERVED;/* Reserve the priority to prevent others from doing ... */
362  /* ... the same thing until task is created. */
364 
365 #if (OS_TASK_STAT_STK_CHK_EN > 0u)
366  OS_TaskStkClr(pbos, stk_size, opt); /* Clear the task stack (if needed) */
367 #endif
368 
369  psp = OSTaskStkInit(task, p_arg, ptos, opt); /* Initialize the task's stack */
370  err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt);
371  if (err == OS_ERR_NONE) {
372  if (OSRunning == OS_TRUE) { /* Find HPT if multitasking has started */
373  OS_Sched();
374  }
375  } else {
377  OSTCBPrioTbl[prio] = (OS_TCB *)0; /* Make this priority avail. to others */
379  }
380  return (err);
381  }
383  return (OS_ERR_PRIO_EXIST);
384 }

函数调用图:

这是这个函数的调用关系图:

INT8U OSTaskDel ( INT8U  prio)

在文件 os_task.c424 行定义.

参考 OS_Dummy(), OS_ENTER_CRITICAL, OS_ERR_NONE, OS_ERR_PRIO_INVALID, OS_ERR_TASK_DEL, OS_ERR_TASK_DEL_IDLE, OS_ERR_TASK_DEL_ISR, OS_ERR_TASK_NOT_EXIST, OS_EventTaskRemove(), OS_EventTaskRemoveMulti(), OS_EXIT_CRITICAL, OS_FlagUnlink(), OS_LOWEST_PRIO, OS_PRIO_SELF, OS_Sched(), OS_STAT_PEND_OK, OS_STAT_RDY, OS_TASK_IDLE_PRIO, OS_TCB_RESERVED, OS_TRUE, OSIntNesting, OSLockNesting, OSRdyGrp, OSRdyTbl, OSRunning, OSTaskCtr, OSTaskDelHook(), OS_TCB::OSTCBBitX, OS_TCB::OSTCBBitY, OSTCBCur, OS_TCB::OSTCBDly, OS_TCB::OSTCBEventMultiPtr, OS_TCB::OSTCBEventPtr, OS_TCB::OSTCBFlagNode, OSTCBFreeList, OSTCBList, OS_TCB::OSTCBNext, OS_TCB::OSTCBPrev, OS_TCB::OSTCBPrio, OSTCBPrioTbl, OS_TCB::OSTCBStat, OS_TCB::OSTCBStatPend, OS_TCB::OSTCBTaskName , 以及 OS_TCB::OSTCBY.

参考自 OS_TaskReturn().

425 {
426 #if (OS_FLAG_EN > 0u) && (OS_MAX_FLAGS > 0u)
427  OS_FLAG_NODE *pnode;
428 #endif
429  OS_TCB *ptcb;
430 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
431  OS_CPU_SR cpu_sr = 0u;
432 #endif
433 
434 
435 
436  if (OSIntNesting > 0u) { /* See if trying to delete from ISR */
437  return (OS_ERR_TASK_DEL_ISR);
438  }
439  if (prio == OS_TASK_IDLE_PRIO) { /* Not allowed to delete idle task */
440  return (OS_ERR_TASK_DEL_IDLE);
441  }
442 #if OS_ARG_CHK_EN > 0u
443  if (prio >= OS_LOWEST_PRIO) { /* Task priority valid ? */
444  if (prio != OS_PRIO_SELF) {
445  return (OS_ERR_PRIO_INVALID);
446  }
447  }
448 #endif
449 
450 /*$PAGE*/
452  if (prio == OS_PRIO_SELF) { /* See if requesting to delete self */
453  prio = OSTCBCur->OSTCBPrio; /* Set priority to delete to current */
454  }
455  ptcb = OSTCBPrioTbl[prio];
456  if (ptcb == (OS_TCB *)0) { /* Task to delete must exist */
458  return (OS_ERR_TASK_NOT_EXIST);
459  }
460  if (ptcb == OS_TCB_RESERVED) { /* Must not be assigned to Mutex */
462  return (OS_ERR_TASK_DEL);
463  }
464 
465  OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX;
466  if (OSRdyTbl[ptcb->OSTCBY] == 0u) { /* Make task not ready */
467  OSRdyGrp &= ~ptcb->OSTCBBitY;
468  }
469 
470 #if (OS_EVENT_EN)
471  if (ptcb->OSTCBEventPtr != (OS_EVENT *)0) {
472  OS_EventTaskRemove(ptcb, ptcb->OSTCBEventPtr); /* Remove this task from any event wait list */
473  }
474 #if (OS_EVENT_MULTI_EN > 0u)
475  if (ptcb->OSTCBEventMultiPtr != (OS_EVENT **)0) { /* Remove this task from any events' wait lists*/
477  }
478 #endif
479 #endif
480 
481 #if (OS_FLAG_EN > 0u) && (OS_MAX_FLAGS > 0u)
482  pnode = ptcb->OSTCBFlagNode;
483  if (pnode != (OS_FLAG_NODE *)0) { /* If task is waiting on event flag */
484  OS_FlagUnlink(pnode); /* Remove from wait list */
485  }
486 #endif
487 
488  ptcb->OSTCBDly = 0u; /* Prevent OSTimeTick() from updating */
489  ptcb->OSTCBStat = OS_STAT_RDY; /* Prevent task from being resumed */
491  if (OSLockNesting < 255u) { /* Make sure we don't context switch */
492  OSLockNesting++;
493  }
494  OS_EXIT_CRITICAL(); /* Enabling INT. ignores next instruc. */
495  OS_Dummy(); /* ... Dummy ensures that INTs will be */
496  OS_ENTER_CRITICAL(); /* ... disabled HERE! */
497  if (OSLockNesting > 0u) { /* Remove context switch lock */
498  OSLockNesting--;
499  }
500  OSTaskDelHook(ptcb); /* Call user defined hook */
501  OSTaskCtr--; /* One less task being managed */
502  OSTCBPrioTbl[prio] = (OS_TCB *)0; /* Clear old priority entry */
503  if (ptcb->OSTCBPrev == (OS_TCB *)0) { /* Remove from TCB chain */
504  ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0;
505  OSTCBList = ptcb->OSTCBNext;
506  } else {
507  ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;
508  ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;
509  }
510  ptcb->OSTCBNext = OSTCBFreeList; /* Return TCB to free TCB list */
511  OSTCBFreeList = ptcb;
512 #if OS_TASK_NAME_EN > 0u
513  ptcb->OSTCBTaskName = (INT8U *)"?";
514 #endif
516  if (OSRunning == OS_TRUE) {
517  OS_Sched(); /* Find new highest priority task */
518  }
519  return (OS_ERR_NONE);
520 }

函数调用图:

这是这个函数的调用关系图:

INT8U OSTaskDelReq ( INT8U  prio)

在文件 os_task.c570 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_NONE, OS_ERR_PRIO_INVALID, OS_ERR_TASK_DEL, OS_ERR_TASK_DEL_IDLE, OS_ERR_TASK_DEL_REQ, OS_ERR_TASK_NOT_EXIST, OS_EXIT_CRITICAL, OS_LOWEST_PRIO, OS_PRIO_SELF, OS_TASK_IDLE_PRIO, OS_TCB_RESERVED, OSTCBCur, OS_TCB::OSTCBDelReq , 以及 OSTCBPrioTbl.

571 {
572  INT8U stat;
573  OS_TCB *ptcb;
574 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
575  OS_CPU_SR cpu_sr = 0u;
576 #endif
577 
578 
579 
580  if (prio == OS_TASK_IDLE_PRIO) { /* Not allowed to delete idle task */
581  return (OS_ERR_TASK_DEL_IDLE);
582  }
583 #if OS_ARG_CHK_EN > 0u
584  if (prio >= OS_LOWEST_PRIO) { /* Task priority valid ? */
585  if (prio != OS_PRIO_SELF) {
586  return (OS_ERR_PRIO_INVALID);
587  }
588  }
589 #endif
590  if (prio == OS_PRIO_SELF) { /* See if a task is requesting to ... */
591  OS_ENTER_CRITICAL(); /* ... this task to delete itself */
592  stat = OSTCBCur->OSTCBDelReq; /* Return request status to caller */
594  return (stat);
595  }
597  ptcb = OSTCBPrioTbl[prio];
598  if (ptcb == (OS_TCB *)0) { /* Task to delete must exist */
600  return (OS_ERR_TASK_NOT_EXIST); /* Task must already be deleted */
601  }
602  if (ptcb == OS_TCB_RESERVED) { /* Must NOT be assigned to a Mutex */
604  return (OS_ERR_TASK_DEL);
605  }
606  ptcb->OSTCBDelReq = OS_ERR_TASK_DEL_REQ; /* Set flag indicating task to be DEL. */
608  return (OS_ERR_NONE);
609 }
INT8U OSTaskNameGet ( INT8U  prio,
INT8U **  pname,
INT8U perr 
)

在文件 os_task.c637 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_NAME_GET_ISR, OS_ERR_NONE, OS_ERR_PNAME_NULL, OS_ERR_PRIO_INVALID, OS_ERR_TASK_NOT_EXIST, OS_EXIT_CRITICAL, OS_LOWEST_PRIO, OS_PRIO_SELF, OS_StrLen(), OS_TCB_RESERVED, OSIntNesting, OSTCBCur, OS_TCB::OSTCBPrio, OSTCBPrioTbl , 以及 OS_TCB::OSTCBTaskName.

640 {
641  OS_TCB *ptcb;
642  INT8U len;
643 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
644  OS_CPU_SR cpu_sr = 0u;
645 #endif
646 
647 
648 
649 #if OS_ARG_CHK_EN > 0u
650  if (perr == (INT8U *)0) { /* Validate 'perr' */
651  return (0u);
652  }
653  if (prio > OS_LOWEST_PRIO) { /* Task priority valid ? */
654  if (prio != OS_PRIO_SELF) {
655  *perr = OS_ERR_PRIO_INVALID; /* No */
656  return (0u);
657  }
658  }
659  if (pname == (INT8U **)0) { /* Is 'pname' a NULL pointer? */
660  *perr = OS_ERR_PNAME_NULL; /* Yes */
661  return (0u);
662  }
663 #endif
664  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
665  *perr = OS_ERR_NAME_GET_ISR;
666  return (0u);
667  }
669  if (prio == OS_PRIO_SELF) { /* See if caller desires it's own name */
670  prio = OSTCBCur->OSTCBPrio;
671  }
672  ptcb = OSTCBPrioTbl[prio];
673  if (ptcb == (OS_TCB *)0) { /* Does task exist? */
674  OS_EXIT_CRITICAL(); /* No */
675  *perr = OS_ERR_TASK_NOT_EXIST;
676  return (0u);
677  }
678  if (ptcb == OS_TCB_RESERVED) { /* Task assigned to a Mutex? */
679  OS_EXIT_CRITICAL(); /* Yes */
680  *perr = OS_ERR_TASK_NOT_EXIST;
681  return (0u);
682  }
683  *pname = ptcb->OSTCBTaskName;
684  len = OS_StrLen(*pname);
686  *perr = OS_ERR_NONE;
687  return (len);
688 }

函数调用图:

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

在文件 os_task.c715 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_NAME_SET_ISR, OS_ERR_NONE, OS_ERR_PNAME_NULL, OS_ERR_PRIO_INVALID, OS_ERR_TASK_NOT_EXIST, OS_EXIT_CRITICAL, OS_LOWEST_PRIO, OS_PRIO_SELF, OS_TCB_RESERVED, OSIntNesting, OSTCBCur, OS_TCB::OSTCBPrio, OSTCBPrioTbl , 以及 OS_TCB::OSTCBTaskName.

参考自 App_TaskCreate(), main(), OS_InitTaskIdle(), OS_InitTaskStat() , 以及 OSTmr_InitTask().

718 {
719  OS_TCB *ptcb;
720 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
721  OS_CPU_SR cpu_sr = 0u;
722 #endif
723 
724 
725 
726 #if OS_ARG_CHK_EN > 0u
727  if (perr == (INT8U *)0) { /* Validate 'perr' */
728  return;
729  }
730  if (prio > OS_LOWEST_PRIO) { /* Task priority valid ? */
731  if (prio != OS_PRIO_SELF) {
732  *perr = OS_ERR_PRIO_INVALID; /* No */
733  return;
734  }
735  }
736  if (pname == (INT8U *)0) { /* Is 'pname' a NULL pointer? */
737  *perr = OS_ERR_PNAME_NULL; /* Yes */
738  return;
739  }
740 #endif
741  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
742  *perr = OS_ERR_NAME_SET_ISR;
743  return;
744  }
746  if (prio == OS_PRIO_SELF) { /* See if caller desires to set it's own name */
747  prio = OSTCBCur->OSTCBPrio;
748  }
749  ptcb = OSTCBPrioTbl[prio];
750  if (ptcb == (OS_TCB *)0) { /* Does task exist? */
751  OS_EXIT_CRITICAL(); /* No */
752  *perr = OS_ERR_TASK_NOT_EXIST;
753  return;
754  }
755  if (ptcb == OS_TCB_RESERVED) { /* Task assigned to a Mutex? */
756  OS_EXIT_CRITICAL(); /* Yes */
757  *perr = OS_ERR_TASK_NOT_EXIST;
758  return;
759  }
760  ptcb->OSTCBTaskName = pname;
762  *perr = OS_ERR_NONE;
763 }

这是这个函数的调用关系图:

INT8U OSTaskResume ( INT8U  prio)

在文件 os_task.c786 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_NONE, OS_ERR_PRIO_INVALID, OS_ERR_TASK_NOT_EXIST, OS_ERR_TASK_NOT_SUSPENDED, OS_ERR_TASK_RESUME_PRIO, OS_EXIT_CRITICAL, OS_LOWEST_PRIO, OS_Sched(), OS_STAT_RDY, OS_STAT_SUSPEND, OS_TCB_RESERVED, OS_TRUE, OSRdyGrp, OSRdyTbl, OSRunning, OS_TCB::OSTCBBitX, OS_TCB::OSTCBBitY, OS_TCB::OSTCBDly, OSTCBPrioTbl, OS_TCB::OSTCBStat , 以及 OS_TCB::OSTCBY.

787 {
788  OS_TCB *ptcb;
789 #if OS_CRITICAL_METHOD == 3u /* Storage for CPU status register */
790  OS_CPU_SR cpu_sr = 0u;
791 #endif
792 
793 
794 
795 #if OS_ARG_CHK_EN > 0u
796  if (prio >= OS_LOWEST_PRIO) { /* Make sure task priority is valid */
797  return (OS_ERR_PRIO_INVALID);
798  }
799 #endif
801  ptcb = OSTCBPrioTbl[prio];
802  if (ptcb == (OS_TCB *)0) { /* Task to suspend must exist */
804  return (OS_ERR_TASK_RESUME_PRIO);
805  }
806  if (ptcb == OS_TCB_RESERVED) { /* See if assigned to Mutex */
808  return (OS_ERR_TASK_NOT_EXIST);
809  }
810  if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) != OS_STAT_RDY) { /* Task must be suspended */
811  ptcb->OSTCBStat &= ~(INT8U)OS_STAT_SUSPEND; /* Remove suspension */
812  if (ptcb->OSTCBStat == OS_STAT_RDY) { /* See if task is now ready */
813  if (ptcb->OSTCBDly == 0u) {
814  OSRdyGrp |= ptcb->OSTCBBitY; /* Yes, Make task ready to run */
815  OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
817  if (OSRunning == OS_TRUE) {
818  OS_Sched(); /* Find new highest priority task */
819  }
820  } else {
822  }
823  } else { /* Must be pending on event */
825  }
826  return (OS_ERR_NONE);
827  }
829  return (OS_ERR_TASK_NOT_SUSPENDED);
830 }

函数调用图:

INT8U OSTaskSuspend ( INT8U  prio)

在文件 os_task.c938 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_NONE, OS_ERR_PRIO_INVALID, OS_ERR_TASK_NOT_EXIST, OS_ERR_TASK_SUSPEND_IDLE, OS_ERR_TASK_SUSPEND_PRIO, OS_EXIT_CRITICAL, OS_FALSE, OS_LOWEST_PRIO, OS_PRIO_SELF, OS_Sched(), OS_STAT_SUSPEND, OS_TASK_IDLE_PRIO, OS_TCB_RESERVED, OS_TRUE, OSRdyGrp, OSRdyTbl, OS_TCB::OSTCBBitX, OS_TCB::OSTCBBitY, OSTCBCur, OS_TCB::OSTCBPrio, OSTCBPrioTbl, OS_TCB::OSTCBStat , 以及 OS_TCB::OSTCBY.

参考自 OS_TaskStat().

939 {
940  BOOLEAN self;
941  OS_TCB *ptcb;
942  INT8U y;
943 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
944  OS_CPU_SR cpu_sr = 0u;
945 #endif
946 
947 
948 
949 #if OS_ARG_CHK_EN > 0u
950  if (prio == OS_TASK_IDLE_PRIO) { /* Not allowed to suspend idle task */
951  return (OS_ERR_TASK_SUSPEND_IDLE);
952  }
953  if (prio >= OS_LOWEST_PRIO) { /* Task priority valid ? */
954  if (prio != OS_PRIO_SELF) {
955  return (OS_ERR_PRIO_INVALID);
956  }
957  }
958 #endif
960  if (prio == OS_PRIO_SELF) { /* See if suspend SELF */
961  prio = OSTCBCur->OSTCBPrio;
962  self = OS_TRUE;
963  } else if (prio == OSTCBCur->OSTCBPrio) { /* See if suspending self */
964  self = OS_TRUE;
965  } else {
966  self = OS_FALSE; /* No suspending another task */
967  }
968  ptcb = OSTCBPrioTbl[prio];
969  if (ptcb == (OS_TCB *)0) { /* Task to suspend must exist */
971  return (OS_ERR_TASK_SUSPEND_PRIO);
972  }
973  if (ptcb == OS_TCB_RESERVED) { /* See if assigned to Mutex */
975  return (OS_ERR_TASK_NOT_EXIST);
976  }
977  y = ptcb->OSTCBY;
978  OSRdyTbl[y] &= ~ptcb->OSTCBBitX; /* Make task not ready */
979  if (OSRdyTbl[y] == 0u) {
980  OSRdyGrp &= ~ptcb->OSTCBBitY;
981  }
982  ptcb->OSTCBStat |= OS_STAT_SUSPEND; /* Status of task is 'SUSPENDED' */
984  if (self == OS_TRUE) { /* Context switch only if SELF */
985  OS_Sched(); /* Find new highest priority task */
986  }
987  return (OS_ERR_NONE);
988 }

函数调用图:

这是这个函数的调用关系图:

INT8U OSTaskStkChk ( INT8U  prio,
OS_STK_DATA p_stk_data 
)

在文件 os_task.c853 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_NONE, OS_ERR_PDATA_NULL, OS_ERR_PRIO_INVALID, OS_ERR_TASK_NOT_EXIST, OS_ERR_TASK_OPT, OS_EXIT_CRITICAL, OS_LOWEST_PRIO, OS_PRIO_SELF, OS_TASK_OPT_STK_CHK, OS_TCB_RESERVED, OS_STK_DATA::OSFree, OSTCBCur, OS_TCB::OSTCBOpt, OS_TCB::OSTCBPrio, OSTCBPrioTbl, OS_TCB::OSTCBStkBottom, OS_TCB::OSTCBStkSize , 以及 OS_STK_DATA::OSUsed.

参考自 OS_TaskStatStkChk().

855 {
856  OS_TCB *ptcb;
857  OS_STK *pchk;
858  INT32U nfree;
859  INT32U size;
860 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
861  OS_CPU_SR cpu_sr = 0u;
862 #endif
863 
864 
865 
866 #if OS_ARG_CHK_EN > 0u
867  if (prio > OS_LOWEST_PRIO) { /* Make sure task priority is valid */
868  if (prio != OS_PRIO_SELF) {
869  return (OS_ERR_PRIO_INVALID);
870  }
871  }
872  if (p_stk_data == (OS_STK_DATA *)0) { /* Validate 'p_stk_data' */
873  return (OS_ERR_PDATA_NULL);
874  }
875 #endif
876  p_stk_data->OSFree = 0u; /* Assume failure, set to 0 size */
877  p_stk_data->OSUsed = 0u;
879  if (prio == OS_PRIO_SELF) { /* See if check for SELF */
880  prio = OSTCBCur->OSTCBPrio;
881  }
882  ptcb = OSTCBPrioTbl[prio];
883  if (ptcb == (OS_TCB *)0) { /* Make sure task exist */
885  return (OS_ERR_TASK_NOT_EXIST);
886  }
887  if (ptcb == OS_TCB_RESERVED) {
889  return (OS_ERR_TASK_NOT_EXIST);
890  }
891  if ((ptcb->OSTCBOpt & OS_TASK_OPT_STK_CHK) == 0u) { /* Make sure stack checking option is set */
893  return (OS_ERR_TASK_OPT);
894  }
895  nfree = 0u;
896  size = ptcb->OSTCBStkSize;
897  pchk = ptcb->OSTCBStkBottom;
899 #if OS_STK_GROWTH == 1u
900  while (*pchk++ == (OS_STK)0) { /* Compute the number of zero entries on the stk */
901  nfree++;
902  }
903 #else
904  while (*pchk-- == (OS_STK)0) {
905  nfree++;
906  }
907 #endif
908  p_stk_data->OSFree = nfree * sizeof(OS_STK); /* Compute number of free bytes on the stack */
909  p_stk_data->OSUsed = (size - nfree) * sizeof(OS_STK); /* Compute number of bytes used on the stack */
910  return (OS_ERR_NONE);
911 }

这是这个函数的调用关系图:

INT8U OSTaskQuery ( INT8U  prio,
OS_TCB p_task_data 
)

在文件 os_task.c1011 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_NONE, OS_ERR_PDATA_NULL, OS_ERR_PRIO, OS_ERR_PRIO_INVALID, OS_ERR_TASK_NOT_EXIST, OS_EXIT_CRITICAL, OS_LOWEST_PRIO, OS_MemCopy(), OS_PRIO_SELF, OS_TCB_RESERVED, OSTCBCur, OS_TCB::OSTCBPrio , 以及 OSTCBPrioTbl.

1013 {
1014  OS_TCB *ptcb;
1015 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
1016  OS_CPU_SR cpu_sr = 0u;
1017 #endif
1018 
1019 
1020 
1021 #if OS_ARG_CHK_EN > 0u
1022  if (prio > OS_LOWEST_PRIO) { /* Task priority valid ? */
1023  if (prio != OS_PRIO_SELF) {
1024  return (OS_ERR_PRIO_INVALID);
1025  }
1026  }
1027  if (p_task_data == (OS_TCB *)0) { /* Validate 'p_task_data' */
1028  return (OS_ERR_PDATA_NULL);
1029  }
1030 #endif
1032  if (prio == OS_PRIO_SELF) { /* See if suspend SELF */
1033  prio = OSTCBCur->OSTCBPrio;
1034  }
1035  ptcb = OSTCBPrioTbl[prio];
1036  if (ptcb == (OS_TCB *)0) { /* Task to query must exist */
1037  OS_EXIT_CRITICAL();
1038  return (OS_ERR_PRIO);
1039  }
1040  if (ptcb == OS_TCB_RESERVED) { /* Task to query must not be assigned to a Mutex */
1041  OS_EXIT_CRITICAL();
1042  return (OS_ERR_TASK_NOT_EXIST);
1043  }
1044  /* Copy TCB into user storage area */
1045  OS_MemCopy((INT8U *)p_task_data, (INT8U *)ptcb, sizeof(OS_TCB));
1046  OS_EXIT_CRITICAL();
1047  return (OS_ERR_NONE);
1048 }

函数调用图:

INT32U OSTaskRegGet ( INT8U  prio,
INT8U  id,
INT8U perr 
)

在文件 os_task.c1078 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_ID_INVALID, OS_ERR_NONE, OS_ERR_PRIO_INVALID, OS_EXIT_CRITICAL, OS_LOWEST_PRIO, OS_PRIO_SELF, OS_TASK_REG_TBL_SIZE, OSTCBCur, OSTCBPrioTbl , 以及 OS_TCB::OSTCBRegTbl.

1081 {
1082 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
1083  OS_CPU_SR cpu_sr = 0u;
1084 #endif
1085  INT32U value;
1086  OS_TCB *ptcb;
1087 
1088 
1089 #if OS_ARG_CHK_EN > 0u
1090  if (prio >= OS_LOWEST_PRIO) {
1091  if (prio != OS_PRIO_SELF) {
1092  *perr = OS_ERR_PRIO_INVALID;
1093  return (0u);
1094  }
1095  }
1096  if (id >= OS_TASK_REG_TBL_SIZE) {
1097  *perr = OS_ERR_ID_INVALID;
1098  return (0u);
1099  }
1100 #endif
1102  if (prio == OS_PRIO_SELF) { /* See if need to get register from current task */
1103  ptcb = OSTCBCur;
1104  } else {
1105  ptcb = OSTCBPrioTbl[prio];
1106  }
1107  value = ptcb->OSTCBRegTbl[id];
1108  OS_EXIT_CRITICAL();
1109  *perr = OS_ERR_NONE;
1110  return (value);
1111 }
void OSTaskRegSet ( INT8U  prio,
INT8U  id,
INT32U  value,
INT8U perr 
)

在文件 os_task.c1144 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_ID_INVALID, OS_ERR_NONE, OS_ERR_PRIO_INVALID, OS_EXIT_CRITICAL, OS_LOWEST_PRIO, OS_PRIO_SELF, OS_TASK_REG_TBL_SIZE, OSTCBCur, OSTCBPrioTbl , 以及 OS_TCB::OSTCBRegTbl.

1148 {
1149 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
1150  OS_CPU_SR cpu_sr = 0u;
1151 #endif
1152  OS_TCB *ptcb;
1153 
1154 
1155 #if OS_ARG_CHK_EN > 0u
1156  if (prio >= OS_LOWEST_PRIO) {
1157  if (prio != OS_PRIO_SELF) {
1158  *perr = OS_ERR_PRIO_INVALID;
1159  return;
1160  }
1161  }
1162  if (id >= OS_TASK_REG_TBL_SIZE) {
1163  *perr = OS_ERR_ID_INVALID;
1164  return;
1165  }
1166 #endif
1168  if (prio == OS_PRIO_SELF) { /* See if need to get register from current task */
1169  ptcb = OSTCBCur;
1170  } else {
1171  ptcb = OSTCBPrioTbl[prio];
1172  }
1173  ptcb->OSTCBRegTbl[id] = value;
1174  OS_EXIT_CRITICAL();
1175  *perr = OS_ERR_NONE;
1176 }
void OSTimeDly ( INT32U  ticks)

在文件 os_time.c44 行定义.

参考 OS_ENTER_CRITICAL, OS_EXIT_CRITICAL, OS_Sched(), OSIntNesting, OSRdyGrp, OSRdyTbl, OS_TCB::OSTCBBitX, OS_TCB::OSTCBBitY, OSTCBCur, OS_TCB::OSTCBDly , 以及 OS_TCB::OSTCBY.

参考自 App_TaskKbd(), App_TaskStart(), App_TaskUserIF(), BSP_OS_Dly_ms(), OS_TaskReturn(), OS_TaskStat(), OSStatInit() , 以及 OSTimeDlyHMSM().

45 {
46  INT8U y;
47 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
48  OS_CPU_SR cpu_sr = 0u;
49 #endif
50 
51 
52 
53  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
54  return;
55  }
56  if (ticks > 0u) { /* 0 means no delay! */
58  y = OSTCBCur->OSTCBY; /* Delay current task */
59  OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
60  if (OSRdyTbl[y] == 0u) {
62  }
63  OSTCBCur->OSTCBDly = ticks; /* Load ticks in TCB */
65  OS_Sched(); /* Find next task to run! */
66  }
67 }

函数调用图:

这是这个函数的调用关系图:

INT8U OSTimeDlyHMSM ( INT8U  hours,
INT8U  minutes,
INT8U  seconds,
INT16U  ms 
)

在文件 os_time.c96 行定义.

参考 OS_ERR_NONE, OS_ERR_TIME_DLY_ISR, OS_ERR_TIME_INVALID_MINUTES, OS_ERR_TIME_INVALID_MS, OS_ERR_TIME_INVALID_SECONDS, OS_ERR_TIME_ZERO_DLY, OS_TICKS_PER_SEC, OSIntNesting , 以及 OSTimeDly().

100 {
101  INT32U ticks;
102 
103 
104  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
105  return (OS_ERR_TIME_DLY_ISR);
106  }
107 #if OS_ARG_CHK_EN > 0u
108  if (hours == 0u) {
109  if (minutes == 0u) {
110  if (seconds == 0u) {
111  if (ms == 0u) {
112  return (OS_ERR_TIME_ZERO_DLY);
113  }
114  }
115  }
116  }
117  if (minutes > 59u) {
118  return (OS_ERR_TIME_INVALID_MINUTES); /* Validate arguments to be within range */
119  }
120  if (seconds > 59u) {
122  }
123  if (ms > 999u) {
124  return (OS_ERR_TIME_INVALID_MS);
125  }
126 #endif
127  /* Compute the total number of clock ticks required.. */
128  /* .. (rounded to the nearest tick) */
129  ticks = ((INT32U)hours * 3600uL + (INT32U)minutes * 60uL + (INT32U)seconds) * OS_TICKS_PER_SEC
130  + OS_TICKS_PER_SEC * ((INT32U)ms + 500uL / OS_TICKS_PER_SEC) / 1000uL;
131  OSTimeDly(ticks);
132  return (OS_ERR_NONE);
133 }

函数调用图:

INT8U OSTimeDlyResume ( INT8U  prio)

在文件 os_time.c156 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_NONE, OS_ERR_PRIO_INVALID, OS_ERR_TASK_NOT_EXIST, OS_ERR_TIME_NOT_DLY, OS_EXIT_CRITICAL, OS_LOWEST_PRIO, OS_Sched(), OS_STAT_PEND_ANY, OS_STAT_PEND_OK, OS_STAT_PEND_TO, OS_STAT_RDY, OS_STAT_SUSPEND, OS_TCB_RESERVED, OSRdyGrp, OSRdyTbl, OS_TCB::OSTCBBitX, OS_TCB::OSTCBBitY, OS_TCB::OSTCBDly, OSTCBPrioTbl, OS_TCB::OSTCBStat, OS_TCB::OSTCBStatPend , 以及 OS_TCB::OSTCBY.

157 {
158  OS_TCB *ptcb;
159 #if OS_CRITICAL_METHOD == 3u /* Storage for CPU status register */
160  OS_CPU_SR cpu_sr = 0u;
161 #endif
162 
163 
164 
165  if (prio >= OS_LOWEST_PRIO) {
166  return (OS_ERR_PRIO_INVALID);
167  }
169  ptcb = OSTCBPrioTbl[prio]; /* Make sure that task exist */
170  if (ptcb == (OS_TCB *)0) {
172  return (OS_ERR_TASK_NOT_EXIST); /* The task does not exist */
173  }
174  if (ptcb == OS_TCB_RESERVED) {
176  return (OS_ERR_TASK_NOT_EXIST); /* The task does not exist */
177  }
178  if (ptcb->OSTCBDly == 0u) { /* See if task is delayed */
180  return (OS_ERR_TIME_NOT_DLY); /* Indicate that task was not delayed */
181  }
182 
183  ptcb->OSTCBDly = 0u; /* Clear the time delay */
184  if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {
185  ptcb->OSTCBStat &= ~OS_STAT_PEND_ANY; /* Yes, Clear status flag */
186  ptcb->OSTCBStatPend = OS_STAT_PEND_TO; /* Indicate PEND timeout */
187  } else {
189  }
190  if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
191  OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make ready */
192  OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
194  OS_Sched(); /* See if this is new highest priority */
195  } else {
196  OS_EXIT_CRITICAL(); /* Task may be suspended */
197  }
198  return (OS_ERR_NONE);
199 }

函数调用图:

INT32U OSTimeGet ( void  )

在文件 os_time.c216 行定义.

参考 OS_ENTER_CRITICAL, OS_EXIT_CRITICAL , 以及 OSTime.

217 {
218  INT32U ticks;
219 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
220  OS_CPU_SR cpu_sr = 0u;
221 #endif
222 
223 
224 
226  ticks = OSTime;
228  return (ticks);
229 }
void OSTimeSet ( INT32U  ticks)

在文件 os_time.c245 行定义.

参考 OS_ENTER_CRITICAL, OS_EXIT_CRITICAL , 以及 OSTime.

246 {
247 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
248  OS_CPU_SR cpu_sr = 0u;
249 #endif
250 
251 
252 
254  OSTime = ticks;
256 }
void OSTimeTick ( void  )

在文件 os_core.c856 行定义.

参考 OS_ENTER_CRITICAL, OS_EXIT_CRITICAL, OS_FALSE, OS_STAT_PEND_ANY, OS_STAT_PEND_OK, OS_STAT_PEND_TO, OS_STAT_RDY, OS_STAT_SUSPEND, OS_TASK_IDLE_PRIO, OS_TRUE, OSRdyGrp, OSRdyTbl, OSRunning, OS_TCB::OSTCBBitX, OS_TCB::OSTCBBitY, OS_TCB::OSTCBDly, OSTCBList, OS_TCB::OSTCBNext, OS_TCB::OSTCBPrio, OS_TCB::OSTCBStat, OS_TCB::OSTCBStatPend, OS_TCB::OSTCBY, OSTime , 以及 OSTimeTickHook().

参考自 OS_CPU_SysTickHandler().

857 {
858  OS_TCB *ptcb;
859 #if OS_TICK_STEP_EN > 0u
860  BOOLEAN step;
861 #endif
862 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
863  OS_CPU_SR cpu_sr = 0u;
864 #endif
865 
866 
867 
868 #if OS_TIME_TICK_HOOK_EN > 0u
869  OSTimeTickHook(); /* Call user definable hook */
870 #endif
871 #if OS_TIME_GET_SET_EN > 0u
872  OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
873  OSTime++;
875 #endif
876  if (OSRunning == OS_TRUE) {
877 #if OS_TICK_STEP_EN > 0u
878  switch (OSTickStepState) { /* Determine whether we need to process a tick */
879  case OS_TICK_STEP_DIS: /* Yes, stepping is disabled */
880  step = OS_TRUE;
881  break;
882 
883  case OS_TICK_STEP_WAIT: /* No, waiting for uC/OS-View to set ... */
884  step = OS_FALSE; /* .. OSTickStepState to OS_TICK_STEP_ONCE */
885  break;
886 
887  case OS_TICK_STEP_ONCE: /* Yes, process tick once and wait for next ... */
888  step = OS_TRUE; /* ... step command from uC/OS-View */
889  OSTickStepState = OS_TICK_STEP_WAIT;
890  break;
891 
892  default: /* Invalid case, correct situation */
893  step = OS_TRUE;
894  OSTickStepState = OS_TICK_STEP_DIS;
895  break;
896  }
897  if (step == OS_FALSE) { /* Return if waiting for step command */
898  return;
899  }
900 #endif
901  ptcb = OSTCBList; /* Point at first TCB in TCB list */
902  while (ptcb->OSTCBPrio != OS_TASK_IDLE_PRIO) { /* Go through all TCBs in TCB list */
904  if (ptcb->OSTCBDly != 0u) { /* No, Delayed or waiting for event with TO */
905  ptcb->OSTCBDly--; /* Decrement nbr of ticks to end of delay */
906  if (ptcb->OSTCBDly == 0u) { /* Check for timeout */
907 
908  if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {
909  ptcb->OSTCBStat &= ~(INT8U)OS_STAT_PEND_ANY; /* Yes, Clear status flag */
910  ptcb->OSTCBStatPend = OS_STAT_PEND_TO; /* Indicate PEND timeout */
911  } else {
913  }
914 
915  if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
916  OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make ready */
917  OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
918  }
919  }
920  }
921  ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
923  }
924  }
925 }

函数调用图:

这是这个函数的调用关系图:

OS_TMR* OSTmrCreate ( INT32U  dly,
INT32U  period,
INT8U  opt,
OS_TMR_CALLBACK  callback,
void *  callback_arg,
INT8U pname,
INT8U perr 
)

在文件 os_tmr.c108 行定义.

参考 OS_ERR_NONE, OS_ERR_TMR_INVALID_DLY, OS_ERR_TMR_INVALID_OPT, OS_ERR_TMR_INVALID_PERIOD, OS_ERR_TMR_ISR, OS_ERR_TMR_NON_AVAIL, OS_TMR_OPT_ONE_SHOT, OS_TMR_OPT_PERIODIC, OS_TMR_STATE_STOPPED, OSIntNesting, OSSchedLock(), OSSchedUnlock(), OSTmr_Alloc(), OS_TMR::OSTmrCallback, OS_TMR::OSTmrCallbackArg, OS_TMR::OSTmrDly, OS_TMR::OSTmrName, OS_TMR::OSTmrOpt, OS_TMR::OSTmrPeriod , 以及 OS_TMR::OSTmrState.

115 {
116  OS_TMR *ptmr;
117 
118 
119 #if OS_ARG_CHK_EN > 0u
120  if (perr == (INT8U *)0) { /* Validate arguments */
121  return ((OS_TMR *)0);
122  }
123  switch (opt) {
124  case OS_TMR_OPT_PERIODIC:
125  if (period == 0u) {
127  return ((OS_TMR *)0);
128  }
129  break;
130 
131  case OS_TMR_OPT_ONE_SHOT:
132  if (dly == 0u) {
133  *perr = OS_ERR_TMR_INVALID_DLY;
134  return ((OS_TMR *)0);
135  }
136  break;
137 
138  default:
139  *perr = OS_ERR_TMR_INVALID_OPT;
140  return ((OS_TMR *)0);
141  }
142 #endif
143  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
144  *perr = OS_ERR_TMR_ISR;
145  return ((OS_TMR *)0);
146  }
147  OSSchedLock();
148  ptmr = OSTmr_Alloc(); /* Obtain a timer from the free pool */
149  if (ptmr == (OS_TMR *)0) {
150  OSSchedUnlock();
151  *perr = OS_ERR_TMR_NON_AVAIL;
152  return ((OS_TMR *)0);
153  }
154  ptmr->OSTmrState = OS_TMR_STATE_STOPPED; /* Indicate that timer is not running yet */
155  ptmr->OSTmrDly = dly;
156  ptmr->OSTmrPeriod = period;
157  ptmr->OSTmrOpt = opt;
158  ptmr->OSTmrCallback = callback;
159  ptmr->OSTmrCallbackArg = callback_arg;
160 #if OS_TMR_CFG_NAME_EN > 0u
161  ptmr->OSTmrName = pname;
162 #endif
163  OSSchedUnlock();
164  *perr = OS_ERR_NONE;
165  return (ptmr);
166 }

函数调用图:

BOOLEAN OSTmrDel ( OS_TMR ptmr,
INT8U perr 
)

在文件 os_tmr.c192 行定义.

参考 OS_ERR_NONE, OS_ERR_TMR_INACTIVE, OS_ERR_TMR_INVALID, OS_ERR_TMR_INVALID_STATE, OS_ERR_TMR_INVALID_TYPE, OS_ERR_TMR_ISR, OS_FALSE, OS_TMR_STATE_COMPLETED, OS_TMR_STATE_RUNNING, OS_TMR_STATE_STOPPED, OS_TMR_STATE_UNUSED, OS_TMR_TYPE, OS_TRUE, OSIntNesting, OSSchedLock(), OSSchedUnlock(), OSTmr_Free(), OSTmr_Unlink(), OS_TMR::OSTmrState , 以及 OS_TMR::OSTmrType.

194 {
195 #if OS_ARG_CHK_EN > 0u
196  if (perr == (INT8U *)0) { /* Validate arguments */
197  return (OS_FALSE);
198  }
199  if (ptmr == (OS_TMR *)0) {
200  *perr = OS_ERR_TMR_INVALID;
201  return (OS_FALSE);
202  }
203 #endif
204  if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
205  *perr = OS_ERR_TMR_INVALID_TYPE;
206  return (OS_FALSE);
207  }
208  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
209  *perr = OS_ERR_TMR_ISR;
210  return (OS_FALSE);
211  }
212  OSSchedLock();
213  switch (ptmr->OSTmrState) {
215  OSTmr_Unlink(ptmr); /* Remove from current wheel spoke */
216  OSTmr_Free(ptmr); /* Return timer to free list of timers */
217  OSSchedUnlock();
218  *perr = OS_ERR_NONE;
219  return (OS_TRUE);
220 
221  case OS_TMR_STATE_STOPPED: /* Timer has not started or ... */
222  case OS_TMR_STATE_COMPLETED: /* ... timer has completed the ONE-SHOT time */
223  OSTmr_Free(ptmr); /* Return timer to free list of timers */
224  OSSchedUnlock();
225  *perr = OS_ERR_NONE;
226  return (OS_TRUE);
227 
228  case OS_TMR_STATE_UNUSED: /* Already deleted */
229  OSSchedUnlock();
230  *perr = OS_ERR_TMR_INACTIVE;
231  return (OS_FALSE);
232 
233  default:
234  OSSchedUnlock();
235  *perr = OS_ERR_TMR_INVALID_STATE;
236  return (OS_FALSE);
237  }
238 }

函数调用图:

INT8U OSTmrNameGet ( OS_TMR ptmr,
INT8U **  pdest,
INT8U perr 
)

在文件 os_tmr.c266 行定义.

参考 OS_ERR_NAME_GET_ISR, OS_ERR_NONE, OS_ERR_TMR_INACTIVE, OS_ERR_TMR_INVALID, OS_ERR_TMR_INVALID_DEST, OS_ERR_TMR_INVALID_STATE, OS_ERR_TMR_INVALID_TYPE, OS_StrLen(), OS_TMR_STATE_COMPLETED, OS_TMR_STATE_RUNNING, OS_TMR_STATE_STOPPED, OS_TMR_STATE_UNUSED, OS_TMR_TYPE, OSIntNesting, OSSchedLock(), OSSchedUnlock(), OS_TMR::OSTmrName, OS_TMR::OSTmrState , 以及 OS_TMR::OSTmrType.

269 {
270  INT8U len;
271 
272 
273 #if OS_ARG_CHK_EN > 0u
274  if (perr == (INT8U *)0) {
275  return (0u);
276  }
277  if (pdest == (INT8U **)0) {
278  *perr = OS_ERR_TMR_INVALID_DEST;
279  return (0u);
280  }
281  if (ptmr == (OS_TMR *)0) {
282  *perr = OS_ERR_TMR_INVALID;
283  return (0u);
284  }
285 #endif
286  if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
287  *perr = OS_ERR_TMR_INVALID_TYPE;
288  return (0u);
289  }
290  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
291  *perr = OS_ERR_NAME_GET_ISR;
292  return (0u);
293  }
294  OSSchedLock();
295  switch (ptmr->OSTmrState) {
299  *pdest = ptmr->OSTmrName;
300  len = OS_StrLen(*pdest);
301  OSSchedUnlock();
302  *perr = OS_ERR_NONE;
303  return (len);
304 
305  case OS_TMR_STATE_UNUSED: /* Timer is not allocated */
306  OSSchedUnlock();
307  *perr = OS_ERR_TMR_INACTIVE;
308  return (0u);
309 
310  default:
311  OSSchedUnlock();
312  *perr = OS_ERR_TMR_INVALID_STATE;
313  return (0u);
314  }
315 }

函数调用图:

INT32U OSTmrRemainGet ( OS_TMR ptmr,
INT8U perr 
)

在文件 os_tmr.c342 行定义.

参考 OS_ERR_NONE, OS_ERR_TMR_INACTIVE, OS_ERR_TMR_INVALID, OS_ERR_TMR_INVALID_STATE, OS_ERR_TMR_INVALID_TYPE, OS_ERR_TMR_ISR, OS_TMR_OPT_ONE_SHOT, OS_TMR_OPT_PERIODIC, OS_TMR_STATE_COMPLETED, OS_TMR_STATE_RUNNING, OS_TMR_STATE_STOPPED, OS_TMR_STATE_UNUSED, OS_TMR_TYPE, OSIntNesting, OSSchedLock(), OSSchedUnlock(), OS_TMR::OSTmrDly, OS_TMR::OSTmrMatch, OS_TMR::OSTmrOpt, OS_TMR::OSTmrPeriod, OS_TMR::OSTmrState, OSTmrTime , 以及 OS_TMR::OSTmrType.

344 {
345  INT32U remain;
346 
347 
348 #if OS_ARG_CHK_EN > 0u
349  if (perr == (INT8U *)0) {
350  return (0u);
351  }
352  if (ptmr == (OS_TMR *)0) {
353  *perr = OS_ERR_TMR_INVALID;
354  return (0u);
355  }
356 #endif
357  if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
358  *perr = OS_ERR_TMR_INVALID_TYPE;
359  return (0u);
360  }
361  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
362  *perr = OS_ERR_TMR_ISR;
363  return (0u);
364  }
365  OSSchedLock();
366  switch (ptmr->OSTmrState) {
368  remain = ptmr->OSTmrMatch - OSTmrTime; /* Determine how much time is left to timeout */
369  OSSchedUnlock();
370  *perr = OS_ERR_NONE;
371  return (remain);
372 
373  case OS_TMR_STATE_STOPPED: /* It's assumed that the timer has not started yet */
374  switch (ptmr->OSTmrOpt) {
375  case OS_TMR_OPT_PERIODIC:
376  if (ptmr->OSTmrDly == 0u) {
377  remain = ptmr->OSTmrPeriod;
378  } else {
379  remain = ptmr->OSTmrDly;
380  }
381  OSSchedUnlock();
382  *perr = OS_ERR_NONE;
383  break;
384 
385  case OS_TMR_OPT_ONE_SHOT:
386  default:
387  remain = ptmr->OSTmrDly;
388  OSSchedUnlock();
389  *perr = OS_ERR_NONE;
390  break;
391  }
392  return (remain);
393 
394  case OS_TMR_STATE_COMPLETED: /* Only ONE-SHOT that timed out can be in this state */
395  OSSchedUnlock();
396  *perr = OS_ERR_NONE;
397  return (0u);
398 
399  case OS_TMR_STATE_UNUSED:
400  OSSchedUnlock();
401  *perr = OS_ERR_TMR_INACTIVE;
402  return (0u);
403 
404  default:
405  OSSchedUnlock();
406  *perr = OS_ERR_TMR_INVALID_STATE;
407  return (0u);
408  }
409 }

函数调用图:

INT8U OSTmrStateGet ( OS_TMR ptmr,
INT8U perr 
)

在文件 os_tmr.c439 行定义.

参考 OS_ERR_NONE, OS_ERR_TMR_INVALID, OS_ERR_TMR_INVALID_STATE, OS_ERR_TMR_INVALID_TYPE, OS_ERR_TMR_ISR, OS_TMR_STATE_COMPLETED, OS_TMR_STATE_RUNNING, OS_TMR_STATE_STOPPED, OS_TMR_STATE_UNUSED, OS_TMR_TYPE, OSIntNesting, OSSchedLock(), OSSchedUnlock(), OS_TMR::OSTmrState , 以及 OS_TMR::OSTmrType.

441 {
442  INT8U state;
443 
444 
445 #if OS_ARG_CHK_EN > 0u
446  if (perr == (INT8U *)0) {
447  return (0u);
448  }
449  if (ptmr == (OS_TMR *)0) {
450  *perr = OS_ERR_TMR_INVALID;
451  return (0u);
452  }
453 #endif
454  if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
455  *perr = OS_ERR_TMR_INVALID_TYPE;
456  return (0u);
457  }
458  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
459  *perr = OS_ERR_TMR_ISR;
460  return (0u);
461  }
462  OSSchedLock();
463  state = ptmr->OSTmrState;
464  switch (state) {
465  case OS_TMR_STATE_UNUSED:
466  case OS_TMR_STATE_STOPPED:
468  case OS_TMR_STATE_RUNNING:
469  *perr = OS_ERR_NONE;
470  break;
471 
472  default:
473  *perr = OS_ERR_TMR_INVALID_STATE;
474  break;
475  }
476  OSSchedUnlock();
477  return (state);
478 }

函数调用图:

BOOLEAN OSTmrStart ( OS_TMR ptmr,
INT8U perr 
)

在文件 os_tmr.c504 行定义.

参考 OS_ERR_NONE, OS_ERR_TMR_INACTIVE, OS_ERR_TMR_INVALID, OS_ERR_TMR_INVALID_STATE, OS_ERR_TMR_INVALID_TYPE, OS_ERR_TMR_ISR, OS_FALSE, OS_TMR_LINK_DLY, OS_TMR_STATE_COMPLETED, OS_TMR_STATE_RUNNING, OS_TMR_STATE_STOPPED, OS_TMR_STATE_UNUSED, OS_TMR_TYPE, OS_TRUE, OSIntNesting, OSSchedLock(), OSSchedUnlock(), OSTmr_Link(), OSTmr_Unlink(), OS_TMR::OSTmrState , 以及 OS_TMR::OSTmrType.

506 {
507 #if OS_ARG_CHK_EN > 0u
508  if (perr == (INT8U *)0) { /* Validate arguments */
509  return (OS_FALSE);
510  }
511  if (ptmr == (OS_TMR *)0) {
512  *perr = OS_ERR_TMR_INVALID;
513  return (OS_FALSE);
514  }
515 #endif
516  if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
517  *perr = OS_ERR_TMR_INVALID_TYPE;
518  return (OS_FALSE);
519  }
520  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
521  *perr = OS_ERR_TMR_ISR;
522  return (OS_FALSE);
523  }
524  OSSchedLock();
525  switch (ptmr->OSTmrState) {
526  case OS_TMR_STATE_RUNNING: /* Restart the timer */
527  OSTmr_Unlink(ptmr); /* ... Stop the timer */
528  OSTmr_Link(ptmr, OS_TMR_LINK_DLY); /* ... Link timer to timer wheel */
529  OSSchedUnlock();
530  *perr = OS_ERR_NONE;
531  return (OS_TRUE);
532 
533  case OS_TMR_STATE_STOPPED: /* Start the timer */
535  OSTmr_Link(ptmr, OS_TMR_LINK_DLY); /* ... Link timer to timer wheel */
536  OSSchedUnlock();
537  *perr = OS_ERR_NONE;
538  return (OS_TRUE);
539 
540  case OS_TMR_STATE_UNUSED: /* Timer not created */
541  OSSchedUnlock();
542  *perr = OS_ERR_TMR_INACTIVE;
543  return (OS_FALSE);
544 
545  default:
546  OSSchedUnlock();
547  *perr = OS_ERR_TMR_INVALID_STATE;
548  return (OS_FALSE);
549  }
550 }

函数调用图:

BOOLEAN OSTmrStop ( OS_TMR ptmr,
INT8U  opt,
void *  callback_arg,
INT8U perr 
)

在文件 os_tmr.c591 行定义.

参考 OS_ERR_NONE, OS_ERR_TMR_INACTIVE, OS_ERR_TMR_INVALID, OS_ERR_TMR_INVALID_OPT, OS_ERR_TMR_INVALID_STATE, OS_ERR_TMR_INVALID_TYPE, OS_ERR_TMR_ISR, OS_ERR_TMR_NO_CALLBACK, OS_ERR_TMR_STOPPED, OS_FALSE, OS_TMR_OPT_CALLBACK, OS_TMR_OPT_CALLBACK_ARG, OS_TMR_OPT_NONE, OS_TMR_STATE_COMPLETED, OS_TMR_STATE_RUNNING, OS_TMR_STATE_STOPPED, OS_TMR_STATE_UNUSED, OS_TMR_TYPE, OS_TRUE, OSIntNesting, OSSchedLock(), OSSchedUnlock(), OSTmr_Unlink(), OS_TMR::OSTmrCallback, OS_TMR::OSTmrCallbackArg, OS_TMR::OSTmrState , 以及 OS_TMR::OSTmrType.

595 {
596  OS_TMR_CALLBACK pfnct;
597 
598 
599 #if OS_ARG_CHK_EN > 0u
600  if (perr == (INT8U *)0) { /* Validate arguments */
601  return (OS_FALSE);
602  }
603  if (ptmr == (OS_TMR *)0) {
604  *perr = OS_ERR_TMR_INVALID;
605  return (OS_FALSE);
606  }
607 #endif
608  if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
609  *perr = OS_ERR_TMR_INVALID_TYPE;
610  return (OS_FALSE);
611  }
612  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
613  *perr = OS_ERR_TMR_ISR;
614  return (OS_FALSE);
615  }
616  OSSchedLock();
617  switch (ptmr->OSTmrState) {
619  OSTmr_Unlink(ptmr); /* Remove from current wheel spoke */
620  *perr = OS_ERR_NONE;
621  switch (opt) {
622  case OS_TMR_OPT_CALLBACK:
623  pfnct = ptmr->OSTmrCallback; /* Execute callback function if available ... */
624  if (pfnct != (OS_TMR_CALLBACK)0) {
625  (*pfnct)((void *)ptmr, ptmr->OSTmrCallbackArg); /* Use callback arg when timer was created */
626  } else {
627  *perr = OS_ERR_TMR_NO_CALLBACK;
628  }
629  break;
630 
632  pfnct = ptmr->OSTmrCallback; /* Execute callback function if available ... */
633  if (pfnct != (OS_TMR_CALLBACK)0) {
634  (*pfnct)((void *)ptmr, callback_arg); /* ... using the 'callback_arg' provided in call */
635  } else {
636  *perr = OS_ERR_TMR_NO_CALLBACK;
637  }
638  break;
639 
640  case OS_TMR_OPT_NONE:
641  break;
642 
643  default:
644  *perr = OS_ERR_TMR_INVALID_OPT;
645  break;
646  }
647  OSSchedUnlock();
648  return (OS_TRUE);
649 
650  case OS_TMR_STATE_COMPLETED: /* Timer has already completed the ONE-SHOT or ... */
651  case OS_TMR_STATE_STOPPED: /* ... timer has not started yet. */
652  OSSchedUnlock();
653  *perr = OS_ERR_TMR_STOPPED;
654  return (OS_TRUE);
655 
656  case OS_TMR_STATE_UNUSED: /* Timer was not created */
657  OSSchedUnlock();
658  *perr = OS_ERR_TMR_INACTIVE;
659  return (OS_FALSE);
660 
661  default:
662  OSSchedUnlock();
663  *perr = OS_ERR_TMR_INVALID_STATE;
664  return (OS_FALSE);
665  }
666 }

函数调用图:

INT8U OSTmrSignal ( void  )

在文件 os_tmr.c690 行定义.

参考 OSSemPost() , 以及 OSTmrSemSignal.

参考自 OSTimeTickHook().

691 {
692  INT8U err;
693 
694 
695  err = OSSemPost(OSTmrSemSignal);
696  return (err);
697 }

函数调用图:

这是这个函数的调用关系图:

void OSInit ( void  )

在文件 os_core.c563 行定义.

参考 OS_FlagInit(), OS_InitEventList(), OS_InitMisc(), OS_InitRdyList(), OS_InitTaskIdle(), OS_InitTaskStat(), OS_InitTCBList(), OS_MemInit(), OS_QInit(), OSInitHookBegin(), OSInitHookEnd() , 以及 OSTmr_Init().

参考自 main().

564 {
565  OSInitHookBegin(); /* Call port specific initialization code */
566 
567  OS_InitMisc(); /* Initialize miscellaneous variables */
568 
569  OS_InitRdyList(); /* Initialize the Ready List */
570 
571  OS_InitTCBList(); /* Initialize the free list of OS_TCBs */
572 
573  OS_InitEventList(); /* Initialize the free list of OS_EVENTs */
574 
575 #if (OS_FLAG_EN > 0u) && (OS_MAX_FLAGS > 0u)
576  OS_FlagInit(); /* Initialize the event flag structures */
577 #endif
578 
579 #if (OS_MEM_EN > 0u) && (OS_MAX_MEM_PART > 0u)
580  OS_MemInit(); /* Initialize the memory manager */
581 #endif
582 
583 #if (OS_Q_EN > 0u) && (OS_MAX_QS > 0u)
584  OS_QInit(); /* Initialize the message queue structures */
585 #endif
586 
587  OS_InitTaskIdle(); /* Create the Idle Task */
588 #if OS_TASK_STAT_EN > 0u
589  OS_InitTaskStat(); /* Create the Statistic Task */
590 #endif
591 
592 #if OS_TMR_EN > 0u
593  OSTmr_Init(); /* Initialize the Timer Manager */
594 #endif
595 
596  OSInitHookEnd(); /* Call port specific init. code */
597 
598 #if OS_DEBUG_EN > 0u
599  OSDebugInit();
600 #endif
601 }

函数调用图:

这是这个函数的调用关系图:

void OSIntEnter ( void  )

在文件 os_core.c628 行定义.

参考 OS_TRUE, OSIntNesting , 以及 OSRunning.

参考自 BSP_IntHandler().

629 {
630  if (OSRunning == OS_TRUE) {
631  if (OSIntNesting < 255u) {
632  OSIntNesting++; /* Increment ISR nesting level */
633  }
634  }
635 }

这是这个函数的调用关系图:

void OSIntExit ( void  )

在文件 os_core.c656 行定义.

参考 OS_ENTER_CRITICAL, OS_EXIT_CRITICAL, OS_SchedNew(), OS_TRUE, OSCtxSwCtr, OSIntCtxSw(), OSIntNesting, OSLockNesting, OSPrioCur, OSPrioHighRdy, OSRunning, OS_TCB::OSTCBCtxSwCtr, OSTCBHighRdy , 以及 OSTCBPrioTbl.

参考自 BSP_IntHandler() , 以及 OS_CPU_SysTickHandler().

657 {
658 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
659  OS_CPU_SR cpu_sr = 0u;
660 #endif
661 
662 
663 
664  if (OSRunning == OS_TRUE) {
666  if (OSIntNesting > 0u) { /* Prevent OSIntNesting from wrapping */
667  OSIntNesting--;
668  }
669  if (OSIntNesting == 0u) { /* Reschedule only if all ISRs complete ... */
670  if (OSLockNesting == 0u) { /* ... and not locked. */
671  OS_SchedNew();
673  if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
674 #if OS_TASK_PROFILE_EN > 0u
675  OSTCBHighRdy->OSTCBCtxSwCtr++; /* Inc. # of context switches to this task */
676 #endif
677  OSCtxSwCtr++; /* Keep track of the number of ctx switches */
678  OSIntCtxSw(); /* Perform interrupt level ctx switch */
679  }
680  }
681  }
683  }
684 }

函数调用图:

这是这个函数的调用关系图:

void OSSchedLock ( void  )

在文件 os_core.c703 行定义.

参考 OS_ENTER_CRITICAL, OS_EXIT_CRITICAL, OS_TRUE, OSIntNesting, OSLockNesting , 以及 OSRunning.

参考自 OSTmr_Task(), OSTmrCreate(), OSTmrDel(), OSTmrNameGet(), OSTmrRemainGet(), OSTmrStart(), OSTmrStateGet() , 以及 OSTmrStop().

704 {
705 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
706  OS_CPU_SR cpu_sr = 0u;
707 #endif
708 
709 
710 
711  if (OSRunning == OS_TRUE) { /* Make sure multitasking is running */
713  if (OSIntNesting == 0u) { /* Can't call from an ISR */
714  if (OSLockNesting < 255u) { /* Prevent OSLockNesting from wrapping back to 0 */
715  OSLockNesting++; /* Increment lock nesting level */
716  }
717  }
719  }
720 }

这是这个函数的调用关系图:

void OSSchedUnlock ( void  )

在文件 os_core.c740 行定义.

参考 OS_ENTER_CRITICAL, OS_EXIT_CRITICAL, OS_Sched(), OS_TRUE, OSIntNesting, OSLockNesting , 以及 OSRunning.

参考自 OSTmr_Task(), OSTmrCreate(), OSTmrDel(), OSTmrNameGet(), OSTmrRemainGet(), OSTmrStart(), OSTmrStateGet() , 以及 OSTmrStop().

741 {
742 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
743  OS_CPU_SR cpu_sr = 0u;
744 #endif
745 
746 
747 
748  if (OSRunning == OS_TRUE) { /* Make sure multitasking is running */
750  if (OSLockNesting > 0u) { /* Do not decrement if already 0 */
751  OSLockNesting--; /* Decrement lock nesting level */
752  if (OSLockNesting == 0u) { /* See if scheduler is enabled and ... */
753  if (OSIntNesting == 0u) { /* ... not in an ISR */
755  OS_Sched(); /* See if a HPT is ready */
756  } else {
758  }
759  } else {
761  }
762  } else {
764  }
765  }
766 }

函数调用图:

这是这个函数的调用关系图:

void OSStart ( void  )

在文件 os_core.c790 行定义.

参考 OS_FALSE, OS_SchedNew(), OSPrioCur, OSPrioHighRdy, OSRunning, OSStartHighRdy(), OSTCBCur, OSTCBHighRdy , 以及 OSTCBPrioTbl.

参考自 main().

791 {
792  if (OSRunning == OS_FALSE) {
793  OS_SchedNew(); /* Find highest priority's task priority number */
795  OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
797  OSStartHighRdy(); /* Execute target specific code to start task */
798  }
799 }

函数调用图:

这是这个函数的调用关系图:

void OSStatInit ( void  )

在文件 os_core.c822 行定义.

参考 OS_ENTER_CRITICAL, OS_EXIT_CRITICAL, OS_TICKS_PER_SEC, OS_TRUE, OSIdleCtr, OSIdleCtrMax, OSStatRdy , 以及 OSTimeDly().

参考自 App_TaskStart().

823 {
824 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
825  OS_CPU_SR cpu_sr = 0u;
826 #endif
827 
828 
829 
830  OSTimeDly(2); /* Synchronize with clock tick */
832  OSIdleCtr = 0uL; /* Clear idle counter */
834  OSTimeDly(OS_TICKS_PER_SEC / 10u); /* Determine MAX. idle counter value for 1/10 second */
836  OSIdleCtrMax = OSIdleCtr; /* Store maximum idle counter count in 1/10 second */
837  OSStatRdy = OS_TRUE;
839 }

函数调用图:

这是这个函数的调用关系图:

INT16U OSVersion ( void  )

在文件 os_core.c942 行定义.

参考 OS_VERSION.

参考自 App_DispScr_VersionTickRateCPU().

943 {
944  return (OS_VERSION);
945 }

这是这个函数的调用关系图:

void OS_Dummy ( void  )

在文件 os_core.c961 行定义.

参考自 OSTaskDel().

962 {
963 }

这是这个函数的调用关系图:

INT8U OS_EventTaskRdy ( OS_EVENT pevent,
void *  pmsg,
INT8U  msk,
INT8U  pend_stat 
)

在文件 os_core.c995 行定义.

参考 OS_EventTaskRemove(), OS_EventTaskRemoveMulti(), OS_STAT_RDY, OS_STAT_SUSPEND, OS_EVENT::OSEventGrp, OS_EVENT::OSEventTbl, OSRdyGrp, OSRdyTbl, OS_TCB::OSTCBBitX, OS_TCB::OSTCBBitY, OS_TCB::OSTCBDly, OS_TCB::OSTCBEventMultiPtr, OS_TCB::OSTCBEventPtr, OS_TCB::OSTCBMsg, OSTCBPrioTbl, OS_TCB::OSTCBStat, OS_TCB::OSTCBStatPend , 以及 OSUnMapTbl.

参考自 OSMboxDel(), OSMboxPendAbort(), OSMboxPost(), OSMboxPostOpt(), OSMutexDel(), OSMutexPost(), OSQDel(), OSQPendAbort(), OSQPost(), OSQPostFront(), OSQPostOpt(), OSSemDel(), OSSemPendAbort() , 以及 OSSemPost().

999 {
1000  OS_TCB *ptcb;
1001  INT8U y;
1002  INT8U x;
1003  INT8U prio;
1004 #if OS_LOWEST_PRIO > 63u
1005  INT16U *ptbl;
1006 #endif
1007 
1008 
1009 #if OS_LOWEST_PRIO <= 63u
1010  y = OSUnMapTbl[pevent->OSEventGrp]; /* Find HPT waiting for message */
1011  x = OSUnMapTbl[pevent->OSEventTbl[y]];
1012  prio = (INT8U)((y << 3u) + x); /* Find priority of task getting the msg */
1013 #else
1014  if ((pevent->OSEventGrp & 0xFFu) != 0u) { /* Find HPT waiting for message */
1015  y = OSUnMapTbl[ pevent->OSEventGrp & 0xFF];
1016  } else {
1017  y = OSUnMapTbl[(pevent->OSEventGrp >> 8u) & 0xFF] + 8u;
1018  }
1019  ptbl = &pevent->OSEventTbl[y];
1020  if ((*ptbl & 0xFF) != 0u) {
1021  x = OSUnMapTbl[*ptbl & 0xFF];
1022  } else {
1023  x = OSUnMapTbl[(*ptbl >> 8u) & 0xFF] + 8u;
1024  }
1025  prio = (INT8U)((y << 4u) + x); /* Find priority of task getting the msg */
1026 #endif
1027 
1028  ptcb = OSTCBPrioTbl[prio]; /* Point to this task's OS_TCB */
1029  ptcb->OSTCBDly = 0u; /* Prevent OSTimeTick() from readying task */
1030 #if ((OS_Q_EN > 0u) && (OS_MAX_QS > 0u)) || (OS_MBOX_EN > 0u)
1031  ptcb->OSTCBMsg = pmsg; /* Send message directly to waiting task */
1032 #else
1033  pmsg = pmsg; /* Prevent compiler warning if not used */
1034 #endif
1035  ptcb->OSTCBStat &= ~msk; /* Clear bit associated with event type */
1036  ptcb->OSTCBStatPend = pend_stat; /* Set pend status of post or abort */
1037  /* See if task is ready (could be susp'd) */
1038  if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) {
1039  OSRdyGrp |= ptcb->OSTCBBitY; /* Put task in the ready to run list */
1040  OSRdyTbl[y] |= ptcb->OSTCBBitX;
1041  }
1042 
1043  OS_EventTaskRemove(ptcb, pevent); /* Remove this task from event wait list */
1044 #if (OS_EVENT_MULTI_EN > 0u)
1045  if (ptcb->OSTCBEventMultiPtr != (OS_EVENT **)0) { /* Remove this task from events' wait lists */
1047  ptcb->OSTCBEventPtr = (OS_EVENT *)pevent;/* Return event as first multi-pend event ready*/
1048  }
1049 #endif
1050 
1051  return (prio);
1052 }

函数调用图:

这是这个函数的调用关系图:

void OS_EventTaskWait ( OS_EVENT pevent)

在文件 os_core.c1070 行定义.

参考 OS_EVENT::OSEventGrp, OS_EVENT::OSEventTbl, OSRdyGrp, OSRdyTbl, OS_TCB::OSTCBBitX, OS_TCB::OSTCBBitY, OSTCBCur, OS_TCB::OSTCBEventPtr , 以及 OS_TCB::OSTCBY.

参考自 OSMboxPend(), OSMutexPend(), OSQPend() , 以及 OSSemPend().

1071 {
1072  INT8U y;
1073 
1074 
1075  OSTCBCur->OSTCBEventPtr = pevent; /* Store ptr to ECB in TCB */
1076 
1077  pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX; /* Put task in waiting list */
1078  pevent->OSEventGrp |= OSTCBCur->OSTCBBitY;
1079 
1080  y = OSTCBCur->OSTCBY; /* Task no longer ready */
1081  OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
1082  if (OSRdyTbl[y] == 0u) {
1083  OSRdyGrp &= ~OSTCBCur->OSTCBBitY; /* Clear event grp bit if this was only task pending */
1084  }
1085 }

这是这个函数的调用关系图:

void OS_EventTaskRemove ( OS_TCB ptcb,
OS_EVENT pevent 
)

在文件 os_core.c1147 行定义.

参考 OS_EVENT::OSEventGrp, OS_EVENT::OSEventTbl, OS_TCB::OSTCBBitX, OS_TCB::OSTCBBitY , 以及 OS_TCB::OSTCBY.

参考自 OS_EventTaskRdy(), OSMboxPend(), OSMutexPend(), OSQPend(), OSSemPend() , 以及 OSTaskDel().

1149 {
1150  INT8U y;
1151 
1152 
1153  y = ptcb->OSTCBY;
1154  pevent->OSEventTbl[y] &= ~ptcb->OSTCBBitX; /* Remove task from wait list */
1155  if (pevent->OSEventTbl[y] == 0u) {
1156  pevent->OSEventGrp &= ~ptcb->OSTCBBitY;
1157  }
1158 }

这是这个函数的调用关系图:

void OS_EventTaskWaitMulti ( OS_EVENT **  pevents_wait)

在文件 os_core.c1104 行定义.

参考 OS_EVENT::OSEventGrp, OS_EVENT::OSEventTbl, OSRdyGrp, OSRdyTbl, OS_TCB::OSTCBBitX, OS_TCB::OSTCBBitY, OSTCBCur, OS_TCB::OSTCBEventMultiPtr, OS_TCB::OSTCBEventPtr , 以及 OS_TCB::OSTCBY.

参考自 OSEventPendMulti().

1105 {
1106  OS_EVENT **pevents;
1107  OS_EVENT *pevent;
1108  INT8U y;
1109 
1110 
1112  OSTCBCur->OSTCBEventMultiPtr = (OS_EVENT **)pevents_wait; /* Store ptr to ECBs in TCB */
1113 
1114  pevents = pevents_wait;
1115  pevent = *pevents;
1116  while (pevent != (OS_EVENT *)0) { /* Put task in waiting lists */
1118  pevent->OSEventGrp |= OSTCBCur->OSTCBBitY;
1119  pevents++;
1120  pevent = *pevents;
1121  }
1122 
1123  y = OSTCBCur->OSTCBY; /* Task no longer ready */
1124  OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
1125  if (OSRdyTbl[y] == 0u) {
1126  OSRdyGrp &= ~OSTCBCur->OSTCBBitY; /* Clear event grp bit if this was only task pending */
1127  }
1128 }

这是这个函数的调用关系图:

void OS_EventTaskRemoveMulti ( OS_TCB ptcb,
OS_EVENT **  pevents_multi 
)

在文件 os_core.c1177 行定义.

参考 OS_EVENT::OSEventGrp, OS_EVENT::OSEventTbl, OS_TCB::OSTCBBitX, OS_TCB::OSTCBBitY , 以及 OS_TCB::OSTCBY.

参考自 OS_EventTaskRdy(), OSEventPendMulti() , 以及 OSTaskDel().

1179 {
1180  OS_EVENT **pevents;
1181  OS_EVENT *pevent;
1182  INT8U y;
1183 #if (OS_LOWEST_PRIO <= 63u)
1184  INT8U bity;
1185  INT8U bitx;
1186 #else
1187  INT16U bity;
1188  INT16U bitx;
1189 #endif
1190 
1191 
1192  y = ptcb->OSTCBY;
1193  bity = ptcb->OSTCBBitY;
1194  bitx = ptcb->OSTCBBitX;
1195  pevents = pevents_multi;
1196  pevent = *pevents;
1197  while (pevent != (OS_EVENT *)0) { /* Remove task from all events' wait lists */
1198  pevent->OSEventTbl[y] &= ~bitx;
1199  if (pevent->OSEventTbl[y] == 0u) {
1200  pevent->OSEventGrp &= ~bity;
1201  }
1202  pevents++;
1203  pevent = *pevents;
1204  }
1205 }

这是这个函数的调用关系图:

void OS_EventWaitListInit ( OS_EVENT pevent)

在文件 os_core.c1222 行定义.

参考 OS_EVENT_TBL_SIZE, OS_EVENT::OSEventGrp , 以及 OS_EVENT::OSEventTbl.

参考自 OSMboxCreate(), OSMutexCreate(), OSQCreate() , 以及 OSSemCreate().

1223 {
1224 #if OS_LOWEST_PRIO <= 63u
1225  INT8U *ptbl;
1226 #else
1227  INT16U *ptbl;
1228 #endif
1229  INT8U i;
1230 
1231 
1232  pevent->OSEventGrp = 0u; /* No task waiting on event */
1233  ptbl = &pevent->OSEventTbl[0];
1234 
1235  for (i = 0u; i < OS_EVENT_TBL_SIZE; i++) {
1236  *ptbl++ = 0u;
1237  }
1238 }

这是这个函数的调用关系图:

void OS_FlagInit ( void  )

在文件 os_flag.c1048 行定义.

参考 OS_EVENT_TYPE_UNUSED, OS_MAX_FLAGS, OS_MemClr(), OS_FLAG_GRP::OSFlagFlags, OSFlagFreeList, OS_FLAG_GRP::OSFlagName, OSFlagTbl, OS_FLAG_GRP::OSFlagType , 以及 OS_FLAG_GRP::OSFlagWaitList.

参考自 OSInit().

1049 {
1050 #if OS_MAX_FLAGS == 1u
1051  OSFlagFreeList = (OS_FLAG_GRP *)&OSFlagTbl[0]; /* Only ONE event flag group! */
1053  OSFlagFreeList->OSFlagWaitList = (void *)0;
1055 #if OS_FLAG_NAME_EN > 0u
1056  OSFlagFreeList->OSFlagName = (INT8U *)"?";
1057 #endif
1058 #endif
1059 
1060 #if OS_MAX_FLAGS >= 2u
1061  INT16U i;
1062  OS_FLAG_GRP *pgrp1;
1063  OS_FLAG_GRP *pgrp2;
1064 
1065 
1066  OS_MemClr((INT8U *)&OSFlagTbl[0], sizeof(OSFlagTbl)); /* Clear the flag group table */
1067  pgrp1 = &OSFlagTbl[0];
1068  pgrp2 = &OSFlagTbl[1];
1069  for (i = 0u; i < (OS_MAX_FLAGS - 1u); i++) { /* Init. list of free EVENT FLAGS */
1071  pgrp1->OSFlagWaitList = (void *)pgrp2;
1072 #if OS_FLAG_NAME_EN > 0u
1073  pgrp1->OSFlagName = (INT8U *)"?"; /* Unknown name */
1074 #endif
1075  pgrp1++;
1076  pgrp2++;
1077  }
1079  pgrp1->OSFlagWaitList = (void *)0;
1080 #if OS_FLAG_NAME_EN > 0u
1081  pgrp1->OSFlagName = (INT8U *)"?"; /* Unknown name */
1082 #endif
1083  OSFlagFreeList = &OSFlagTbl[0];
1084 #endif
1085 }

函数调用图:

这是这个函数的调用关系图:

void OS_FlagUnlink ( OS_FLAG_NODE pnode)

在文件 os_flag.c1156 行定义.

参考 OS_FLAG_NODE::OSFlagNodeFlagGrp, OS_FLAG_NODE::OSFlagNodeNext, OS_FLAG_NODE::OSFlagNodePrev, OS_FLAG_NODE::OSFlagNodeTCB, OS_FLAG_GRP::OSFlagWaitList , 以及 OS_TCB::OSTCBFlagNode.

参考自 OS_FlagTaskRdy(), OSFlagPend() , 以及 OSTaskDel().

1157 {
1158 #if OS_TASK_DEL_EN > 0u
1159  OS_TCB *ptcb;
1160 #endif
1161  OS_FLAG_GRP *pgrp;
1162  OS_FLAG_NODE *pnode_prev;
1163  OS_FLAG_NODE *pnode_next;
1164 
1165 
1166  pnode_prev = (OS_FLAG_NODE *)pnode->OSFlagNodePrev;
1167  pnode_next = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
1168  if (pnode_prev == (OS_FLAG_NODE *)0) { /* Is it first node in wait list? */
1169  pgrp = (OS_FLAG_GRP *)pnode->OSFlagNodeFlagGrp;
1170  pgrp->OSFlagWaitList = (void *)pnode_next; /* Update list for new 1st node */
1171  if (pnode_next != (OS_FLAG_NODE *)0) {
1172  pnode_next->OSFlagNodePrev = (OS_FLAG_NODE *)0; /* Link new 1st node PREV to NULL */
1173  }
1174  } else { /* No, A node somewhere in the list */
1175  pnode_prev->OSFlagNodeNext = pnode_next; /* Link around the node to unlink */
1176  if (pnode_next != (OS_FLAG_NODE *)0) { /* Was this the LAST node? */
1177  pnode_next->OSFlagNodePrev = pnode_prev; /* No, Link around current node */
1178  }
1179  }
1180 #if OS_TASK_DEL_EN > 0u
1181  ptcb = (OS_TCB *)pnode->OSFlagNodeTCB;
1182  ptcb->OSTCBFlagNode = (OS_FLAG_NODE *)0;
1183 #endif
1184 }

这是这个函数的调用关系图:

void OS_MemClr ( INT8U pdest,
INT16U  size 
)

在文件 os_core.c1549 行定义.

参考自 OS_FlagInit(), OS_InitEventList(), OS_InitTCBList(), OS_MemInit(), OS_QInit() , 以及 OSTmr_Init().

1551 {
1552  while (size > 0u) {
1553  *pdest++ = (INT8U)0;
1554  size--;
1555  }
1556 }

这是这个函数的调用关系图:

void OS_MemCopy ( INT8U pdest,
INT8U psrc,
INT16U  size 
)

在文件 os_core.c1582 行定义.

参考自 OSTaskQuery().

1585 {
1586  while (size > 0u) {
1587  *pdest++ = *psrc++;
1588  size--;
1589  }
1590 }

这是这个函数的调用关系图:

void OS_MemInit ( void  )

在文件 os_mem.c403 行定义.

参考 OS_MAX_MEM_PART, OS_MemClr(), OS_MEM::OSMemFreeList, OSMemFreeList, OS_MEM::OSMemName , 以及 OSMemTbl.

参考自 OSInit().

404 {
405 #if OS_MAX_MEM_PART == 1u
406  OS_MemClr((INT8U *)&OSMemTbl[0], sizeof(OSMemTbl)); /* Clear the memory partition table */
407  OSMemFreeList = (OS_MEM *)&OSMemTbl[0]; /* Point to beginning of free list */
408 #if OS_MEM_NAME_EN > 0u
409  OSMemFreeList->OSMemName = (INT8U *)"?"; /* Unknown name */
410 #endif
411 #endif
412 
413 #if OS_MAX_MEM_PART >= 2u
414  OS_MEM *pmem;
415  INT16U i;
416 
417 
418  OS_MemClr((INT8U *)&OSMemTbl[0], sizeof(OSMemTbl)); /* Clear the memory partition table */
419  pmem = &OSMemTbl[0]; /* Point to memory control block (MCB) */
420  for (i = 0u; i < (OS_MAX_MEM_PART - 1u); i++) { /* Init. list of free memory partitions */
421  pmem->OSMemFreeList = (void *)&OSMemTbl[i+1]; /* Chain list of free partitions */
422 #if OS_MEM_NAME_EN > 0u
423  pmem->OSMemName = (INT8U *)"?";
424 #endif
425  pmem++;
426  }
427  pmem->OSMemFreeList = (void *)0; /* Initialize last node */
428 #if OS_MEM_NAME_EN > 0u
429  pmem->OSMemName = (INT8U *)"?";
430 #endif
431 
432  OSMemFreeList = &OSMemTbl[0]; /* Point to beginning of free list */
433 #endif
434 }

函数调用图:

这是这个函数的调用关系图:

void OS_QInit ( void  )

在文件 os_q.c852 行定义.

参考 OS_MAX_QS, OS_MemClr(), OSQFreeList, OS_Q::OSQPtr , 以及 OSQTbl.

参考自 OSInit().

853 {
854 #if OS_MAX_QS == 1u
855  OSQFreeList = &OSQTbl[0]; /* Only ONE queue! */
856  OSQFreeList->OSQPtr = (OS_Q *)0;
857 #endif
858 
859 #if OS_MAX_QS >= 2u
860  INT16U i;
861  OS_Q *pq1;
862  OS_Q *pq2;
863 
864 
865 
866  OS_MemClr((INT8U *)&OSQTbl[0], sizeof(OSQTbl)); /* Clear the queue table */
867  pq1 = &OSQTbl[0];
868  pq2 = &OSQTbl[1];
869  for (i = 0u; i < (OS_MAX_QS - 1u); i++) { /* Init. list of free QUEUE control blocks */
870  pq1->OSQPtr = pq2;
871  pq1++;
872  pq2++;
873  }
874  pq1->OSQPtr = (OS_Q *)0;
875  OSQFreeList = &OSQTbl[0];
876 #endif
877 }

函数调用图:

这是这个函数的调用关系图:

void OS_Sched ( void  )

在文件 os_core.c1609 行定义.

参考 OS_ENTER_CRITICAL, OS_EXIT_CRITICAL, OS_SchedNew(), OS_TASK_SW, OSCtxSwCtr, OSIntNesting, OSLockNesting, OSPrioCur, OSPrioHighRdy, OS_TCB::OSTCBCtxSwCtr, OSTCBHighRdy , 以及 OSTCBPrioTbl.

参考自 OSEventPendMulti(), OSFlagDel(), OSFlagPend(), OSFlagPost(), OSMboxDel(), OSMboxPend(), OSMboxPendAbort(), OSMboxPost(), OSMboxPostOpt(), OSMutexDel(), OSMutexPend(), OSMutexPost(), OSQDel(), OSQPend(), OSQPendAbort(), OSQPost(), OSQPostFront(), OSQPostOpt(), OSSchedUnlock(), OSSemDel(), OSSemPend(), OSSemPendAbort(), OSSemPost(), OSTaskChangePrio(), OSTaskCreate(), OSTaskCreateExt(), OSTaskDel(), OSTaskResume(), OSTaskSuspend(), OSTimeDly() , 以及 OSTimeDlyResume().

1610 {
1611 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
1612  OS_CPU_SR cpu_sr = 0u;
1613 #endif
1614 
1615 
1616 
1618  if (OSIntNesting == 0u) { /* Schedule only if all ISRs done and ... */
1619  if (OSLockNesting == 0u) { /* ... scheduler is not locked */
1620  OS_SchedNew();
1622  if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
1623 #if OS_TASK_PROFILE_EN > 0u
1624  OSTCBHighRdy->OSTCBCtxSwCtr++; /* Inc. # of context switches to this task */
1625 #endif
1626  OSCtxSwCtr++; /* Increment context switch counter */
1627  OS_TASK_SW(); /* Perform a context switch */
1628  }
1629  }
1630  }
1631  OS_EXIT_CRITICAL();
1632 }

函数调用图:

这是这个函数的调用关系图:

INT8U OS_StrLen ( INT8U psrc)

在文件 os_core.c1696 行定义.

参考 OS_ASCII_NUL.

参考自 OSEventNameGet(), OSFlagNameGet(), OSMemNameGet(), OSTaskNameGet() , 以及 OSTmrNameGet().

1697 {
1698  INT8U len;
1699 
1700 
1701  len = 0u;
1702  while (*psrc != OS_ASCII_NUL) {
1703  psrc++;
1704  len++;
1705  }
1706  return (len);
1707 }

这是这个函数的调用关系图:

void OS_TaskIdle ( void *  p_arg)

在文件 os_core.c1731 行定义.

参考 OS_ENTER_CRITICAL, OS_EXIT_CRITICAL, OSIdleCtr , 以及 OSTaskIdleHook().

参考自 OS_InitTaskIdle().

1732 {
1733 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
1734  OS_CPU_SR cpu_sr = 0u;
1735 #endif
1736 
1737 
1738 
1739  (void)p_arg; /* Prevent compiler warning for not using 'p_arg' */
1740  for (;;) {
1742  OSIdleCtr++;
1743  OS_EXIT_CRITICAL();
1744  OSTaskIdleHook(); /* Call user definable HOOK */
1745  }
1746 }

函数调用图:

这是这个函数的调用关系图:

void OS_TaskReturn ( void  )

在文件 os_task.c1195 行定义.

参考 OS_PRIO_SELF, OS_TICKS_PER_SEC, OSTaskDel(), OSTaskReturnHook(), OSTCBCur , 以及 OSTimeDly().

参考自 OSTaskStkInit().

1196 {
1197  OSTaskReturnHook(OSTCBCur); /* Call hook to let user decide on what to do */
1198 
1199 #if OS_TASK_DEL_EN > 0u
1200  (void)OSTaskDel(OS_PRIO_SELF); /* Delete task if it accidentally returns! */
1201 #else
1202  for (;;) {
1204  }
1205 #endif
1206 }

函数调用图:

这是这个函数的调用关系图:

void OS_TaskStat ( void *  p_arg)

在文件 os_core.c1773 行定义.

参考 OS_ENTER_CRITICAL, OS_EXIT_CRITICAL, OS_FALSE, OS_PRIO_SELF, OS_TaskStatStkChk(), OS_TICKS_PER_SEC, OSCPUUsage, OSIdleCtr, OSIdleCtrMax, OSIdleCtrRun, OSStatRdy, OSTaskStatHook(), OSTaskSuspend() , 以及 OSTimeDly().

参考自 OS_InitTaskStat().

1774 {
1775 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
1776  OS_CPU_SR cpu_sr = 0u;
1777 #endif
1778 
1779 
1780 
1781  (void)p_arg; /* Prevent compiler warning for not using 'p_arg' */
1782  while (OSStatRdy == OS_FALSE) {
1783  OSTimeDly(2u * OS_TICKS_PER_SEC / 10u); /* Wait until statistic task is ready */
1784  }
1785  OSIdleCtrMax /= 100L;
1786  if (OSIdleCtrMax == 0L) {
1787  OSCPUUsage = 0u;
1788 #if OS_TASK_SUSPEND_EN > 0u
1789  (void)OSTaskSuspend(OS_PRIO_SELF);
1790 #else
1791  for (;;) {
1793  }
1794 #endif
1795  }
1796  for (;;) {
1798  OSIdleCtrRun = OSIdleCtr; /* Obtain the of the idle counter for the past second */
1799  OSIdleCtr = 0L; /* Reset the idle counter for the next second */
1800  OS_EXIT_CRITICAL();
1801  OSCPUUsage = (INT8U)(100L - OSIdleCtrRun / OSIdleCtrMax);
1802  OSTaskStatHook(); /* Invoke user definable hook */
1803 #if (OS_TASK_STAT_STK_CHK_EN > 0u) && (OS_TASK_CREATE_EXT_EN > 0u)
1804  OS_TaskStatStkChk(); /* Check the stacks for each task */
1805 #endif
1806  OSTimeDly(OS_TICKS_PER_SEC / 10u); /* Accumulate OSIdleCtr for the next 1/10 second */
1807  }
1808 }

函数调用图:

这是这个函数的调用关系图:

void OS_TaskStkClr ( OS_STK pbos,
INT32U  size,
INT16U  opt 
)

在文件 os_task.c1232 行定义.

参考 OS_TASK_OPT_STK_CHK , 以及 OS_TASK_OPT_STK_CLR.

参考自 OSTaskCreateExt().

1235 {
1236  if ((opt & OS_TASK_OPT_STK_CHK) != 0x0000u) { /* See if stack checking has been enabled */
1237  if ((opt & OS_TASK_OPT_STK_CLR) != 0x0000u) { /* See if stack needs to be cleared */
1238 #if OS_STK_GROWTH == 1u
1239  while (size > 0u) { /* Stack grows from HIGH to LOW memory */
1240  size--;
1241  *pbos++ = (OS_STK)0; /* Clear from bottom of stack and up! */
1242  }
1243 #else
1244  while (size > 0u) { /* Stack grows from LOW to HIGH memory */
1245  size--;
1246  *pbos-- = (OS_STK)0; /* Clear from bottom of stack and down */
1247  }
1248 #endif
1249  }
1250  }
1251 }

这是这个函数的调用关系图:

void OS_TaskStatStkChk ( void  )

在文件 os_core.c1824 行定义.

参考 OS_ERR_NONE, OS_TASK_IDLE_PRIO, OS_TCB_RESERVED, OSTaskStkChk(), OSTCBPrioTbl, OS_TCB::OSTCBStkBase, OS_TCB::OSTCBStkBottom, OS_TCB::OSTCBStkSize, OS_TCB::OSTCBStkUsed , 以及 OS_STK_DATA::OSUsed.

参考自 OS_TaskStat().

1825 {
1826  OS_TCB *ptcb;
1827  OS_STK_DATA stk_data;
1828  INT8U err;
1829  INT8U prio;
1830 
1831 
1832  for (prio = 0u; prio <= OS_TASK_IDLE_PRIO; prio++) {
1833  err = OSTaskStkChk(prio, &stk_data);
1834  if (err == OS_ERR_NONE) {
1835  ptcb = OSTCBPrioTbl[prio];
1836  if (ptcb != (OS_TCB *)0) { /* Make sure task 'ptcb' is ... */
1837  if (ptcb != OS_TCB_RESERVED) { /* ... still valid. */
1838 #if OS_TASK_PROFILE_EN > 0u
1839  #if OS_STK_GROWTH == 1u
1840  ptcb->OSTCBStkBase = ptcb->OSTCBStkBottom + ptcb->OSTCBStkSize;
1841  #else
1842  ptcb->OSTCBStkBase = ptcb->OSTCBStkBottom - ptcb->OSTCBStkSize;
1843  #endif
1844  ptcb->OSTCBStkUsed = stk_data.OSUsed; /* Store the number of bytes used */
1845 #endif
1846  }
1847  }
1848  }
1849  }
1850 }

函数调用图:

这是这个函数的调用关系图:

INT8U OS_TCBInit ( INT8U  prio,
OS_STK ptos,
OS_STK pbos,
INT16U  id,
INT32U  stk_size,
void *  pext,
INT16U  opt 
)

在文件 os_core.c1896 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_NONE, OS_ERR_TASK_NO_MORE_TCB, OS_EXIT_CRITICAL, OS_STAT_PEND_OK, OS_STAT_RDY, OS_TASK_REG_TBL_SIZE, OSRdyGrp, OSRdyTbl, OSTaskCreateHook(), OSTaskCtr, OS_TCB::OSTCBBitX, OS_TCB::OSTCBBitY, OS_TCB::OSTCBCtxSwCtr, OS_TCB::OSTCBCyclesStart, OS_TCB::OSTCBCyclesTot, OS_TCB::OSTCBDelReq, OS_TCB::OSTCBDly, OS_TCB::OSTCBEventMultiPtr, OS_TCB::OSTCBEventPtr, OS_TCB::OSTCBExtPtr, OS_TCB::OSTCBFlagNode, OSTCBFreeList, OS_TCB::OSTCBId, OSTCBInitHook(), OSTCBList, OS_TCB::OSTCBMsg, OS_TCB::OSTCBNext, OS_TCB::OSTCBOpt, OS_TCB::OSTCBPrev, OS_TCB::OSTCBPrio, OSTCBPrioTbl, OS_TCB::OSTCBRegTbl, OS_TCB::OSTCBStat, OS_TCB::OSTCBStatPend, OS_TCB::OSTCBStkBase, OS_TCB::OSTCBStkBottom, OS_TCB::OSTCBStkPtr, OS_TCB::OSTCBStkSize, OS_TCB::OSTCBStkUsed, OS_TCB::OSTCBTaskName, OS_TCB::OSTCBX , 以及 OS_TCB::OSTCBY.

参考自 OSTaskCreate() , 以及 OSTaskCreateExt().

1903 {
1904  OS_TCB *ptcb;
1905 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
1906  OS_CPU_SR cpu_sr = 0u;
1907 #endif
1908 #if OS_TASK_REG_TBL_SIZE > 0u
1909  INT8U i;
1910 #endif
1911 
1912 
1914  ptcb = OSTCBFreeList; /* Get a free TCB from the free TCB list */
1915  if (ptcb != (OS_TCB *)0) {
1916  OSTCBFreeList = ptcb->OSTCBNext; /* Update pointer to free TCB list */
1917  OS_EXIT_CRITICAL();
1918  ptcb->OSTCBStkPtr = ptos; /* Load Stack pointer in TCB */
1919  ptcb->OSTCBPrio = prio; /* Load task priority into TCB */
1920  ptcb->OSTCBStat = OS_STAT_RDY; /* Task is ready to run */
1921  ptcb->OSTCBStatPend = OS_STAT_PEND_OK; /* Clear pend status */
1922  ptcb->OSTCBDly = 0u; /* Task is not delayed */
1923 
1924 #if OS_TASK_CREATE_EXT_EN > 0u
1925  ptcb->OSTCBExtPtr = pext; /* Store pointer to TCB extension */
1926  ptcb->OSTCBStkSize = stk_size; /* Store stack size */
1927  ptcb->OSTCBStkBottom = pbos; /* Store pointer to bottom of stack */
1928  ptcb->OSTCBOpt = opt; /* Store task options */
1929  ptcb->OSTCBId = id; /* Store task ID */
1930 #else
1931  pext = pext; /* Prevent compiler warning if not used */
1932  stk_size = stk_size;
1933  pbos = pbos;
1934  opt = opt;
1935  id = id;
1936 #endif
1937 
1938 #if OS_TASK_DEL_EN > 0u
1939  ptcb->OSTCBDelReq = OS_ERR_NONE;
1940 #endif
1941 
1942 #if OS_LOWEST_PRIO <= 63u
1943  ptcb->OSTCBY = (INT8U)(prio >> 3u); /* Pre-compute X, Y, BitX and BitY */
1944  ptcb->OSTCBX = (INT8U)(prio & 0x07u);
1945  ptcb->OSTCBBitY = (INT8U)(1u << ptcb->OSTCBY);
1946  ptcb->OSTCBBitX = (INT8U)(1u << ptcb->OSTCBX);
1947 #else
1948  ptcb->OSTCBY = (INT8U)((prio >> 4u) & 0xFFu); /* Pre-compute X, Y, BitX and BitY */
1949  ptcb->OSTCBX = (INT8U) (prio & 0x0F);
1950  ptcb->OSTCBBitY = (INT16U)(1u << ptcb->OSTCBY);
1951  ptcb->OSTCBBitX = (INT16U)(1u << ptcb->OSTCBX);
1952 #endif
1953 
1954 #if (OS_EVENT_EN)
1955  ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Task is not pending on an event */
1956 #if (OS_EVENT_MULTI_EN > 0u)
1957  ptcb->OSTCBEventMultiPtr = (OS_EVENT **)0; /* Task is not pending on any events */
1958 #endif
1959 #endif
1960 
1961 #if (OS_FLAG_EN > 0u) && (OS_MAX_FLAGS > 0u) && (OS_TASK_DEL_EN > 0u)
1962  ptcb->OSTCBFlagNode = (OS_FLAG_NODE *)0; /* Task is not pending on an event flag */
1963 #endif
1964 
1965 #if (OS_MBOX_EN > 0u) || ((OS_Q_EN > 0u) && (OS_MAX_QS > 0u))
1966  ptcb->OSTCBMsg = (void *)0; /* No message received */
1967 #endif
1968 
1969 #if OS_TASK_PROFILE_EN > 0u
1970  ptcb->OSTCBCtxSwCtr = 0L; /* Initialize profiling variables */
1971  ptcb->OSTCBCyclesStart = 0L;
1972  ptcb->OSTCBCyclesTot = 0L;
1973  ptcb->OSTCBStkBase = (OS_STK *)0;
1974  ptcb->OSTCBStkUsed = 0L;
1975 #endif
1976 
1977 #if OS_TASK_NAME_EN > 0u
1978  ptcb->OSTCBTaskName = (INT8U *)"?";
1979 #endif
1980 
1981 #if OS_TASK_REG_TBL_SIZE > 0u /* Initialize the task variables */
1982  for (i = 0u; i < OS_TASK_REG_TBL_SIZE; i++) {
1983  ptcb->OSTCBRegTbl[i] = 0u;
1984  }
1985 #endif
1986 
1987  OSTCBInitHook(ptcb);
1988 
1989  OSTaskCreateHook(ptcb); /* Call user defined hook */
1990 
1992  OSTCBPrioTbl[prio] = ptcb;
1993  ptcb->OSTCBNext = OSTCBList; /* Link into TCB chain */
1994  ptcb->OSTCBPrev = (OS_TCB *)0;
1995  if (OSTCBList != (OS_TCB *)0) {
1996  OSTCBList->OSTCBPrev = ptcb;
1997  }
1998  OSTCBList = ptcb;
1999  OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */
2000  OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
2001  OSTaskCtr++; /* Increment the #tasks counter */
2002  OS_EXIT_CRITICAL();
2003  return (OS_ERR_NONE);
2004  }
2005  OS_EXIT_CRITICAL();
2006  return (OS_ERR_TASK_NO_MORE_TCB);
2007 }

函数调用图:

这是这个函数的调用关系图:

void OSTmr_Init ( void  )

在文件 os_tmr.c782 行定义.

参考 OS_MemClr(), OS_TMR_CFG_MAX, OS_TMR_STATE_UNUSED, OS_TMR_TYPE, OSEventNameSet(), OSSemCreate(), OSTmr_InitTask(), OSTmrFree, OSTmrFreeList, OS_TMR::OSTmrName, OS_TMR::OSTmrNext, OSTmrSem, OSTmrSemSignal, OS_TMR::OSTmrState, OSTmrTbl, OSTmrTime, OS_TMR::OSTmrType, OSTmrUsed , 以及 OSTmrWheelTbl.

参考自 OSInit().

783 {
784 #if OS_EVENT_NAME_EN > 0u
785  INT8U err;
786 #endif
787  INT16U i;
788  OS_TMR *ptmr1;
789  OS_TMR *ptmr2;
790 
791 
792  OS_MemClr((INT8U *)&OSTmrTbl[0], sizeof(OSTmrTbl)); /* Clear all the TMRs */
793  OS_MemClr((INT8U *)&OSTmrWheelTbl[0], sizeof(OSTmrWheelTbl)); /* Clear the timer wheel */
794 
795  ptmr1 = &OSTmrTbl[0];
796  ptmr2 = &OSTmrTbl[1];
797  for (i = 0u; i < (OS_TMR_CFG_MAX - 1u); i++) { /* Init. list of free TMRs */
798  ptmr1->OSTmrType = OS_TMR_TYPE;
799  ptmr1->OSTmrState = OS_TMR_STATE_UNUSED; /* Indicate that timer is inactive */
800  ptmr1->OSTmrNext = (void *)ptmr2; /* Link to next timer */
801 #if OS_TMR_CFG_NAME_EN > 0u
802  ptmr1->OSTmrName = (INT8U *)"?";
803 #endif
804  ptmr1++;
805  ptmr2++;
806  }
807  ptmr1->OSTmrType = OS_TMR_TYPE;
808  ptmr1->OSTmrState = OS_TMR_STATE_UNUSED; /* Indicate that timer is inactive */
809  ptmr1->OSTmrNext = (void *)0; /* Last OS_TMR */
810 #if OS_TMR_CFG_NAME_EN > 0u
811  ptmr1->OSTmrName = (INT8U *)"?";
812 #endif
813  OSTmrTime = 0u;
814  OSTmrUsed = 0u;
816  OSTmrFreeList = &OSTmrTbl[0];
817  OSTmrSem = OSSemCreate(1u);
819 
820 #if OS_EVENT_NAME_EN > 0u
821  OSEventNameSet(OSTmrSem, (INT8U *)"uC/OS-II TmrLock", &err);/* Assign names to semaphores */
822  OSEventNameSet(OSTmrSemSignal, (INT8U *)"uC/OS-II TmrSignal", &err);
823 #endif
824 
825  OSTmr_InitTask();
826 }

函数调用图:

这是这个函数的调用关系图:

void OSInitHookBegin ( void  )

在文件 os_cpu_c.c67 行定义.

参考 OSTmrCtr.

参考自 OSInit().

68 {
69 #if OS_TMR_EN > 0u
70  OSTmrCtr = 0u;
71 #endif
72 }

这是这个函数的调用关系图:

void OSInitHookEnd ( void  )

在文件 os_cpu_c.c88 行定义.

参考自 OSInit().

89 {
90 }

这是这个函数的调用关系图:

void OSTaskCreateHook ( OS_TCB ptcb)

在文件 os_cpu_c.c105 行定义.

参考 App_TaskCreateHook().

参考自 OS_TCBInit().

106 {
107 #if OS_APP_HOOKS_EN > 0u
108  App_TaskCreateHook(ptcb);
109 #else
110  (void)ptcb; /* Prevent compiler warning */
111 #endif
112 }

函数调用图:

这是这个函数的调用关系图:

void OSTaskDelHook ( OS_TCB ptcb)

在文件 os_cpu_c.c128 行定义.

参考 App_TaskDelHook().

参考自 OSTaskDel().

129 {
130 #if OS_APP_HOOKS_EN > 0u
131  App_TaskDelHook(ptcb);
132 #else
133  (void)ptcb; /* Prevent compiler warning */
134 #endif
135 }

函数调用图:

这是这个函数的调用关系图:

void OSTaskIdleHook ( void  )

在文件 os_cpu_c.c151 行定义.

参考 App_TaskIdleHook().

参考自 OS_TaskIdle().

152 {
153 #if OS_APP_HOOKS_EN > 0u
155 #endif
156 }

函数调用图:

这是这个函数的调用关系图:

void OSTaskReturnHook ( OS_TCB ptcb)

在文件 os_cpu_c.c173 行定义.

参考 App_TaskReturnHook().

参考自 OS_TaskReturn().

174 {
175 #if OS_APP_HOOKS_EN > 0u
176  App_TaskReturnHook(ptcb);
177 #else
178  (void)ptcb;
179 #endif
180 }

函数调用图:

这是这个函数的调用关系图:

void OSTaskStatHook ( void  )

在文件 os_cpu_c.c195 行定义.

参考 App_TaskStatHook().

参考自 OS_TaskStat().

196 {
197 #if OS_APP_HOOKS_EN > 0u
199 #endif
200 }

函数调用图:

这是这个函数的调用关系图:

OS_STK* OSTaskStkInit ( void(*)(void *p_arg)  task,
void *  p_arg,
OS_STK ptos,
INT16U  opt 
)

在文件 os_cpu_c.c232 行定义.

参考 OS_TaskReturn().

参考自 OSTaskCreate() , 以及 OSTaskCreateExt().

233 {
234  OS_STK *stk;
235 
236 
237  (void)opt; /* 'opt' is not used, prevent warning */
238  stk = ptos; /* Load stack pointer */
239 
240  /* Registers stacked as if auto-saved on exception */
241  *(stk) = (INT32U)0x01000000uL; /* xPSR */
242  *(--stk) = (INT32U)task; /* Entry Point */
243  *(--stk) = (INT32U)OS_TaskReturn; /* R14 (LR) */
244  *(--stk) = (INT32U)0x12121212uL; /* R12 */
245  *(--stk) = (INT32U)0x03030303uL; /* R3 */
246  *(--stk) = (INT32U)0x02020202uL; /* R2 */
247  *(--stk) = (INT32U)0x01010101uL; /* R1 */
248  *(--stk) = (INT32U)p_arg; /* R0 : argument */
249 
250  /* Remaining registers saved on process stack */
251  *(--stk) = (INT32U)0x11111111uL; /* R11 */
252  *(--stk) = (INT32U)0x10101010uL; /* R10 */
253  *(--stk) = (INT32U)0x09090909uL; /* R9 */
254  *(--stk) = (INT32U)0x08080808uL; /* R8 */
255  *(--stk) = (INT32U)0x07070707uL; /* R7 */
256  *(--stk) = (INT32U)0x06060606uL; /* R6 */
257  *(--stk) = (INT32U)0x05050505uL; /* R5 */
258  *(--stk) = (INT32U)0x04040404uL; /* R4 */
259 
260  return (stk);
261 }

函数调用图:

这是这个函数的调用关系图:

void OSTaskSwHook ( void  )

在文件 os_cpu_c.c279 行定义.

参考 App_TaskSwHook().

280 {
281 #if OS_APP_HOOKS_EN > 0u
282  App_TaskSwHook();
283 #endif
284 }

函数调用图:

void OSTCBInitHook ( OS_TCB ptcb)

在文件 os_cpu_c.c299 行定义.

参考 App_TCBInitHook().

参考自 OS_TCBInit().

300 {
301 #if OS_APP_HOOKS_EN > 0u
302  App_TCBInitHook(ptcb);
303 #else
304  (void)ptcb; /* Prevent compiler warning */
305 #endif
306 }

函数调用图:

这是这个函数的调用关系图:

void OSTimeTickHook ( void  )

在文件 os_cpu_c.c321 行定义.

参考 App_TimeTickHook(), OS_TICKS_PER_SEC, OS_TMR_CFG_TICKS_PER_SEC, OSTmrCtr , 以及 OSTmrSignal().

参考自 OSTimeTick().

322 {
323 #if OS_APP_HOOKS_EN > 0u
325 #endif
326 
327 #if OS_TMR_EN > 0u
328  OSTmrCtr++;
330  OSTmrCtr = 0;
331  OSTmrSignal();
332  }
333 #endif
334 }

函数调用图:

这是这个函数的调用关系图:

void App_TaskCreateHook ( OS_TCB ptcb)

在文件 os_app_hooks.c38 行定义.

参考自 OSTaskCreateHook().

39 {
40 
41 }

这是这个函数的调用关系图:

void App_TaskDelHook ( OS_TCB ptcb)

在文件 os_app_hooks.c55 行定义.

参考自 OSTaskDelHook().

56 {
57  (void)ptcb;
58 }

这是这个函数的调用关系图:

void App_TaskIdleHook ( void  )

在文件 os_app_hooks.c73 行定义.

参考自 OSTaskIdleHook().

74 {
75 
76 }

这是这个函数的调用关系图:

void App_TaskReturnHook ( OS_TCB ptcb)

在文件 os_app_hooks.c91 行定义.

参考自 OSTaskReturnHook().

92 {
93 
94 }

这是这个函数的调用关系图:

void App_TaskStatHook ( void  )

在文件 os_app_hooks.c107 行定义.

参考自 OSTaskStatHook().

108 {
109 
110 }

这是这个函数的调用关系图:

void App_TaskSwHook ( void  )

在文件 os_app_hooks.c130 行定义.

参考自 OSTaskSwHook().

131 {
132 
133 }

这是这个函数的调用关系图:

void App_TCBInitHook ( OS_TCB ptcb)

在文件 os_app_hooks.c149 行定义.

参考自 OSTCBInitHook().

150 {
151  (void)ptcb;
152 }

这是这个函数的调用关系图:

void App_TimeTickHook ( void  )

在文件 os_app_hooks.c167 行定义.

参考 CPU_TS_Update().

参考自 OSTimeTickHook().

168 {
169 #if (CPU_CFG_TS_EN == DEF_ENABLED)
170  CPU_TS_Update();
171 #endif
172 }

函数调用图:

这是这个函数的调用关系图:

变量说明

OS_EXT INT32U OSCtxSwCtr

在文件 ucos_ii.h714 行定义.

参考自 App_DispScr_CtxSw(), OS_InitMisc(), OS_Sched() , 以及 OSIntExit().

在文件 ucos_ii.h718 行定义.

参考自 OS_InitEventList().

在文件 ucos_ii.h722 行定义.

参考自 OS_FlagInit().

OS_EXT OS_FLAG_GRP* OSFlagFreeList

在文件 ucos_ii.h723 行定义.

参考自 OS_FlagInit(), OSFlagCreate() , 以及 OSFlagDel().

OS_EXT INT8U OSCPUUsage

在文件 ucos_ii.h727 行定义.

参考自 App_DispScr_VersionTickRateCPU() , 以及 OS_TaskStat().

OS_EXT INT32U OSIdleCtrMax

在文件 ucos_ii.h728 行定义.

参考自 OS_InitMisc(), OS_TaskStat() , 以及 OSStatInit().

OS_EXT INT32U OSIdleCtrRun

在文件 ucos_ii.h729 行定义.

参考自 OS_InitMisc() , 以及 OS_TaskStat().

OS_EXT BOOLEAN OSStatRdy

在文件 ucos_ii.h730 行定义.

参考自 OS_InitMisc(), OS_TaskStat() , 以及 OSStatInit().

OS_EXT OS_STK OSTaskStatStk[128u]

在文件 ucos_ii.h731 行定义.

参考自 OS_InitTaskStat().

OS_EXT INT8U OSPrioCur

在文件 ucos_ii.h738 行定义.

参考自 OS_InitRdyList(), OS_Sched(), OSIntExit(), OSMutex_RdyAtPrio() , 以及 OSStart().

OS_EXT INT8U OSPrioHighRdy

在文件 ucos_ii.h739 行定义.

参考自 OS_InitRdyList(), OS_Sched(), OS_SchedNew(), OSIntExit() , 以及 OSStart().

OS_EXT INT8U OSTaskCtr

在文件 ucos_ii.h751 行定义.

参考自 OS_InitMisc(), OS_TCBInit() , 以及 OSTaskDel().

OS_EXT volatile INT32U OSIdleCtr

在文件 ucos_ii.h753 行定义.

参考自 OS_InitMisc(), OS_TaskIdle(), OS_TaskStat() , 以及 OSStatInit().

在文件 ucos_ii.h755 行定义.

参考自 OS_InitTaskIdle().

OS_EXT OS_TCB* OSTCBFreeList

在文件 ucos_ii.h759 行定义.

参考自 OS_InitTCBList(), OS_TCBInit() , 以及 OSTaskDel().

OS_EXT OS_TCB* OSTCBHighRdy

在文件 ucos_ii.h760 行定义.

参考自 OS_InitRdyList(), OS_Sched(), OSIntExit() , 以及 OSStart().

OS_EXT OS_TCB* OSTCBList

在文件 ucos_ii.h761 行定义.

参考自 OS_InitTCBList(), OS_TCBInit(), OSTaskDel() , 以及 OSTimeTick().

在文件 ucos_ii.h763 行定义.

参考自 OS_InitTCBList().

OS_EXT OS_MEM* OSMemFreeList

在文件 ucos_ii.h770 行定义.

参考自 OS_MemInit() , 以及 OSMemCreate().

在文件 ucos_ii.h771 行定义.

参考自 OS_MemInit().

OS_EXT OS_Q* OSQFreeList

在文件 ucos_ii.h775 行定义.

参考自 OS_QInit(), OSQCreate() , 以及 OSQDel().

在文件 ucos_ii.h776 行定义.

参考自 OS_QInit().

OS_EXT volatile INT32U OSTime

在文件 ucos_ii.h780 行定义.

参考自 App_DispScr_CtxSw(), OS_InitMisc(), OSTimeGet(), OSTimeSet() , 以及 OSTimeTick().

OS_EXT INT16U OSTmrFree

在文件 ucos_ii.h784 行定义.

参考自 OSTmr_Alloc(), OSTmr_Free() , 以及 OSTmr_Init().

OS_EXT INT16U OSTmrUsed

在文件 ucos_ii.h785 行定义.

参考自 OSTmr_Alloc(), OSTmr_Free() , 以及 OSTmr_Init().

OS_EXT INT32U OSTmrTime

在文件 ucos_ii.h786 行定义.

参考自 OSTmr_Init(), OSTmr_Link(), OSTmr_Task() , 以及 OSTmrRemainGet().

OS_EXT OS_EVENT* OSTmrSem

在文件 ucos_ii.h788 行定义.

参考自 OSTmr_Init().

OS_EXT OS_EVENT* OSTmrSemSignal

在文件 ucos_ii.h789 行定义.

参考自 OSTmr_Init(), OSTmr_Task() , 以及 OSTmrSignal().

在文件 ucos_ii.h791 行定义.

参考自 OSTmr_Init().

OS_EXT OS_TMR* OSTmrFreeList

在文件 ucos_ii.h792 行定义.

参考自 OSTmr_Alloc(), OSTmr_Free() , 以及 OSTmr_Init().

在文件 ucos_ii.h793 行定义.

参考自 OSTmr_InitTask().

在文件 ucos_ii.h795 行定义.

参考自 OSTmr_Init(), OSTmr_Link(), OSTmr_Task() , 以及 OSTmr_Unlink().

INT8U const OSUnMapTbl[256]

在文件 os_core.c38 行定义.

参考自 OS_EventTaskRdy() , 以及 OS_SchedNew().