?? os.h
字號(hào):
/*********************************************************************************************************
** Small RTOS
** The Real-Time Kernel
** (c) Copyright 2002-2003, chenmingji
** All Rights Reserved
** V1.50.0
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: OS.h
**創(chuàng) 建 人: 陳明計(jì)
**最后修改日期: 2005年6月10日
**描 述: Small RTOS C語言頭文件,定義一些宏和聲明一些函數(shù)和變量
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創(chuàng)建人: 陳明計(jì)
** 版 本: V1.50.0 內(nèi)部測(cè)試版
** 日 期: 2005年6月10日
** 描 述: 基本完成全新的Small RTOS核
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版 本:
** 日 期:
** 描 述:
**
**--------------當(dāng)前版本修訂------------------------------------------------------------------------------
** 修改人: 焦進(jìn)星
** 日 期: 2007年12月30日
** 描 述: 移植到AVR系列芯片,適用于atmega16/32等
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#ifndef __RT_OS_H
#define __RT_OS_H
#ifdef __cplusplus
extern "C" {
#endif
#define OS_VERSION 150 /* 系統(tǒng)版本號(hào) */
/*********************************************************************************************************
** 定義函數(shù)返回值
********************************************************************************************************/
#define OS_NO_ERR 0 /* 結(jié)果正確 */
#define OS_ERR_EVENT_TYPE 1 /* 錯(cuò)誤事件類型 */
#define OS_ERR_PEND_ISR 2 /* 在IRS中等待事件 */
#define OS_ERR_POST_NULL_PTR 3 /* 發(fā)送消息指針為空 */
#define OS_ERR_PEVENT_NULL 4 /* 事件指針為空 */
#define OS_TASK_DEL_ISR 10 /* 在ISR中刪除任務(wù) */
#define OS_PRIO_INVALID 11 /* 錯(cuò)誤的任務(wù)優(yōu)先級(jí) */
#define OS_TASKID_INVALID 12 /* 錯(cuò)誤的任務(wù)ID */
#define OS_TIMEOUT 20 /* 超時(shí) */
#define OS_MSG_EMPTY 30 /* 消息空 */
#define OS_MSG_SEND_ERR 31 /* 消息發(fā)送錯(cuò)誤 */
#define OS_EVENT_DEL 40 /* 事件被刪除 */
#define OS_Q_FULL 50 /* 消息隊(duì)列滿 */
#define OS_SEM_OVF 60 /* 信號(hào)量滿 */
/*********************************************************************************************************
** 定義其它
********************************************************************************************************/
#define BASE_FIFO 1 /* 等待事件模式為FIFO */
#define BASE_PRIO 2 /* 等待事件模式為基于優(yōu)先級(jí) */
#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) /* 任務(wù)掛起 */
#define OS_STAT_DLY (1 << 1) /* 等待超時(shí) */
#define OS_STAT_EVENT (1 << 2) /* 等待事件 */
#define OS_STAT_MSG (1 << 3) /* 等待消息 */
#define OS_STAT_MSG_SENGED (1 << 4) /* 等待消息發(fā)送完畢 */
#define OS_STAT_MSG_BACK (1 << 5) /* 等待消息回應(yīng) */
#define OS_STAT_DEBUG (1 << 6) /* 正在調(diào)試狀態(tài) */
#define OS_STAT_DEATH (1 << 7) /* 任務(wù)死亡 */
#define OS_INFO_RESUME (1 << 0) /* 任務(wù)已恢復(fù) */
#define OS_INFO_DLY (1 << 1) /* 任務(wù)延時(shí)完成 */
#define OS_INFO_EVENT (1 << 2) /* 任務(wù)得到事件 */
#define OS_INFO_MSG (1 << 3) /* 任務(wù)得到消息 */
#define OS_INFO_MSG_SENGED (1 << 4) /* 任務(wù)發(fā)送消息完畢 */
#define OS_INFO_MSG_BACK (1 << 5) /* 任務(wù)得到消息反饋 */
#define OS_EVENT_SEM 0x01
#define OS_EVENT_Q 0x02
/*********************************************************************************************************
** 定義數(shù)據(jù)結(jié)構(gòu)
********************************************************************************************************/
typedef struct os_tcb
{
OS_STK *OSTCBStkPtr; /* 任務(wù)當(dāng)前堆棧 */
uint8 OSTCBStat; /* 任務(wù)狀態(tài) */
uint8 OSTCBPrio; /* 任務(wù)優(yōu)先級(jí) */
uint16 OSTCBDly; /* 任務(wù)延時(shí)、超時(shí)時(shí)間 */
TASK_ID OSTCBId; /* 任務(wù)ID */
uint8 OSTCBInfo; /* 任務(wù)優(yōu)先級(jí) */
struct os_tcb *TcbNext; /* 任務(wù)鏈表用 */
struct os_tcb *TcbPrev; /* 任務(wù)鏈表用 */
#if OS_MAX_EVENTS > 0
struct os_tcb *EventNext; /* 等待事件鏈表用 */
struct os_tcb *EventPrev; /* 等待事件鏈表用 */
#endif
#if EN_OS_MSG > 0
void *Msg; /* 給另一個(gè)任務(wù)發(fā)送的消息 */
struct os_tcb *MsgHard; /* 給自身消息的任務(wù)鏈表的表頭 */
struct os_tcb *MsgEnd; /* 給自身消息的任務(wù)鏈表的表尾 */
struct os_tcb *MsgNext; /* 給那個(gè)任務(wù)發(fā)送消息的所有任務(wù)組成的鏈表 */
struct os_tcb *MsgPrev; /* 給那個(gè)任務(wù)發(fā)送消息的所有任務(wù)組成的鏈表 */
#endif
} OS_TCB;
typedef struct os_tcb_prio /* 優(yōu)先級(jí)控制塊 */
{
uint16 OSTCBDly; /* 此優(yōu)先級(jí)延時(shí)節(jié)拍數(shù) */
uint16 OSTCBDlyReload; /* 此優(yōu)先級(jí)延輪詢調(diào)度節(jié)拍數(shù) */
OS_TCB *TcbNext; /* 此優(yōu)先級(jí)就緒任務(wù)鏈表 */
} OS_TCB_PRIO;
#if OS_MAX_EVENTS > 0
struct _OS_EVENT;
typedef struct _OS_Q /* 消息隊(duì)列 */
{
void **Out; /* 指向消息輸出位置 */
void **In; /* 指向消息輸入位置 */
void **End; /* 指向Buf的結(jié)束位置 */
uint16 NData; /* 隊(duì)列中數(shù)據(jù)個(gè)數(shù) */
uint16 MaxData; /* 隊(duì)列中允許存儲(chǔ)的數(shù)據(jù)個(gè)數(shù) */
void *Buf[1]; /* 存儲(chǔ)數(shù)據(jù)的空間 */
} OS_Q;
typedef union
{
uint16 Cnt; /* 信號(hào)量計(jì)數(shù) */
void *OSQPtr; /* 消息指針 */
struct _OS_EVENT *EventNext; /* 空閑事件鏈表用 */
} EVENT_DATA;
typedef struct _OS_EVENT /* 事件控制塊 */
{
uint8 OSEventType; /* 事件類型 */
OS_TCB *WaitingTcb; /* 等待此事件的任務(wù)鏈表 */
/* 改為WaitingTcbHard */
OS_TCB *WaitingTcbEnd; /* 等待此事件的任務(wù)鏈表鏈尾 */
EVENT_DATA EventData; /* 事件指針 */
} OS_EVENT;
#endif
/*********************************************************************************************************
** OS_CORE.c
********************************************************************************************************/
#ifndef IN_OS_CORE
extern OS_TCB_PRIO OSTCBPrioTbl[OS_LOWEST_PRIO]; /* 優(yōu)先級(jí) */
extern OS_TCB OSTCBTbl[OS_MAX_TASKS + 1]; /* 任務(wù)控制塊 */
extern OS_TCB *OSTCBCur; /* 當(dāng)前任務(wù)控制塊 */
extern OS_TCB *OSTCBHighRdy; /* 新任務(wù)控制塊 */
extern uint8 const OSMapTbl[];
extern uint8 OsEnterSum; /* 管中斷嵌套層次 */
extern uint8 OSIntNesting; /* 中斷嵌套層次 */
extern uint8 OSHighPrio; /* 就緒的任務(wù)的最高優(yōu)先級(jí) */
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; /* 超時(shí)延時(shí)任務(wù)鏈表 */
extern uint16 OSTickCnt; /* 當(dāng)前計(jì)數(shù)初值 */
extern uint16 OSTickThisCnt; /* 當(dāng)前計(jì)數(shù)剩余值 */
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,
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_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
#ifdef __cplusplus
}
#endif
#endif
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -