?? 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 + -