📄 os.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 + -