📄 rtos.h
字号:
#define OS_ERR_STACK (120)
/* invalid or non-initialized data structures */
#define OS_ERR_INV_TASK (128)
#define OS_ERR_INV_TIMER (129)
#define OS_ERR_INV_MAILBOX (130)
#define OS_ERR_INV_CSEMA (132)
#define OS_ERR_INV_RSEMA (133)
/* Using GetMail1 or PutMail1 or GetMailCond1 or PutMailCond1 on
a non-1 byte mailbox */
#define OS_ERR_MAILBOX_NOT1 (135)
/*internal errors, please contact SEGGER Microcontrollersysteme */
#define OS_ERR_MAILBOX_NOT_IN_LIST (140)
#define OS_ERR_TASKLIST_CORRUPT (142)
/* not matching routine calls or macro usage */
#define OS_ERR_UNUSE_BEFORE_USE (150)
#define OS_ERR_LEAVEREGION_BEFORE_ENTERREGION (151)
#define OS_ERR_LEAVEINT (152)
#define OS_ERR_DICNT (153)
#define OS_ERR_INTERRUPT_DISABLED (154)
#define OS_ERR_TASK_ENDS_WITHOUT_TERMINATE (155)
/* not a legal system call during interrupt */
#define OS_ERR_ILLEGAL_IN_ISR (160)
/* not a legal system call during timer */
#define OS_ERR_ILLEGAL_IN_TIMER (161)
/* double used data structures */
#define OS_ERR_2USE_TASK (170)
#define OS_ERR_2USE_TIMER (171)
#define OS_ERR_2USE_MAILBOX (172)
#define OS_ERR_2USE_BSEMA (173)
#define OS_ERR_2USE_CSEMA (174)
#define OS_ERR_2USE_RSEMA (175)
/* Communication errors (OSCOM) */
#define OS_ERR_NESTED_RX_INT (180)
/********************************************************************
*
* Trace identifier
*
*********************************************************************
Identifier from 0 to 99 are reserved for embOS
Even when not all of those are currently used,
they may be defined in the future
*/
#define OS_TRACE_ID_DEACTIVATE (1)
#define OS_TRACE_ID_ACTIVATE (2)
#define OS_TRACE_ID_TIMERCALLBACK (3)
/* Task group */
#define OS_TRACE_ID_DELAY (10)
#define OS_TRACE_ID_DELAYUNTIL (11)
#define OS_TRACE_ID_SETPRIORITY (12)
#define OS_TRACE_ID_WAKETASK (13)
#define OS_TRACE_ID_CREATETASK (14)
#define OS_TRACE_ID_TERMINATETASK (15)
/* Event group */
#define OS_TRACE_ID_WAITEVENT (20)
#define OS_TRACE_ID_WAITEVENT_TIMED (21)
#define OS_TRACE_ID_SIGNALEVENT (22)
#define OS_TRACE_ID_CLEAREVENTS (23)
/* Mailbox group */
#define OS_TRACE_ID_CREATEMB (30)
#define OS_TRACE_ID_CLEARMB (31)
#define OS_TRACE_ID_DELETEMB (32)
#define OS_TRACE_ID_PUTMAIL (33)
#define OS_TRACE_ID_GETMAIL (34)
#define OS_TRACE_ID_PUTMAILCOND (35)
#define OS_TRACE_ID_GETMAILCOND (36)
#define OS_TRACE_ID_PUTMAIL_TIMED (37)
#define OS_TRACE_ID_GETMAIL_TIMED (38)
#define OS_TRACE_ID_PUTMAIL1 (40)
#define OS_TRACE_ID_GETMAIL1 (41)
#define OS_TRACE_ID_PUTMAILCOND1 (42)
#define OS_TRACE_ID_GETMAILCOND1 (43)
#define OS_TRACE_ID_PUTMAIL_TIMED1 (44)
#define OS_TRACE_ID_GETMAIL_TIMED1 (45)
/* Resource group */
#define OS_TRACE_ID_CREATERSEMA (50)
#define OS_TRACE_ID_USE (51)
#define OS_TRACE_ID_UNUSE (52)
#define OS_TRACE_ID_REQUEST (53)
#define OS_TRACE_ID_GETSEMAVALUE (54)
/* Counting Semaphore group */
#define OS_TRACE_ID_CREATECSEMA (60)
#define OS_TRACE_ID_DELETECSEMA (61)
#define OS_TRACE_ID_SIGNALCSEMA (62)
#define OS_TRACE_ID_WAITCSEMA (63)
#define OS_TRACE_ID_WAITCSEMATIMED (64)
/* Timer group */
#define OS_TRACE_ID_CREATETIMER (70)
#define OS_TRACE_ID_DELETETIMER (71)
#define OS_TRACE_ID_STARTTIMER (72)
#define OS_TRACE_ID_STOPTIMER (73)
#define OS_TRACE_ID_RETRIGGERTIMER (74)
#define OS_TRACE_ID_SETTIMERPERIOD (75)
/*********************************************************************
*
* Assertions
*
**********************************************************************
Assertions are used to generate code in the debug version
of embOS in order catch programming faults like
bad pointers or uninitialized data structures
*/
#if OS_DEBUG
#define OS_ASSERT(Exp, ErrCode) { if (!(Exp)) OS_Error(ErrCode); }
#else
#define OS_ASSERT(Exp, ErrCode)
#endif
#define OS_ASSERT_NOINT() OS_ASSERT((OS_InInt ==0), OS_ERR_ILLEGAL_IN_ISR)
#define OS_ASSERT_NOTIMER() OS_ASSERT((OS_InTimer==0), OS_ERR_ILLEGAL_IN_TIMER)
#define OS_ASSERT_DICnt() OS_ASSERT(((OS_DICnt&0xf0)==0) , OS_ERR_DICNT)
/*********************************************************************
*
* Memory attributes
*
**********************************************************************
*/
#ifndef OS_STACKPTR
#define OS_STACKPTR
#endif
#ifndef OS_SADDR
#ifdef SADDR
#define OS_SADDR SADDR
#else
#define OS_SADDR
#endif
#endif
#ifndef OS_DEFFUNC
#define OS_DEFFUNC
#endif
#ifndef OS_TICK_FUNC
#define OS_TICK_FUNC OS_DEFFUNC
#endif
#ifndef OS_ASM_FUNC
#define OS_ASM_FUNC
#endif
#ifndef OS_DEFPTR
#define OS_DEFPTR
#endif
/* pointer modifier for data items */
#ifndef OS_DATAPTR
#define OS_DATAPTR OS_DEFPTR
#endif
#ifndef OS_RSEMAPTR
#define OS_RSEMAPTR OS_DEFPTR
#endif
#ifndef OS_CSEMAPTR
#define OS_CSEMAPTR OS_DEFPTR
#endif
#ifndef OS_MBPTR
#define OS_MBPTR OS_DEFPTR
#endif
#ifndef OS_TCBPTR
#define OS_TCBPTR OS_DEFPTR
#endif
#ifndef OS_TIMERPTR
#define OS_TIMERPTR OS_DEFPTR
#endif
#if OS_SUPPORT_DIAG
void OS_MarkCall(void);
#define OS_MARKCALL() OS_MarkCall(),
#else
#define OS_MARKCALL()
#endif
#ifdef __cplusplus
extern "C" {
#endif
/*
********************************************************
* *
* Data structures *
* *
********************************************************
*/
typedef void voidRoutine(void);
typedef void OS_RX_CALLBACK(OS_U8 Data);
typedef void OS_TIMERROUTINE(void);
typedef struct OS_task OS_TASK;
struct OS_task {
/* Start of assembly relevant section */
OS_TASK OS_DEFPTR *pNext; /* Off = 0/0/0 */
OS_U8 OS_STACKPTR *pStack; /* Off = 2/4/4 */
/* End of assembly relevant section */
union {
int v;
void OS_DATAPTR * p;
} Data; /* Off = 4/6/8 */
OS_U8 Priority; /* Off = 6/10/12 */
OS_U8 Stat; /* Off = 7/11/13 */
#if __OS_RRSUPPORTED__
OS_U8 TimeSliceRem;
OS_U8 TimeSliceReload;
#endif
#if OS_TRACKNAME
const char OS_DEFPTR * Name;
#endif
void OS_DEFPTR * pPrev;
#if OS_SUPPORT_TIMEOUT
int Timeout;
#endif
#if OS_CHECKSTACK
OS_UINT StackSize;
#if !__OS_STACK_AT_BOTTOM__
OS_U8 OS_STACKPTR* pStackBot;
#endif
#endif
#if OS_PROFILE
OS_U32 ExecTotal; /* Time spent executing */
OS_U32 ExecLast; /* Time spent executing (Reference) */
OS_U32 NumActivations;
OS_U32 NumPreemptions;
OS_U32 Load;
#if OS_PROFILE >= 2
OS_U32 ReactionTimeSys_TS; /* Time stamp for reaction measurement */
OS_U32 ReactionTimeSys_Cycles;
OS_U32 ReactionTimeSysMax_Cycles;
#endif
#endif
#if OS_SUPPORT_DIAG
voidRoutine* LastCall;
#endif
OS_U8 Events;
#if OS_DEBUG
char Id;
#endif
#ifdef OS_TCB_CPU_EX
OS_TCB_CPU_EX
#endif
};
typedef struct OS_timer OS_TIMER;
struct OS_timer {
OS_TIMER OS_DEFPTR * pNext;
voidRoutine* Hook;
int Time;
int Period;
char Active;
#if OS_DEBUG
char Id;
#endif
};
typedef struct {
OS_TASK OS_DEFPTR * pTask;
OS_U8 UseCnt;
OS_U8 WaitCnt;
#if OS_DEBUG
void * pNext;
char Id;
#endif
} OS_RSEMA;
typedef struct OS_csema OS_CSEMA;
struct OS_csema {
OS_U8 Cnt;
OS_U8 WaitCnt;
#if OS_DEBUG
void OS_DEFPTR* pNext;
char Id;
#endif
};
typedef struct {
/* void *pNext; */
char *pData;
OS_UINT nofMsg;
OS_UINT maxMsg;
OS_UINT iRd;
OS_U8 sizeofMsg;
OS_U8 WaitCntNE;
OS_U8 WaitCntNF;
#if OS_DEBUG
char Id;
#endif
} OS_MAILBOX;
typedef struct {
OS_U32 Time;
void *pCurrentTask;
void *p;
OS_U32 v;
OS_U8 iRout;
} OS_TRACE_ENTRY;
/*********************************************************************
*
* Globals
*
**********************************************************************
*/
/*
Handle DEFinition (storage is actually allocted) versus DEClaration
(reference) of RTOS variables depending upon who includes this header file.
*/
#ifdef __OSGLOBAL_C__
#define OS_EXTERN /* Declare variables if included by RTOSKERN.C */
#else
#define OS_EXTERN extern /* Define variables if included by anyone else */
#endif
/*** Start of memory pragma areas ***
Some compilers can not deal with memory attributes and need pragmas
*/
#if defined(__ghs) && defined(__V850)
#pragma ghs startzda
#endif
OS_EXTERN OS_SADDR volatile OS_I32 OS_Time;
OS_EXTERN OS_SADDR int OS_TimeDex;
OS_EXTERN OS_SADDR union { int Dummy; struct { OS_U8 Region, DI; } Cnt; } OS_Counters;
#ifndef WIN32
#define OS_RegionCnt OS_Counters.Cnt.Region
#define OS_DICnt OS_Counters.Cnt.DI
#else
#define OS_RegionCnt OS_pCurrentTask->RegionCnt
#define OS_DICnt OS_pCurrentTask->DICnt
#endif
OS_EXTERN OS_SADDR OS_U8 OS_IntMSInc;
OS_EXTERN OS_SADDR OS_U8 OS_TimeSlice;
OS_EXTERN OS_SADDR OS_U8 OS_TimeSliceAtStart;
OS_EXTERN OS_SADDR OS_U8 OS_Pending;
OS_EXTERN OS_SADDR volatile OS_U8 OS_Status;
#if OS_SUPPORT_TICKSTEP
OS_EXTERN OS_SADDR volatile OS_U8 OS_TickStep;
OS_EXTERN OS_SADDR volatile int OS_TickStepTime;
#endif
#ifdef __RTOS_ALLOWFRACT__
OS_EXTERN OS_SADDR OS_UINT OS_TicksPerMS;
OS_EXTERN OS_SADDR int OS_IntTicksInc;
#endif
#if OS_PROFILE
OS_EXTERN OS_SADDR OS_U32 OS_TS_ExecStart;
OS_EXTERN OS_SADDR OS_U8 ProfilingOn;
#endif
#if OS_DEBUG
OS_EXTERN OS_SADDR int OS_TaskSwitchFromIntCnt;
OS_EXTERN OS_SADDR OS_U8 OS_InInt;
OS_EXTERN OS_SADDR OS_U8 OS_InTimer;
#endif
extern volatile char OS_TxActive;
#define OS_COM_ClearTxActive() OS_TxActive =0
/*** Pointers ***
Unfortunately there is no real standard on how to define/declare
pointers properly with extended memory attributes. There are
currently 2 different standards, which we both support.
*/
#if OS_COMPILER_LOCATION_LEFT
OS_EXTERN OS_SADDR OS_TASK OS_DEFPTR * OS_pTask; /* linked list of all Tasks */
OS_EXTERN OS_SADDR OS_TASK OS_DEFPTR * OS_pCurrentTask; /* pointer to current Task */
OS_EXTERN OS_SADDR OS_TASK volatile OS_DEFPTR * volatile OS_pActiveTask;
OS_EXTERN OS_SADDR OS_TIMER OS_DEFPTR * OS_pTimer; /* linked list of all active Timers */
OS_EXTERN OS_SADDR OS_RSEMA OS_DEFPTR * OS_pRSema;
OS_EXTERN OS_SADDR OS_MAILBOX OS_DEFPTR * OS_pMB;
#if OS_DEBUG
OS_EXTERN OS_SADDR OS_TASK OS_DEFPTR * OS_pTask2Debug; /* linked list of all Tasks */
OS_EXTERN OS_SADDR voidRoutine * OS_pfOnTask2Debug;
extern OS_CSEMA OS_CSEMAPTR* pCSema;
#endif
#else
OS_EXTERN OS_TASK OS_DEFPTR * OS_SADDR OS_pTask; /* linked list of all Tasks */
OS_EXTERN OS_TASK OS_DEFPTR * OS_SADDR OS_pCurrentTask; /* pointer to current Task */
OS_EXTERN OS_TASK OS_DEFPTR volatile * OS_SADDR volatile OS_pActiveTask;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -