⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os.h

📁 陈明计先生的RTOS,堪称经典
💻 H
字号:
/*********************************************************************************************************
**                                        Small RTOS
**                                   The Real-Time Kernel
**                           (c) Copyright 2002-2003, chenmingji
**                                     All Rights Reserved
**                                         V1.50.0
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: OS.h
**创   建   人: 陈明计
**最后修改日期: 2004年9月5日
**描      述: Small RTOS C语言头文件,定义一些宏和声明一些函数和变量
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版  本: V1.50.0 内部测试版
** 日 期: 2004年9月5日
** 描 述: 基本完成全新的Small RTOS核
**
**------------------------------------------------------------------------------------------------------
** 修改人: 
** 版  本: 
** 日 期: 
** 描 述: 
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#define  OS_VERSION    150                              /* 系统版本号   */

/*********************************************************************************************************
**                            定义函数返回值
********************************************************************************************************/
#define OS_NO_ERR                 0             /* 结果正确         */
#define OS_ERR_EVENT_TYPE         1             /* 错误事件类型     */
#define OS_ERR_PEND_ISR           2             /* 在IRS中等待事件  */
#define OS_ERR_POST_NULL_PTR      3             /* 发送消息指针为空 */
#define OS_ERR_PEVENT_NULL        4             /* 事件指针为空     */


#define OS_TASK_DEL_ISR          10             /* 在ISR中删除任务  */
#define OS_PRIO_INVALID          11             /* 错误的任务优先级 */
#define OS_TASKID_INVALID        12             /* 错误的任务ID     */

#define OS_TIMEOUT               20             /* 超时             */

#define OS_MSG_EMPTY             30             /* 消息空           */
#define OS_MSG_SEND_ERR          31             /* 消息发送错误     */

#define OS_EVENT_DEL             40             /* 事件被删除       */

#define OS_Q_FULL                50             /* 消息队列满       */

#define OS_SEM_OVF               60             /* 信号量满         */

/*********************************************************************************************************
**                            定义其它
********************************************************************************************************/
#define BASE_FIFO               1           /* 等待事件模式为FIFO       */
#define BASE_PRIO               2           /* 等待事件模式为基于优先级 */

#if OS_MAX_TASKS < 255
typedef uint8  TASK_ID;
#define  OS_ID_SELF             0xff
#else
    #if OS_MAX_TASKS < 65535
typedef uint16  TASK_ID;
#define  OS_ID_SELF             0xffff
    #else
typedef uint32  TASK_ID;
#define  OS_ID_SELF             0xffffffff
    #endif
#endif


#define OS_STAT_SUSPEND     (1 << 0)    /* 任务挂起         */
#define OS_STAT_DLY         (1 << 1)    /* 等待超时         */
#define OS_STAT_EVENT       (1 << 2)    /* 等待事件         */
#define OS_STAT_MSG         (1 << 3)    /* 等待消息         */
#define OS_STAT_MSG_SENGED  (1 << 4)    /* 等待消息发送完毕 */
#define OS_STAT_MSG_BACK    (1 << 5)    /* 等待消息回应     */
#define OS_STAT_DEBUG       (1 << 6)    /* 正在调试状态     */
#define OS_STAT_DEATH       (1 << 7)    /* 任务死亡         */

#define OS_INFO_RESUME      (1 << 0)    /* 任务已恢复       */
#define OS_INFO_DLY         (1 << 1)    /* 任务延时完成     */
#define OS_INFO_EVENT       (1 << 2)    /* 任务得到事件     */
#define OS_INFO_MSG         (1 << 3)    /* 任务得到消息     */
#define OS_INFO_MSG_SENGED  (1 << 4)    /* 任务发送消息完毕 */
#define OS_INFO_MSG_BACK    (1 << 5)    /* 任务得到消息反馈 */


#define OS_EVENT_SEM        0x01
#define OS_EVENT_Q          0x02

/*********************************************************************************************************
**                            定义数据结构
********************************************************************************************************/
typedef struct os_tcb
{
    OS_STK          *OSTCBStkPtr;                       /* 任务当前堆栈 */

    uint8           OSTCBStat;                          /* 任务状态 */
    uint8           OSTCBPrio;                          /* 任务优先级 */
    uint16          OSTCBDly;                           /* 任务延时、超时时间 */
    TASK_ID         OSTCBId;                            /* 任务ID */
    uint8           OSTCBInfo;                          /* 任务优先级 */

    struct os_tcb   *TcbNext;                           /* 任务链表用 */
    struct os_tcb   *TcbPrev;                           /* 任务链表用 */
    
#if OS_MAX_EVENTS > 0
    struct os_tcb   *EventNext;                         /* 等待事件链表用 */
    struct os_tcb   *EventPrev;                         /* 等待事件链表用 */
#endif

#if EN_OS_MSG > 0
    void            *Msg;                               /* 给另一个任务发送的消息 */
    struct os_tcb   *MsgHard;                           /* 给自身消息的任务链表的表头 */
    struct os_tcb   *MsgEnd;                            /* 给自身消息的任务链表的表尾 */
    struct os_tcb   *MsgNext;                           /* 给那个任务发送消息的所有任务组成的链表  */
    struct os_tcb   *MsgPrev;                           /* 给那个任务发送消息的所有任务组成的链表  */
#endif
} OS_TCB;


typedef struct os_tcb_prio                              /* 优先级控制块 */
 {
    uint16      OSTCBDly;                               /* 此优先级延时节拍数 */
    uint16      OSTCBDlyReload;                         /* 此优先级延轮询调度节拍数 */
    OS_TCB      *TcbNext;                               /* 此优先级就绪任务链表 */
} OS_TCB_PRIO;


#if OS_MAX_EVENTS > 0

struct _OS_EVENT;

typedef struct _OS_Q                                    /* 消息队列 */
{
    void                **Out;                          /* 指向消息输出位置         */
    void                **In;                           /* 指向消息输入位置         */
    void                **End;                          /* 指向Buf的结束位置        */
    uint16              NData;                          /* 队列中数据个数           */
    uint16              MaxData;                        /* 队列中允许存储的数据个数 */
    
    void                *Buf[1];                        /* 存储数据的空间           */
} OS_Q;


typedef union 
{
    uint16              Cnt;                            /* 信号量计数      */
    void                *OSQPtr;                        /* 消息指针        */
    struct _OS_EVENT    *EventNext;                     /* 空闲事件链表用  */
} EVENT_DATA;


typedef struct _OS_EVENT                                /* 事件控制块 */
{
    uint8       OSEventType;                            /* 事件类型 */
    OS_TCB      *WaitingTcb;                            /* 等待此事件的任务链表 */
    OS_TCB      *WaitingTcbEnd;                         /* 等待此事件的任务链表链尾 */
    EVENT_DATA  EventData;                              /* 事件指针 */
} OS_EVENT;
#endif

/*********************************************************************************************************
**                            OS_CORE.c
********************************************************************************************************/
#ifndef IN_OS_CORE

extern OS_TCB_PRIO  OSTCBPrioTbl[OS_LOWEST_PRIO];   /* 优先级                   */
extern OS_TCB       OSTCBTbl[OS_MAX_TASKS + 1];     /* 任务控制块               */
extern OS_TCB       *OSTCBCur;                      /* 当前任务控制块           */
extern OS_TCB       *OSTCBHighRdy;                  /* 新任务控制块             */
extern uint8        const OSMapTbl[];
extern uint8        OsEnterSum;                     /* 管中断嵌套层次           */
extern uint8        OSIntNesting;                   /* 中断嵌套层次             */
extern uint8        OSHighPrio;                     /* 就绪的任务的最高优先级   */

extern uint16 OSVersion(void);
extern uint8 OSInit(void);
extern uint8 OSFindNextRunningTask(void);
extern uint8 OSIntExit(void);
extern uint8 OSSched(void);
extern uint8 OSTimeTick(void);
extern uint8 OSSetRoundTick(uint8 Prio, uint16 Ticks);

#endif

/*********************************************************************************************************
**                            OS_TIME.c
********************************************************************************************************/
#ifndef IN_OS_TIME

extern OS_TCB       *OSTCBTimeDly;                  /* 超时延时任务链表     */
extern uint16       OSTickCnt;                      /* 当前计数初值         */
extern uint16       OSTickThisCnt;                  /* 当前计数剩余值       */

extern uint8 OSTimeTick(void);
extern uint8 OS_TimeDly(uint16 ticks);
extern uint8 OSTimeDly(uint8 ticks);
extern uint8 OSTimeDlyResume(TASK_ID TaskID);
extern uint8  OS_TimeTick(void);
extern uint8 OS_TimeTickDel(OS_TCB *Tcb);

#endif
/*********************************************************************************************************
**                            OS_TASK.c
********************************************************************************************************/
#ifndef IN_OS_TASK

extern uint8 _OS_TaskResume(OS_TCB *Tcb);
extern uint8 OS_TaskResume(TASK_ID TaskID);
extern uint8 _OS_TaskSuspend(OS_TCB *Tcb);
extern uint8 OSTaskCreate(void   (*Task)(void *Pd),
                          void    *Pdata,
                          OS_STK  *Ptos,
                          uint8    Prio,
                          TASK_ID  TaskId,
                          uint32   StkSize,
                          int      PSR);
extern uint8 OSTaskDel(TASK_ID TaskID);
extern uint8 OSTaskResume(TASK_ID TaskID);
extern uint8 OSTaskSuspend(TASK_ID TaskID);
extern uint8 OSTaskChangePrio(TASK_ID TaskID, uint8 NewPrio);

#endif

/*********************************************************************************************************
**                            OS_TIME.c
********************************************************************************************************/
#ifndef IN_OS_TIME
extern void * OSMsgPend(uint8 Tick, TASK_ID *TaskId, uint8 *err);
extern void * OSMsgAccept(TASK_ID *TaskId, uint8 *err);
extern uint8 OSMsgPost(TASK_ID TaskId, void *Msg);
extern uint8  OSMsgPostFront(TASK_ID TaskId, void * Msg);
extern uint32 OSMsgNMsgs(TASK_ID TaskId);
extern void OSMsgFlush (TASK_ID TaskId);
extern uint8 OSMsgDel (TASK_ID TaskId);
extern uint8 OSMsgSended (uint16 Tick);
extern void * OSMsgBackPend (uint16 Tick, uint8 *err);
extern void * OSMsgBackAccept (uint8 *err);
extern uint8 OSMsgBackPost (TASK_ID TaskId, void *Msg);
#endif

/*********************************************************************************************************
**                            OS_EVENT.c
********************************************************************************************************/

#ifndef IN_OS_EVENT
extern uint8 OSEventinit(void);
extern OS_EVENT * OSEventNew (void);
extern uint8 OSEventResume(OS_EVENT *pEvent);
extern uint8 OSEventFree (OS_EVENT *pEvent);
extern uint8 OSEventWait (OS_EVENT *pEvent, uint8 Tick);
#endif

/*********************************************************************************************************
**                            OS_SEM.c
********************************************************************************************************/

#ifndef IN_OS_SEM
extern OS_EVENT * OSSemCreate(uint16 Data);
extern uint8 OSSemPend(OS_EVENT * pEvent, uint16 Tick);
extern uint16 OSSemAccept(OS_EVENT * pEvent);
extern uint8 OSSemPost(OS_EVENT * pEvent);
extern uint8 OSSemQuery(OS_EVENT * pEvent, uint16 *Cnt);
extern uint8 OSSemDel(OS_EVENT * pEvent);
#endif


/*********************************************************************************************************
**                            OS_SEM.c
********************************************************************************************************/

#ifndef IN_OS_Q
extern OS_EVENT * OSQCreate(void *Buf, uint8 SizeOfBuf);
extern void * OSQPend(OS_EVENT * pEvent, uint16 Tick, uint8 *err);
extern void * OSQAccept(OS_EVENT * pEvent);
extern uint8 OSQPost(OS_EVENT * pEvent, void *Msg);
extern uint8 OSQPostFront(OS_EVENT * pEvent, void *Msg);
extern uint16 OSQNMsgs(OS_EVENT * pEvent);
extern uint16 OSQSize(OS_EVENT * pEvent);
extern void OSQFlush (OS_EVENT * pEvent);

#endif

/*********************************************************************************************************
**                            OS_CPU_C.c
********************************************************************************************************/
#ifndef IN_OS_CPU_C
extern OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, int PSR);
#endif
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -