📄 os_task.c
字号:
/*********************************************************************************************************
** Small RTOS
** The Real-Time Kernel
** (c) Copyright 2002-2003, chenmingji
** All Rights Reserved
** V1.50.0
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: OS_Task.c
**创 建 人: 陈明计
**最后修改日期: 2005年6月10日
**描 述: Small RTOS任务处理代码
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版 本: V1.00
** 日 期: 2005年6月10日
** 描 述: 基本完成全新的Small RTOS核
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版 本:
** 日 期:
** 描 述:
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 焦进星
** 日 期: 2007年12月30日
** 描 述: 移植到AVR系列芯片,适用于atmega16/32等
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_OS_TASK
#define IN_OS
#include "..\APP\config.h"
uint8 CRITICALNUM=0;
/*********************************************************************************************************
** 函数名称: _OS_TaskResume
** 功能描述: 将指定任务加入优先级链表
** 输 入: Tcb : 任务控制块指针
** 输 出: 无
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 _OS_TaskResume(OS_TCB *Tcb)
{
uint8 Prio;
OS_TCB_PRIO *Ptcb;
Tcb->OSTCBStat &= ~OS_STAT_SUSPEND; /* 处于就绪状态 */
Prio = Tcb->OSTCBPrio;
Ptcb = &(OSTCBPrioTbl[Prio]);
/* 插入优先级链表 */
Tcb->TcbPrev = NULL;
if (Ptcb->TcbNext != NULL)
{
Tcb->TcbNext = Ptcb->TcbNext;
Tcb->TcbPrev = Ptcb->TcbNext->TcbPrev;
Tcb->TcbPrev->TcbNext = Tcb;
Tcb->TcbNext->TcbPrev = Tcb;
}
else
{
Tcb->TcbNext = Tcb;
Tcb->TcbPrev = Tcb;
Ptcb->TcbNext = Tcb;
}
if (Tcb->OSTCBPrio < OSHighPrio) /* 调整OSHighPrio,用于加速任务切换 */
{
OSHighPrio = Tcb->OSTCBPrio;
}
return OS_NO_ERR;
}
/*********************************************************************************************************
** 函数名称: OS_TaskResume
** 功能描述: 恢复任务,但不进行任务切换
** 输 入: TaskID : 任务ID
** 输 出: OS_NO_ERR:成功
** OS_TASKID_INVALID:目标任务不存在
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OS_TaskResume(TASK_ID TaskID)
{
uint8 Rt;
OS_TCB *Tcb;
/* 获取任务TCB */
Tcb = NULL;
if (TaskID == OS_ID_SELF)
{
Tcb = OSTCBCur;
}
if (TaskID < OS_MAX_TASKS)
{
Tcb = &(OSTCBTbl[TaskID]);
}
Rt = OS_TASKID_INVALID;
if (Tcb != NULL)
{
if (Tcb->OSTCBStat != OS_STAT_DEATH) /* 任务存在 */
{
if ((Tcb->OSTCBStat & OS_STAT_SUSPEND) != 0)
{
Tcb->OSTCBStat &= ~OS_STAT_SUSPEND;
_OS_TaskResume(Tcb);
}
Rt = OS_NO_ERR;
}
}
return Rt;
}
/*********************************************************************************************************
** 函数名称: _OS_TaskSuspend
** 功能描述: 将指定任务从优先级链表中删除
** 输 入: Tcb : 任务控制块指针
** 输 出: OS_NO_ERR
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 _OS_TaskSuspend(OS_TCB *Tcb)
{
uint8 Prio;
OS_TCB_PRIO *Ptcb;
Prio = Tcb->OSTCBPrio;
Ptcb = &(OSTCBPrioTbl[Prio]);
if (Ptcb->TcbNext != NULL)
{
if (Ptcb->TcbNext == Tcb)
{
Ptcb->TcbNext = Tcb->TcbNext;
if (Ptcb->TcbNext == Tcb)
{
Ptcb->TcbNext = NULL;
}
}
Tcb->OSTCBStat |= OS_STAT_SUSPEND;
Tcb->TcbNext->TcbPrev = Tcb->TcbPrev;
Tcb->TcbPrev->TcbNext = Tcb->TcbNext;
}
return OS_NO_ERR;
}
/*********************************************************************************************************
** 函数名称: OSTaskCreate
** 功能描述: 创建任务
** 输 入: Task:任务开始地址
** Pdata:任务参数
** Ptos:堆栈地址
** Prio:任务优先级
** TaskId:任务ID
** StkSize:堆栈尺寸
** PSR:附加参数,与移植相关
** 输 出: OS_NO_ERR:成功
** OS_TASKID_INVALID:错误的任务ID
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSTaskCreate(void (*Task)(void *Pd),
void *Pdata,
OS_STK *Ptos,
uint8 Prio,
TASK_ID TaskId,
uint32 StkSize,
int PSR,
uint8 TaskStat)
{
OS_STK *Psp;
OS_TCB *Tcb;
uint8 Rt;
StkSize = StkSize;
OS_ENTER_CRITICAL_TWO;
Rt = OS_TASKID_INVALID;
if (TaskId < OS_MAX_TASKS) /* ID有效 */
{
Tcb = &(OSTCBTbl[TaskId]);
if (Tcb->OSTCBStat == OS_STAT_DEATH) /* 此ID还未使用 */
{
if (Prio >= OS_LOWEST_PRIO) /* 优先级无效 */
{
Rt = OS_PRIO_INVALID;
}
else
{
Psp = (OS_STK *)OSTaskStkInit(Task, Pdata, Ptos, PSR); /* 初始化堆栈 */
/* 初始化TCB */
Tcb->OSTCBStat = 0;
Tcb->OSTCBStkPtr = Psp;
Tcb->OSTCBInfo = OS_INFO_MSG_SENGED;
Tcb->OSTCBDly = 0;
Tcb->OSTCBPrio = Prio;
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
if (TaskStat != 0)
{
Tcb->OSTCBStat = OS_STAT_SUSPEND;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -