?? os_core.c
字號:
/*********************************************************************************************************
** Small RTOS
** The Real-Time Kernel
** (c) Copyright 2002-2003, chenmingji
** All Rights Reserved
** V1.50.0
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: OS_CORE.C
**創(chuàng) 建 人: 陳明計
**最后修改日期: 2005年6月10日
**描 述: Small RTOS與CPU無關(guān)的核心代碼
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創(chuàng)建人: 陳明計
** 版 本: V1.00
** 日 期: 2005年6月10日
** 描 述: 基本完成全新的Small RTOS核
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版 本:
** 日 期:
**
**--------------當(dāng)前版本修訂------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_OS_CORE
#define IN_OS
#include "includes.h"
OS_TCB_PRIO OSTCBPrioTbl[OS_LOWEST_PRIO + 1]; /* 優(yōu)先級控制塊 */
OS_TCB OSTCBTbl[OS_MAX_TASKS + 1]; /* 任務(wù)控制塊 */
OS_TCB *OSTCBCur; /* 當(dāng)前任務(wù)控制塊 */
OS_TCB *OSTCBHighRdy; /* 新任務(wù)控制塊 */
uint8 OSHighPrio; /* 就緒的任務(wù)的最高優(yōu)先級 */
uint8 OSIntNesting; /* 中斷嵌套層次 */
uint8 OsEnterSum; /* 關(guān)中斷嵌套層次 */
#if OS_TASK_STAT_EN > 0
int8 OSCPUUsage; /* 供調(diào)使用 統(tǒng)計CPU使用率 */
__flash const fp32 OSIdleCtrMax=32500;
volatile fp32 OSIdleCtr;
#endif
__flash const uint8 OSMapTbl[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00};
/*********************************************************************************************************
** 函數(shù)名稱: OSVersion
** 功能描述: 獲取Small RTOS 版本號
** 輸 入: 無
** 輸 出: 版本號*100
** 作 者: 陳明計
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint16 OSVersion(void)
{
return OS_VERSION;
}
/*********************************************************************************************************
** 函數(shù)名稱: OSInit
** 功能描述: 系統(tǒng)初始化
** 輸 入: 無
** 輸 出: OS_NO_ERR
** 作 者: 陳明計
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSInit(void)
{
uint8 i1;
uint32 i2;
OS_TCB_PRIO *tcbp;
OS_TCB *tcb;
/* 初始化優(yōu)先級控制塊 */
tcbp = OSTCBPrioTbl;
for (i1 = 0; i1 < OS_LOWEST_PRIO; i1++)
{
tcbp->OSTCBDly = 0;
tcbp->OSTCBDlyReload = 10;
tcbp->TcbNext= NULL;
tcbp++;
}
tcbp->OSTCBDly = 0;
tcbp->OSTCBDlyReload = 0;
tcbp->TcbNext = OSTCBTbl + OS_MAX_TASKS; /* 空閑任務(wù) */
/* 初始化任務(wù)控制塊 */
tcb = &(OSTCBTbl[0]);
for (i2 = 0; i2 < OS_MAX_TASKS; i2++)
{
tcb->OSTCBStat = OS_STAT_DEATH;
tcb->OSTCBInfo = OS_INFO_MSG_SENGED;
tcb->OSTCBDly = 0;
tcb->OSTCBId = i2;
tcb->TcbNext = NULL;
#if OS_MAX_EVENTS > 0
tcb->EventNext = NULL;
#endif
#if EN_OS_MSG > 0
tcb->Msg = NULL;
tcb->MsgHard = NULL;
tcb->MsgEnd = NULL;
tcb->MsgNext = NULL;
#endif
tcb++;
}
/* 初始化空閑任務(wù) */
tcb->OSTCBStat = 0;
tcb->OSTCBInfo = OS_INFO_MSG_SENGED;
tcb->OSTCBPrio = OS_LOWEST_PRIO;
tcb->OSTCBDly = 0;
tcb->OSTCBId = OS_MAX_TASKS;
tcb->TcbNext = tcb;
tcb->TcbPrev = tcb;
#if OS_MAX_EVENTS > 0
tcb->EventNext = NULL;
tcb->EventPrev = NULL;
#endif
#if EN_OS_MSG > 0
tcb->Msg = NULL;
tcb->MsgHard = NULL;
tcb->MsgEnd = NULL;
tcb->MsgNext = NULL;
#endif
/* 初始化其它變量 */
OSTCBCur = tcb; /* 任務(wù)控制塊(TCB)控制空閑任務(wù) */
OSTCBHighRdy = tcb;
OsEnterSum = 0;
OSIntNesting = 0;
OSTickCnt = 0;
OSTickThisCnt = 0;
OSHighPrio = OS_LOWEST_PRIO;
OSTCBTimeDly = NULL;
OSEventinit(); /* 事件控制初始化代碼 */
return OS_NO_ERR;
}
/*********************************************************************************************************
** 函數(shù)名稱: OSSetRoundTick
** 功能描述: 設(shè)置指定優(yōu)先級的任務(wù)的輪詢時間
** 輸 入: Prio:要設(shè)置的優(yōu)先級
** Ticks:輪詢時間
** 輸 出: OS_NO_ERR
** 作 者: 陳明計
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSSetRoundTick(uint8 Prio, uint16 Ticks)
{
OS_CPU_SR cpu_sr = 0;
OS_ENTER_CRITICAL();
if (Prio < OS_LOWEST_PRIO) /* 優(yōu)先級存在 */
{
OSTCBPrioTbl[Prio].OSTCBDlyReload = Ticks; /* 設(shè)置輪詢時間 */
OSTCBPrioTbl[Prio].OSTCBDly = Ticks; /* 設(shè)置當(dāng)次輪詢時間 */
if (OSTCBCur->OSTCBPrio == Prio) /* 如果是當(dāng)前任務(wù) */
if (OSTickCnt == 0) /* 沒有任務(wù)需要時間服務(wù)延時 */
{
/* 啟動時間服務(wù) */
OSTickCnt = Ticks;
OSTickThisCnt = Ticks;
}
}
OS_EXIT_CRITICAL();
return OS_NO_ERR;
}
/*********************************************************************************************************
** 函數(shù)名稱: OSFindNextRunningTask
** 功能描述: 查找下一個優(yōu)先級最高的就緒任務(wù)
** 輸 入: 無
** 輸 出: OS_NO_ERR
** 作 者: 陳明計
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSFindNextRunningTask(void)
{
OS_TCB_PRIO *tcbp;
uint8 temp;
temp = OSHighPrio; /* 從優(yōu)先級OSHighPrio處開始查找 */
tcbp = &(OSTCBPrioTbl[temp]);
while (1)
{
if (tcbp->TcbNext != NULL) /* 相應(yīng)的優(yōu)先級有任務(wù)就緒 */
{
OSTCBHighRdy = tcbp->TcbNext; /* 獲取將要運(yùn)行的任務(wù)的TCB */
OSHighPrio = temp; /* 設(shè)置下次查找起始點 */
if (OSTickCnt == 0) /* 沒有任務(wù)需要時間服務(wù)延時 */
if (tcbp->OSTCBDly != 0) /* 新優(yōu)先級需要輪詢服務(wù) */
{
/* 啟動時間服務(wù) */
OSTickCnt = tcbp->OSTCBDly;
OSTickThisCnt = OSTickCnt;
}
break;
}
tcbp++;
temp++;
}
return OS_NO_ERR;
}
/*********************************************************************************************************
** 函數(shù)名稱: OSIntEnter
** 功能描述: 進(jìn)入中斷處理函數(shù)
** 輸 入: 無
** 輸 出: 無
** 作 者: 陳明計
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSIntEnter (void)
{
OSIntNesting++; /* 中斷嵌套加一 */
_SEI(); /* 允許AVR中斷嵌套 */
}
/*********************************************************************************************************
** 函數(shù)名稱: OSIntExit
** 功能描述: 中斷退出處理函數(shù),在此進(jìn)行中斷后的任務(wù)切換
** 輸 入: 無
** 輸 出: TRUE:需要進(jìn)行任務(wù)切換
** FALSE:不需要進(jìn)行任務(wù)切換
** 作 者: 陳明計
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSIntExit(void)
{
OS_CPU_SR cpu_sr = 0;
OS_ENTER_CRITICAL();
OsEnterSum = 0; /* 因為在中斷中,所以關(guān)中斷計數(shù)器為0 */
/* 中斷嵌套處理 */
if (OSIntNesting > 0)
{
OSIntNesting--;
}
if (OSIntNesting == 0)
{
OSFindNextRunningTask();
if (OSTCBCur != OSTCBHighRdy)
{
OSIntCtxSw();
OS_EXIT_CRITICAL();
return 1;
}
}
OS_EXIT_CRITICAL();
return 0;
}
/*********************************************************************************************************
** 函數(shù)名稱: OSSched
** 功能描述: 非中斷的任務(wù)切換函數(shù)
** 輸 入: 無
** 輸 出: OS_NO_ERR
** 作 者: 陳明計
** 日 期: 2005年6月10日
**------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSSched(void)
{
if (OSIntNesting == 0) /* 是否是中斷中調(diào)用 */
{
OSFindNextRunningTask();
if (OSTCBCur != OSTCBHighRdy)
{
OS_TASK_SW();
}
}
return OS_NO_ERR;
}
/*********************************************************************************************************
** 函數(shù)名稱: OSCPUStat
** 功能描述: 計算CPU的使用率
** 輸 入: 無
** 輸 出: 無
** 作 者: 劉永奎
** 日 期: 2008年3月6日
**------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if OS_TASK_STAT_EN > 0
void OSCPUStat(void)
{
if(OSIdleCtr==0)
{
OSCPUUsage=0;
OSIdleCtr=0;
return;
}
else if(OSIdleCtr>=OSIdleCtrMax)
{
OSCPUUsage=100;
OSIdleCtr=0;
return;
}
else
{
OSCPUUsage=100-(int8)( (OSIdleCtr/OSIdleCtrMax)*100+0.5 );
OSIdleCtr=0;
}
}
#endif
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -