?? os_task.c
字號(hào):
/*********************************************************************************************************
** Small RTOS
** The Real-Time Kernel
** (c) Copyright 2002-2003, chenmingji
** All Rights Reserved
** V1.50.0
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: OS_Task.c
**創(chuàng) 建 人: 陳明計(jì)
**最后修改日期: 2005年6月10日
**描 述: Small RTOS任務(wù)處理代碼
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創(chuàng)建人: 陳明計(jì)
** 版 本: V1.00
** 日 期: 2005年6月10日
** 描 述: 基本完成全新的Small RTOS核
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版 本:
** 日 期:
** 描 述:
**
**--------------當(dāng)前版本修訂------------------------------------------------------------------------------
** 修改人: 焦進(jìn)星
** 日 期: 2007年12月30日
** 描 述: 移植到AVR系列芯片,適用于atmega16/32等
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_OS_TASK
#define IN_OS
#include "..\APP\config.h"
uint8 CRITICALNUM=0;
/*********************************************************************************************************
** 函數(shù)名稱(chēng): _OS_TaskResume
** 功能描述: 將指定任務(wù)加入優(yōu)先級(jí)鏈表
** 輸 入: Tcb : 任務(wù)控制塊指針
** 輸 出: 無(wú)
** 作 者: 陳明計(jì)
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 _OS_TaskResume(OS_TCB *Tcb)
{
uint8 Prio;
OS_TCB_PRIO *Ptcb;
Tcb->OSTCBStat &= ~OS_STAT_SUSPEND; /* 處于就緒狀態(tài) */
Prio = Tcb->OSTCBPrio;
Ptcb = &(OSTCBPrioTbl[Prio]);
/* 插入優(yōu)先級(jí)鏈表 */
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) /* 調(diào)整OSHighPrio,用于加速任務(wù)切換 */
{
OSHighPrio = Tcb->OSTCBPrio;
}
return OS_NO_ERR;
}
/*********************************************************************************************************
** 函數(shù)名稱(chēng): OS_TaskResume
** 功能描述: 恢復(fù)任務(wù),但不進(jìn)行任務(wù)切換
** 輸 入: TaskID : 任務(wù)ID
** 輸 出: OS_NO_ERR:成功
** OS_TASKID_INVALID:目標(biāo)任務(wù)不存在
** 作 者: 陳明計(jì)
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OS_TaskResume(TASK_ID TaskID)
{
uint8 Rt;
OS_TCB *Tcb;
/* 獲取任務(wù)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) /* 任務(wù)存在 */
{
if ((Tcb->OSTCBStat & OS_STAT_SUSPEND) != 0)
{
Tcb->OSTCBStat &= ~OS_STAT_SUSPEND;
_OS_TaskResume(Tcb);
}
Rt = OS_NO_ERR;
}
}
return Rt;
}
/*********************************************************************************************************
** 函數(shù)名稱(chēng): _OS_TaskSuspend
** 功能描述: 將指定任務(wù)從優(yōu)先級(jí)鏈表中刪除
** 輸 入: Tcb : 任務(wù)控制塊指針
** 輸 出: OS_NO_ERR
** 作 者: 陳明計(jì)
** 日 期: 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;
}
/*********************************************************************************************************
** 函數(shù)名稱(chēng): OSTaskCreate
** 功能描述: 創(chuàng)建任務(wù)
** 輸 入: Task:任務(wù)開(kāi)始地址
** Pdata:任務(wù)參數(shù)
** Ptos:堆棧地址
** Prio:任務(wù)優(yōu)先級(jí)
** TaskId:任務(wù)ID
** StkSize:堆棧尺寸
** PSR:附加參數(shù),與移植相關(guān)
** 輸 出: OS_NO_ERR:成功
** OS_TASKID_INVALID:錯(cuò)誤的任務(wù)ID
** 作 者: 陳明計(jì)
** 日 期: 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) /* 優(yōu)先級(jí)無(wú)效 */
{
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;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -