237 lines
9.7 KiB
C
237 lines
9.7 KiB
C
|
#ifndef RTOS_LIB_H
|
||
|
#define RTOS_LIB_H
|
||
|
#include <limits.h>
|
||
|
#include <string.h>
|
||
|
#include "rthw.h"
|
||
|
#include "rtthread.h"
|
||
|
|
||
|
#include "gtypes.h" /* global type definitions */
|
||
|
#include "gd_int.h"
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
typedef void(*RTOS_ThreadFunctionT)(void*);
|
||
|
typedef void(*RTOS_HookFunctionT)(void*);
|
||
|
typedef void (*RTOS_TimerFunctionT)(void *);
|
||
|
typedef void* RTOS_ThreadT;
|
||
|
typedef void* RTOS_EventT;
|
||
|
typedef void* RTOS_SemaphoreT;
|
||
|
typedef void* RTOS_MailboxT;
|
||
|
typedef void* RTOS_MailqueueT;
|
||
|
typedef void* RTOS_MutexT;
|
||
|
typedef void* RTOS_TimerT;
|
||
|
typedef void* RTOS_CondT;
|
||
|
|
||
|
typedef U32 RTOS_SYS_SemaphoreT;
|
||
|
typedef void* RTOS_SYS_MailqueueT;
|
||
|
|
||
|
//typedef struct rt_thread *RTOS_ThreadT;
|
||
|
//typedef struct rt_semaphore * RTOS_SemaphoreT;
|
||
|
//typedef struct rt_messagequeue *RTOS_MailqueueT;
|
||
|
//typedef struct rt_mailbox *RTOS_MailqueueT;
|
||
|
//typedef struct rt_mutex *RTOS_MutexT;
|
||
|
|
||
|
/*
|
||
|
********************************************************************************
|
||
|
********************************************************************************
|
||
|
**
|
||
|
** macros to define various suspend modes
|
||
|
**
|
||
|
********************************************************************************
|
||
|
********************************************************************************
|
||
|
*/
|
||
|
#define RTOS_OK (RTOS_Status)0 //!< The OK status
|
||
|
#define RTOS_FAILURE (RTOS_Status)-1 //!< The general FAILURE status
|
||
|
|
||
|
|
||
|
#define RTOS_NO_SUSPEND 0x00000000UL //!< do not suspend, return immediately
|
||
|
#define RTOS_SUSPEND 0xFFFFFFFFUL //!< suspend forever, wait for valid event without timeout
|
||
|
|
||
|
#define RTOS_MAX_MAILQUEUE_ENTRIES 4096
|
||
|
#define RTOS_MSG_IS_POINTER 0xFFFFFFFFUL //!< the message to transport is a generic pointer only
|
||
|
|
||
|
typedef GBOOL RTOS_Flag; //!< the boolean flag type
|
||
|
typedef S32 RTOS_Status; //!< the result status type
|
||
|
typedef S32 RTOS_Size; //!< the generic size type
|
||
|
typedef U32 RTOS_Time; //!< the generic time type
|
||
|
typedef RTOS_TimerT RTOS_Timer; //!< the generic time type
|
||
|
typedef RTOS_ThreadT RTOS_Thread; //!< the thread identifier type
|
||
|
typedef S32 RTOS_Priority; //!< the generic priority type
|
||
|
typedef RTOS_SemaphoreT RTOS_Semaphore; //!< the semaphore identifier type
|
||
|
typedef RTOS_MutexT RTOS_Mutex; //!< the mutex semaphore identifier type
|
||
|
typedef RTOS_MailboxT RTOS_Mailbox; //!< the mailbox identifier type
|
||
|
typedef RTOS_MailqueueT RTOS_Mailqueue; //!< the mailqueue identifier type
|
||
|
typedef void* RTOS_Message; //!< the generic message identifier type
|
||
|
typedef void* RTOS_Memory; //!< the generic memory pointer type
|
||
|
typedef U32 RTOS_Segment; //!< the memory heap segment type
|
||
|
typedef RTOS_ThreadFunctionT RTOS_ThreadFunction; //!< the thread function definition type
|
||
|
typedef RTOS_HookFunctionT RTOS_HookFunction; //!< the hook function definition type
|
||
|
typedef RTOS_ThreadT RTOS_ThreadData; //!< the optional thread data structure
|
||
|
typedef RTOS_CondT RTOS_Cond; //!< the cond semaphore identifier type
|
||
|
|
||
|
|
||
|
#define GKOS_TIMER_HOOK_TABLE_SIZE 8 //!< number of timer-tick hook function entries
|
||
|
#define GKOS_SWITCH_HOOK_TABLE_SIZE 4 //!< number of context-switch hook function entries
|
||
|
|
||
|
#define RTOS_ThreadPriorityHighest (RTOS_Priority)127 //!< The highest possible priority
|
||
|
#define RTOS_ThreadPriorityLowest (RTOS_Priority)1 //!< The lowest possible priority
|
||
|
|
||
|
/*
|
||
|
********************************************************************************
|
||
|
********************************************************************************
|
||
|
**
|
||
|
** rtos type, gkos:0, rtthread:1
|
||
|
**
|
||
|
********************************************************************************
|
||
|
********************************************************************************
|
||
|
*/
|
||
|
#define RTOS_GKOS 0
|
||
|
#define RTOS_RTTHREAD 1
|
||
|
|
||
|
#define RTOS_TIMER_FLAG_DEACTIVATED 0x0 /**< timer is deactive */
|
||
|
#define RTOS_TIMER_FLAG_ACTIVATED 0x1 /**< timer is active */
|
||
|
#define RTOS_TIMER_FLAG_ONE_SHOT 0x0 /**< one shot timer */
|
||
|
#define RTOS_TIMER_FLAG_PERIODIC 0x2 /**< periodic timer */
|
||
|
|
||
|
#define RTOS_TIMER_FLAG_HARD_TIMER 0x0 /**< hard timer,the timer's callback function will be called in tick isr. */
|
||
|
#define RTOS_TIMER_FLAG_SOFT_TIMER 0x4 /**< soft timer,the timer's callback function will be called in timer thread. */
|
||
|
|
||
|
#define RTOS_TIMER_CTRL_SET_TIME 0x0 /**< set timer control command */
|
||
|
#define RTOS_TIMER_CTRL_GET_TIME 0x1 /**< get timer control command */
|
||
|
#define RTOS_TIMER_CTRL_SET_ONESHOT 0x2 /**< change timer to one shot */
|
||
|
#define RTOS_TIMER_CTRL_SET_PERIODIC 0x3 /**< change timer to periodic */
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
RTOS_HookFunctionT timerFunctionArray[GKOS_TIMER_HOOK_TABLE_SIZE];
|
||
|
U32 timerFunctionCount;
|
||
|
RTOS_HookFunctionT switchFunctionArray[GKOS_SWITCH_HOOK_TABLE_SIZE];
|
||
|
U32 switchFunctionCount;
|
||
|
}gkosHookDataT;
|
||
|
|
||
|
gkosHookDataT* gkosHookData;
|
||
|
|
||
|
|
||
|
#define THREAD_TIMESLICE 10
|
||
|
|
||
|
#define RTOS_ThreadCreate(function,arg,priority,stackBuffer,stackSize) \
|
||
|
RTOS_CreateThread(stackBuffer, stackSize, priority, function, arg, 0, 0)
|
||
|
U32 RTOS_DestroyThread( RTOS_ThreadT threadHandle );
|
||
|
|
||
|
#define RTOS_ThreadSleep(msecs) rt_thread_delay(msecs)
|
||
|
|
||
|
|
||
|
|
||
|
U32 RTOS_ThreadSetName( RTOS_ThreadT threadHandle, const char* optName);
|
||
|
U32 RTOS_SetThreadName( RTOS_ThreadT threadHandle, const char* optName);
|
||
|
char * RTOS_ThreadGetName();
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
RTOS_Status RTOS_MemoryRelease( RTOS_Memory memory );
|
||
|
RTOS_Memory RTOS_MemoryAllocate( RTOS_Size bytes, RTOS_Flag shared );
|
||
|
RTOS_Memory RTOS_MemorySet( RTOS_Memory mem, U8 value, RTOS_Size bytes );
|
||
|
RTOS_Memory RTOS_MemoryCopy( RTOS_Memory dst, RTOS_Memory src, RTOS_Size bytes );
|
||
|
|
||
|
RTOS_Memory RTOS_KernelMemoryAllocate( RTOS_Size bytes);
|
||
|
RTOS_Status RTOS_KernelMemoryRelease( RTOS_Memory memory );
|
||
|
|
||
|
#define RTOS_ATOM_PRINTF(format, ...) do {\
|
||
|
U32 pval = 0;\
|
||
|
RTOS_EnterCritical(pval);\
|
||
|
printf("\033[0;31m[@%s.%d]->"format"\033[0;0m\n", __FUNCTION__, __LINE__, ##__VA_ARGS__);\
|
||
|
RTOS_LeaveCritical(pval);\
|
||
|
}while(0)
|
||
|
|
||
|
#define RTOS_ASSERT(EX) \
|
||
|
if (!(EX)) \
|
||
|
{ \
|
||
|
volatile char dummy = 0; \
|
||
|
U32 pval = 0;\
|
||
|
RTOS_EnterCritical(pval);\
|
||
|
printf("(%s) assert failed at %s:%d thread name:%s\n", #EX, __FUNCTION__, __LINE__, RTOS_ThreadGetSelfName());\
|
||
|
while (dummy == 0); \
|
||
|
}
|
||
|
|
||
|
//U32 GKOS_EnterCriticalSection( void );
|
||
|
//void GKOS_LeaveCriticalSection( U32 cpuStatus );
|
||
|
|
||
|
void RTOS_LockScheduler( void );
|
||
|
void RTOS_UnlockScheduler( void );
|
||
|
|
||
|
void gkosFinishThread( void );
|
||
|
|
||
|
U32 RTOS_SleepThread( U32 msecs );
|
||
|
|
||
|
|
||
|
RTOS_SemaphoreT RTOS_CreateSemaphore( U32 initCount );
|
||
|
U32 RTOS_GetSemaphore( RTOS_SemaphoreT semaphoreHandle, U32 msecsTimeout );
|
||
|
U32 RTOS_SetSemaphore( RTOS_SemaphoreT semaphoreHandle, U32 msecsTimeout );
|
||
|
S32 RTOS_SemaphoreQuery( RTOS_Semaphore semaphoreHandle );
|
||
|
RTOS_Status RTOS_SemaphoreDestroy( RTOS_Semaphore semaphoreHandle );
|
||
|
|
||
|
#define RTOS_SemaphoreWait(semaphoreHandle, suspend) RTOS_WaitSemaphore(semaphoreHandle, suspend)
|
||
|
#define RTOS_SemaphoreWaitTimeout(semaphoreHandle, timeout) RTOS_GetSemaphore((RTOS_Semaphore)semaphoreHandle, timeout)
|
||
|
#define RTOS_SemaphoreCreate(initCount) RTOS_CreateSemaphore(initCount)
|
||
|
#define RTOS_SemaphoreRelease(semaphoreHandle) RTOS_SetSemaphore((RTOS_Semaphore)semaphoreHandle,RTOS_SUSPEND)
|
||
|
|
||
|
|
||
|
void RTOS_HwTickInit(void);
|
||
|
|
||
|
|
||
|
void RTOS_KernelTimerSetHook(RTOS_HookFunction function);
|
||
|
|
||
|
|
||
|
RTOS_MailqueueT RTOS_CreateMailqueue( U32 queueElements, U32 elementBytes );
|
||
|
#define RTOS_MailqueueCreate(elements) RTOS_CreateMailqueue(elements, RTOS_MSG_IS_POINTER)
|
||
|
|
||
|
|
||
|
#define RTOS_EnterCritical(cpusr) {cpusr=rt_hw_interrupt_disable();}
|
||
|
#define RTOS_LeaveCritical(cpusr) {rt_hw_interrupt_enable(cpusr);}
|
||
|
|
||
|
extern U32 cpu_cpsr;
|
||
|
|
||
|
#define RTOS_EnterCriticalEx() cpu_cpsr = RTOS_EnterCriticalSection()
|
||
|
#define RTOS_LeaveCriticalEx() RTOS_LeaveCriticalSection(cpu_cpsr)
|
||
|
|
||
|
#define RTOS_ThreadSuspend(threadHandle) RTOS_SuspendThread(threadHandle)
|
||
|
#define RTOS_ThreadWakeup(threadHandle) RTOS_WakeupThread(threadHandle)
|
||
|
|
||
|
RTOS_Status RTOS_MailqueueSend(RTOS_Mailqueue mailqueue, RTOS_Message data);
|
||
|
|
||
|
#define isb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 4" \
|
||
|
: : "r" (0) : "memory")
|
||
|
#define dsb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \
|
||
|
: : "r" (0) : "memory")
|
||
|
#define dmb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" \
|
||
|
: : "r" (0) : "memory")
|
||
|
|
||
|
void rtos_cache_inv_range(void *addr, unsigned int size);
|
||
|
void rtos_cache_clean_range(void *addr, unsigned int size);
|
||
|
|
||
|
|
||
|
U32 RTOS_Initialize(U32 Heap_size);
|
||
|
|
||
|
#define RTOS_Initialize RTOS_InitKernel
|
||
|
|
||
|
#define RTOS_GetIdentity RTOS_GetIdentity
|
||
|
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/*
|
||
|
********************************************************************************
|
||
|
** end of file
|
||
|
********************************************************************************
|
||
|
*/
|
||
|
#endif /* RTOS_LIB_H */
|
||
|
|
||
|
|
||
|
|