?? os.h
字號:
/*********************************************************************************************************
** Small RTOS
** The Real-Time Kernel
** (c) Copyright 2002-2003, chenmingji
** All Rights Reserved
** V1.50.0
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: OS.h
**創 建 人: 陳明計
**最后修改日期: 2005年6月10日
**描 述: Small RTOS C語言頭文件,定義一些宏和聲明一些函數和變量
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創建人: 陳明計
** 版 本: V1.50.0 內部測試版
** 日 期: 2005年6月10日
** 描 述: 基本完成全新的Small RTOS核
**
**--------------當前版本修訂------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#ifndef __RT_OS_H
#define __RT_OS_H
#ifdef __cplusplus
extern "C" {
#endif
#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; /* 等待此事件的任務鏈表 */
/* 改為WaitingTcbHard */
OS_TCB *WaitingTcbEnd; /* 等待此事件的任務鏈表鏈尾 */
EVENT_DATA EventData; /* 事件指針 */
} OS_EVENT;
#endif
/*********************************************************************************************************
** OS_CORE.c
********************************************************************************************************/
#ifndef IN_OS_CORE
extern OS_TCB_PRIO OSTCBPrioTbl[OS_LOWEST_PRIO +1];/* 優先級 */
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; /* 就緒的任務的最高優先級 */
#if OS_TASK_STAT_EN > 0
extern int8 OSCPUUsage;
extern __flash const fp32 OSIdleCtrMax;
extern volatile fp32 OSIdleCtr; /* 供調使用 統計CPU使用率 */
#endif
extern uint16 OSVersion(void);
extern uint8 OSInit(void);
extern uint8 OSFindNextRunningTask(void);
extern void OSIntEnter(void);
extern uint8 OSIntExit(void);
extern uint8 OSSched(void);
extern uint8 OSTimeTick(void);
extern uint8 OSSetRoundTick(uint8 Prio, uint16 Ticks);
#if OS_TASK_STAT_EN > 0
extern void OSCPUStat(void);
#endif
#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(uint16 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 OSTaskStkSize;
extern uint8 OSTaskStkSizeHard;
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,
uint8 TaskStat);
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_MSG.c
********************************************************************************************************/
#ifndef IN_OS_MSG
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_Q.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, uint16 PSR);
#endif
#ifdef __cplusplus
}
#endif
#endif
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -