📄 os_core.c
字号:
/*********************************************************************************************************
** Small RTOS
** The Real-Time Kernel
** (c) Copyright 2002-2003, chenmingji
** All Rights Reserved
** V1.50.0
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: OS_CORE.C
**创 建 人: 陈明计
**最后修改日期: 2004年9月5日
**描 述: Small RTOS与CPU无关的核心代码
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版 本: V1.00
** 日 期: 2004年9月5日
** 描 述: 基本完成全新的Small RTOS核
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版 本:
** 日 期:
** 描 述:
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_OS_CORE
#define IN_OS
#include "config.h"
OS_TCB_PRIO OSTCBPrioTbl[OS_LOWEST_PRIO]; /* 优先级控制块 */
OS_TCB OSTCBTbl[OS_MAX_TASKS + 1]; /* 任务控制块 */
OS_TCB *OSTCBCur; /* 当前任务控制块 */
OS_TCB *OSTCBHighRdy; /* 新任务控制块 */
uint8 OSHighPrio; /* 就绪的任务的最高优先级 */
uint8 OSIntNesting; /* 中断嵌套层次 */
uint8 OsEnterSum; /* 关中断嵌套层次 */
//const uint8 OSMapTbl[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00};
/*********************************************************************************************************
** 函数名称: OSVersion
** 功能描述: 获取Small RTOS 版本号
** 输 入: 无
** 输 出: 版本号*100
** 作 者: 陈明计
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint16 OSVersion(void)
{
return OS_VERSION;
}
/*********************************************************************************************************
** 函数名称: OSInit
** 功能描述: 系统初始化
** 输 入: 无
** 输 出: OS_NO_ERR
** 作 者: 陈明计
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSInit(void)
{
uint8 i1;
uint32 i2;
OS_TCB_PRIO *tcbp;
OS_TCB *tcb;
/* 初始化优先级控制块 */
tcbp = OSTCBPrioTbl;
for (i1 = 0; i1 < OS_LOWEST_PRIO - 1; i1++)
{
tcbp->OSTCBDly = 0;
tcbp->OSTCBDlyReload = 10;
tcbp->TcbNext= NULL;
tcbp++;
}
tcbp->OSTCBDly = 0;
tcbp->OSTCBDlyReload = 0;
tcbp->TcbNext = OSTCBTbl + OS_MAX_TASKS; /* 空闲任务 */
/* 初始化任务控制块 */
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;
tcb->EventPrev = NULL;
#endif
#if EN_OS_MSG > 0
tcb->Msg = NULL;
tcb->MsgHard = NULL;
tcb->MsgEnd = NULL;
tcb->MsgNext = NULL;
#endif
tcb++;
}
/* 初始化空闲任务 */
tcb->OSTCBStat = 0;
tcb->OSTCBInfo = OS_INFO_MSG_SENGED;
tcb->OSTCBPrio = OS_LOWEST_PRIO;
tcb->OSTCBDly = 0;
tcb->OSTCBId = OS_MAX_TASKS;
tcb->TcbNext = NULL;
tcb->TcbPrev = NULL;
#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;
OSTCBHighRdy = tcb;
OsEnterSum = 0;
OSIntNesting = 0;
OSTickCnt = 0;
OSTickThisCnt = 0;
OSHighPrio = OS_LOWEST_PRIO;
OSTCBTimeDly = NULL;
OSEventinit(); /* 事件控制初始化代码 */
OSCPUInit(); /* 目标CPU的特殊初始化代码 */
return OS_NO_ERR;
}
/*********************************************************************************************************
** 函数名称: OSSetRoundTick
** 功能描述: 设置指定优先级的任务的轮询时间
** 输 入: Prio:要设置的优先级
** Ticks:轮询时间
** 输 出: OS_NO_ERR
** 作 者: 陈明计
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSSetRoundTick(uint8 Prio, uint16 Ticks)
{
OS_ENTER_CRITICAL();
if (Prio <= OS_LOWEST_PRIO) /* 优先级存在 */
{
OSTCBPrioTbl[Prio].OSTCBDlyReload = Ticks; /* 设置轮询时间 */
OSTCBPrioTbl[Prio].OSTCBDly = Ticks; /* 设置当次轮询时间 */
if (OSTCBCur->OSTCBPrio == Prio) /* 如果是当前任务 */
if (OSTickCnt == 0) /* 没有任务需要时间服务延时 */
{
/* 启动时间服务 */
OSTickCnt = Ticks;
OSTickThisCnt = Ticks;
}
}
OS_EXIT_CRITICAL();
return OS_NO_ERR;
}
/*********************************************************************************************************
** 函数名称: OSFindNextRunningTask
** 功能描述: 查找下一个优先级最高的就绪任务
** 输 入: 无
** 输 出: OS_NO_ERR
** 作 者: 陈明计
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: a
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSFindNextRunningTask(void)
{
OS_TCB_PRIO *tcbp;
uint8 temp;
temp = OSHighPrio; /* 从优先级OSHighPrio处开始查找 */
tcbp = &(OSTCBPrioTbl[temp]);
while (1)
{
if (tcbp->TcbNext != NULL) /* 相应的优先级有任务就绪 */
{
OSTCBHighRdy = tcbp->TcbNext; /* 获取将要运行的任务的TCB */
OSHighPrio = temp; /* 设置下次查找起始点 */
if (OSTickCnt == 0) /* 没有任务需要时间服务延时 */
if (tcbp->OSTCBDly != 0) /* 新优先级需要轮询服务 */
{
/* 启动时间服务 */
OSTickCnt = tcbp->OSTCBDly;
OSTickThisCnt = OSTickCnt;
}
break;
}
tcbp++;
temp++;
}
return OS_NO_ERR;
}
/*********************************************************************************************************
** 函数名称: OSIntExit
** 功能描述: 中断退出处理函数,在此进行中断后的任务切换
** 输 入: 无
** 输 出: TRUE:需要进行任务切换
** FALSE:不需要进行任务切换
** 作 者: 陈明计
** 日 期: 2004年9月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSIntExit(void)
{
OS_ENTER_CRITICAL();
/* 中断嵌套处理 */
if (OSIntNesting > 0)
{
OSIntNesting--;
}
if (OSIntNesting == 0)
{
OsEnterSum = 0; /* 因为在中断中,所以关中断计数器为0 */
OSFindNextRunningTask();
if (OSTCBCur != OSTCBHighRdy)
{
OSIntCtxSw(); /* 进行任务调度 */
}
return TRUE;
}
OS_EXIT_CRITICAL();
return FALSE;
}
/*********************************************************************************************************
** 函数名称: OSSched
** 功能描述: 非中断的任务切换函数
** 输 入: 无
** 输 出: OS_NO_ERR
** 作 者: 陈明计
** 日 期: 2004年9月5日
**------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSSched(void)
{
OS_ENTER_CRITICAL();
if (OSIntNesting == 0) /* 是否是中断中调用 */
{
OSFindNextRunningTask();
if (OSTCBCur != OSTCBHighRdy)
{
OS_TASK_SW(); /* 进行任务调度 */
}
}
OS_EXIT_CRITICAL();
return OS_NO_ERR;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -