📄 rtos.h
字号:
#define OS_EnterRegion() {OS_RegionCnt++; }
void OS_LeaveRegion(void);
/* Macro for OS_Leaveregion.
Main purposes:
- Used in OS-Kernel
- Offers the high speed variant (macro) instead of the function call
*/
#define OS_LEAVEREGION_STD() \
if (--OS_RegionCnt == 0) { \
OS_DI(); \
if (OS_Pending) { \
OS_RegionCnt = 1; \
OS_Switch(); \
OS_RegionCnt = 0; \
} \
OS_RESTORE_I(); \
}
#if OS_DEBUG
#define OS_LEAVEREGION() \
if (!OS_RegionCnt) OS_Error(OS_ERR_LEAVEREGION_BEFORE_ENTERREGION); \
OS_LEAVEREGION_STD()
#else
#define OS_LEAVEREGION() OS_LEAVEREGION_STD()
#endif
/*********************************************************************
*
* Interrupt save/disable/restore macros
*
**********************************************************************
*/
#define OS_IncDI() { OS_ASSERT_DICnt(); OS_DI(); OS_DICnt++; }
#define OS_DecRI() { OS_ASSERT_DICnt(); if (--OS_DICnt==0) OS_EI(); }
#define OS_RESTORE_I() { OS_ASSERT_DICnt(); if (OS_DICnt==0) OS_EI(); }
void OS_RestoreI(void); /* OS_Kern.c */
/*********************************************************************
*
* ISR (Interrupt service routine) support
*
**********************************************************************
*/
#define RTOS_PPENDING (1) /* Preemption pending */
#define RTOS_TSPENDING (2) /* Task switch pending */
#define RTOS_RRPENDING (4) /* Round robin pending */
#ifndef OS_SUPPORT_INT_PRIORITY
#define OS_SUPPORT_INT_PRIORITY (1)
#endif
#if OS_SUPPORT_INT_PRIORITY
#ifndef OS_IPL_EI_DEFAULT
#error "Please define OS_IPL_EI_DEFAULT (OSChip.h)"
#endif
#ifndef OS_IPL_DI_DEFAULT
#error "Please define OS_IPL_DI_DEFAULT (OSChip.h)"
#endif
#if OS_COMPILER_STORAGE_MODIFIER_LEFT
OS_EXTERN OS_SADDR unsigned int OS_EXTERN_INIT(OS_Ipl_EI, OS_IPL_EI_DEFAULT);
OS_EXTERN OS_SADDR unsigned int OS_EXTERN_INIT(OS_Ipl_DI, OS_IPL_DI_DEFAULT);
#else
OS_EXTERN unsigned int OS_SADDR OS_EXTERN_INIT(OS_Ipl_EI, OS_IPL_EI_DEFAULT);
OS_EXTERN unsigned int OS_SADDR OS_EXTERN_INIT(OS_Ipl_DI, OS_IPL_DI_DEFAULT);
#endif
#endif
#if OS_DEBUG
#define OS_MARK_IN_ISR() {OS_InInt++;}
#define OS_MARK_OUTOF_ISR() {if (!OS_InInt--) OS_Error(OS_ERR_LEAVEINT);}
#else
#define OS_MARK_IN_ISR()
#define OS_MARK_OUTOF_ISR()
#endif
#if OS_SUPPORT_CALL_ISR // Not allowed for some CPUs
void OS_CallISR (void (*pRoutine)(void));
void OS_CallNestableISR(void (*pRoutine)(void));
#endif
#if (OS_SWITCH_FROM_INT_MODIFIES_STACK == 0) && (OS_INTERRUPTS_ARE_NESTABLE_ON_ENTRY != 0) && (OS_SCHEDULER_ACTIVATED_BY_EXCEPTION == 0)
//
// FOR CPUs without separate interrupt stack which do not disable interrupts on entry,
// OS_Enter- / Leave- Interrupt() is not defined.
// OS_CallISR() has to be used
//
#else
#ifndef OS_ENABLE_INTS_SAVE_IPL
#define OS_ENABLE_INTS_SAVE_IPL() OS_EI()
#endif
#ifndef OS_RESTORE_IPL
#define OS_RESTORE_IPL()
#endif
#ifndef OS_EI_ON_LEAVE
#define OS_EI_ON_LEAVE() // Required for CPUs with do not restore DI-flag by RETI. Currently only CM3.
#endif
#if OS_INTERRUPTS_ARE_NESTABLE_ON_ENTRY
#define OS_DI_ON_ENTRY() OS_DI()
#else
#define OS_DI_ON_ENTRY()
#endif
#if OS_SWITCH_FROM_INT_MODIFIES_STACK
#define OS_HANDLE_REGION_CNT_ON_LI() \
else { \
OS_RegionCnt--; \
}
#else
#define OS_HANDLE_REGION_CNT_ON_LI() \
OS_RegionCnt--;
#endif
#define OS_SWITCH_FROM_INT_IF_REQUIRED() \
if ((OS_RegionCnt == 1) && OS_Pending) { \
OS_SwitchFromInt(); \
}
#define OS_EnterInterrupt() { \
OS_DI_ON_ENTRY(); \
OS_MARK_IN_ISR(); \
OS_RegionCnt++; \
OS_DICnt++; \
}
#define OS_LeaveInterrupt() { \
OS_MARK_OUTOF_ISR(); \
OS_DICnt--; /* Must have been zero initially ! (We could put =0 instead) */ \
OS_SWITCH_FROM_INT_IF_REQUIRED() \
OS_HANDLE_REGION_CNT_ON_LI(); \
OS_EI_ON_LEAVE(); \
}
#define OS_LeaveInterruptNoSwitch() { \
OS_MARK_OUTOF_ISR(); \
OS_DICnt--; \
OS_RegionCnt--; \
OS_EI_ON_LEAVE(); \
}
#define OS_EnterNestableInterrupt() { \
OS_MARK_IN_ISR(); \
OS_RegionCnt++; \
OS_ENABLE_INTS_SAVE_IPL(); \
}
#define OS_LeaveNestableInterrupt() { \
OS_DI(); \
OS_MARK_OUTOF_ISR(); \
OS_SWITCH_FROM_INT_IF_REQUIRED() \
OS_HANDLE_REGION_CNT_ON_LI(); \
OS_RESTORE_IPL(); \
OS_EI_ON_LEAVE(); \
}
#define OS_LeaveNestableInterruptNoSwitch() { \
OS_DI(); \
OS_MARK_OUTOF_ISR(); \
OS_RegionCnt--; \
OS_RESTORE_IPL(); \
OS_EI_ON_LEAVE(); \
}
#endif
#ifndef OS_EnterIntStack
void OS__EnterIntStack(void);
#define OS_EnterIntStack() {OS_DI(); OS__EnterIntStack(); OS_RESTORE_I(); }
#endif
#ifndef OS_LeaveIntStack
void OS__LeaveIntStack(void);
#define OS_LeaveIntStack() {OS_DI(); OS__LeaveIntStack(); }
#endif
void OS_SetFastIntPriorityLimit(OS_UINT Priority);
/*********************************************************************
*
* Resource semaphores
*
**********************************************************************
*/
int OS_Use (OS_RSEMA * pRSema); /* OSRsem.c */
void OS_Unuse (OS_RSEMA * pRSema); /* OSRsem.c */
char OS_Request (OS_RSEMA * pRSema); /* OSRsemRQ.c */
int OS_GetSemaValue (OS_RSEMA * pRSema); /* OSRSemGV.c */
OS_TASK* OS_GetResourceOwner(OS_RSEMA * pRSema); /* OSRsemGO.c */
void OS_CreateRSema (OS_RSEMA * pRSema); /* OSRsem.c */
void OS_DeleteRSema (OS_RSEMA * pRSema); /* OSDelRS.c */
#define OS_CREATERSEMA(ps) OS_CreateRSema(ps)
/*********************************************************************
*
* Counting semaphores
*
**********************************************************************
*/
void OS_CreateCSema (OS_CSEMA * pCSema, OS_UINT InitValue); /* OSCSEM.c */
void OS_DeleteCSema (OS_CSEMA * pCSema); /* OSDELCS.c */
int OS_GetCSemaValue (OS_CSEMA * pCSema); /* OSCSEMGV.c */
OS_U8 OS_SetCSemaValue (OS_CSEMA * pCSema, OS_UINT value); /* OS_SetCSemaValue.c */
void OS_SignalCSema (OS_CSEMA * pCSema); /* OSCSEM.c */
void OS_SignalCSemaMax (OS_CSEMA * pCSema, OS_UINT MaxValue); /* OS_CSEMA_SignalMax.c */
void OS_WaitCSema (OS_CSEMA * pCSema); /* OSCSEM.c */
int OS_WaitCSemaTimed (OS_CSEMA * pCSema, OS_TIME TimeOut); /* OSCSEMT.c */
char OS_CSemaRequest (OS_CSEMA * pCSema); /* OSCSEMRQ.c */
#define OS_CREATECSEMA(ps) OS_CreateCSema(ps,0)
/*********************************************************************
*
* Mailboxes
*
**********************************************************************
*/
#define CREATEMB(MAILBOX, size, max, Buffer) OS_CreateMB(MAILBOX,size, max, Buffer);
void OS_CreateMB (OS_MAILBOX * pMB, OS_U8 sizeofMsg, OS_UINT maxnofMsg, void* Buffer); /* initialize mailbox */
void OS_ClearMB (OS_MAILBOX * pMB);
void OS_PutMail (OS_MAILBOX * pMB, void* pMail);
char OS_PutMailCond (OS_MAILBOX * pMB, void* pMail);
void OS_PutMailFront (OS_MAILBOX * pMB, void* pMail);
char OS_PutMailFrontCond (OS_MAILBOX * pMB, void* pMail);
void OS_GetMail (OS_MAILBOX * pMB, void* pDest);
char OS_GetMailCond (OS_MAILBOX * pMB, void* pDest);
void OS_PutMail1 (OS_MAILBOX * pMB, const char* pMail);
char OS_PutMailCond1 (OS_MAILBOX * pMB, const char* pMail);
void OS_PutMailFront1 (OS_MAILBOX * pMB, const char* pMail);
char OS_PutMailFrontCond1 (OS_MAILBOX * pMB, const char* pMail);
void OS_GetMail1 (OS_MAILBOX * pMB, char* pDest);
char OS_GetMailCond1 (OS_MAILBOX * pMB, char* pDest);
char OS_GetMailTimed (OS_MAILBOX * pMB, void* pDest, OS_TIME Timeout);
void OS_DeleteMB (OS_MAILBOX * pMB);
void OS_WaitMail (OS_MAILBOX * pMB);
#if OS_DEBUG == 0
#define OS_GetMessageCnt(pMB) (*pMB).nofMsg
#else
OS_UINT OS_GetMessageCnt(OS_MAILBOX * pMB); /* get no. of available Messages */
#endif
/*********************************************************************
*
* Message Queues (OSQ.c)
*
**********************************************************************
*/
void OS_Q_Create (OS_Q* pQ, void*pData, OS_UINT Size);
void OS_Q_Clear (OS_Q* pQ); /* OSQCL.c */
int OS_Q_GetMessageCnt(OS_Q* pQ); /* OSQGMC.c */
int OS_Q_Put (OS_Q* pQ, const void* pSrc, OS_UINT Size);
int OS_Q_GetPtr (OS_Q* pQ, void**ppData);
int OS_Q_GetPtrCond (OS_Q* pQ, void**ppData); /* OSQGPC.c */
int OS_Q_GetPtrTimed (OS_Q* pQ, void**ppData, OS_TIME Timeout); /* OSQGPT.c */
void OS_Q_Purge (OS_Q* pQ);
/*********************************************************************
*
* Events
*
**********************************************************************
*/
char OS_ClearEvents (OS_TASK * pTask); /* OSEVENCL.c */
char OS_GetEventsOccured (OS_TASK * pTask); /* OSEVENGE.c */
void OS_SignalEvent (char Event, OS_TASK * pTask); /* OSENENS.c */
char OS_WaitEvent (char EventMask); /* OSEVENW.c */
char OS_WaitEventTimed (char EventMask, OS_TIME TimeOut); /* OSEVENT.c */
char OS_WaitSingleEvent (char EventMask); /* OSEVENWS.c */
char OS_WaitSingleEventTimed (char EventMask, OS_TIME TimeOut); /* OSEVENWST.c */
/*********************************************************************
*
* Timers(OSTIME.c)
*
**********************************************************************
*/
#ifdef OS_SIZEOF_INT
#if OS_SIZEOF_INT == 2
#define OS_TIMER_MAX_TIME 0x7F00
#elif OS_SIZEOF_INT == 4
#define OS_TIMER_MAX_TIME 0x7FFFFF00
#else
#error "OS_SIZEOF_INT not correctly defined"
#endif
#endif
void OS_CreateTimer (OS_TIMER * pTimer, OS_TIMERROUTINE* Callback, OS_TIME Timeout);
void OS_RetriggerTimer (OS_TIMER * pTimer);
void OS_StartTimer (OS_TIMER * pTimer);
void OS_StopTimer (OS_TIMER * pTimer);
void OS_DeleteTimer (OS_TIMER * pTimer); /* OSTIMED.c */
OS_TIME OS_GetTimerPeriod (OS_TIMER * pTimer); /* OSTIMEGP.c */
OS_U8 OS_GetTimerStatus (OS_TIMER * pTimer); /* OSTIMEGS.c */
OS_TIME OS_GetTimerValue (OS_TIMER * pTimer); /* OSTIMEGV.c */
void OS_SetTimerPeriod (OS_TIMER * pTimer, OS_TIME Period); /* OSTIMES.c */
#define OS_CREATETIMER(pTimer,c,d) \
OS_CreateTimer(pTimer,c,d); \
OS_StartTimer(pTimer);
/*********************************************************************
*
* Extended timers (OSTIMERX.c)
*
**********************************************************************
*/
void OS_CreateTimerEx (OS_TIMER_EX * pTimerEx, OS_TIMER_EX_ROUTINE* Callback, OS_TIME Timeout, void * pData);
#define OS_RetriggerTimerEx(pTimerEx) OS_RetriggerTimer(&(pTimerEx)->Timer)
#define OS_StartTimerEx(pTimerEx) OS_StartTimer(&(pTimerEx)->Timer)
#define OS_StopTimerEx(pTimerEx) OS_StopTimer(&(pTimerEx)->Timer)
#define OS_DeleteTimerEx(pTimerEx) OS_DeleteTimer(&(pTimerEx)->Timer)
#define OS_GetTimerPeriodEx(pTimerEx) OS_GetTimerPeriod(&(pTimerEx)->Timer)
#define OS_GetTimerStatusEx(pTimerEx) OS_GetTimerStatus(&(pTimerEx)->Timer)
#define OS_GetTimerValueEx(pTimerEx) OS_GetTimerValue(&(pTimerEx)->Timer)
#define OS_SetTimerPeriodEx(pTimerEx,Period) OS_SetTimerPeriod(&(pTimerEx)->Timer, Period)
#define OS_CREATETIMER_EX(pTimerEx,cb,Timeout,pData) \
OS_CreateTimerEx(pTimerEx,cb,Timeout,pData); \
OS_StartTimerEx(pTimerEx)
/*********************************************************************
*
* Heap type memory management (OS_Alloc.c)
*
**********************************************************************
This functions might not be implemented in all OS ports.
Therefore declaration depends on condition OS_SUPPORT_OS_ALLOC
which has to be defined in CPU specific part
*/
#if OS_SUPPORT_OS_ALLOC
void* OS_malloc(unsigned int);
void OS_free (void* pMemBlock);
void* OS_realloc (void* pMemBlock, unsigned NewSize);
#endif
/*********************************************************************
*
* Fixed Block memory management
*
**********************************************************************
*/
void OS_MEMF_Create(OS_MEMF* pMEMF, void* pPool, OS_U16 NumBlocks, OS_U16 BlockSize);
void OS_MEMF_Delete(OS_MEMF* pMEMF);
void* OS_MEMF_Alloc(OS_MEMF* pMEMF, int Purpose);
void* OS_MEMF_AllocTimed(OS_MEMF* pMEMF, OS_TIME Timeout, int Purpose);
void* OS_MEMF_Request(OS_MEMF* pMEMF, int Purpose);
void OS_MEMF_Release(OS_MEMF* pMEMF, void* pMemBlock);
void OS_MEMF_FreeBlock(void* pMemBlock);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -