?? os_core.c
字號(hào):
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSTaskSuspend(uint8 TaskID) small
{
OSWaitTick[TaskID] = 0; /* 沒有超時(shí)處理 */
OS_TaskSuspend(TaskID);
OSSched(); /* 開始任務(wù)切換 */
}
/*********************************************************************************************************
** 函數(shù)名稱: OSFindNextRunningTask
** 功能描述: 查找下一個(gè)優(yōu)先級(jí)最高的就緒任務(wù)
** 輸 入: 無
** 輸 出: OSNextTaskID:存儲(chǔ)查找結(jié)果
** 全局變量: OSTaskRuning,OSTaskCreated
** 調(diào)用模塊: 無
**
** 作 者: 陳明計(jì)
** 日 期: 2003年8月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSFindNextRunningTask(void) small
{
uint8 temp;
temp = OSTaskRuning[0] & OSTaskCreated[0];
#if OS_MAX_TASKS < 9
/* 查找處于就緒狀態(tài)的任務(wù)中優(yōu)先級(jí)最高的任務(wù) */
for (OSNextTaskID = 0; OSNextTaskID < OS_MAX_TASKS; OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
return;
#else
/* 查找處于就緒狀態(tài)的任務(wù)中優(yōu)先級(jí)最高的任務(wù) */
for (OSNextTaskID = 0; OSNextTaskID < 8; OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
return;
}
temp = temp >> 1;
}
temp = OSTaskRuning[1] & OSTaskCreated[1];
for (; OSNextTaskID < OS_MAX_TASKS; OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
return;
#endif
}
/*********************************************************************************************************
** 函數(shù)名稱: OSIntExit
** 功能描述: 中斷退出處理函數(shù),在此進(jìn)行中斷后的任務(wù)切換
** 輸 入: 無
** 輸 出: 無
** 全局變量: OSIntNesting,OSNextTaskID
** 調(diào)用模塊: OSIntCtxSw
**
** 作 者: 陳明計(jì)
** 日 期: 2003年8月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSIntExit(void) small
{
OS_ENTER_CRITICAL();
/* 中斷嵌套處理 */
if (OSIntNesting > 0)
{
OSIntNesting--;
}
if (OSIntNesting == 0)
{
Os_Enter_Sum = 0; /* 因?yàn)樵谥袛嘀?,所以關(guān)中斷計(jì)數(shù)器為0 */
OSFindNextRunningTask();
OSIntCtxSw(); /* 進(jìn)行任務(wù)調(diào)度 */
return TRUE;
}
OS_EXIT_CRITICAL();
return FALSE;
}
/*********************************************************************************************************
** 函數(shù)名稱: OSSched
** 功能描述: 非中斷的任務(wù)切換函數(shù)
** 輸 入: 無
** 輸 出: 無
** 全局變量: OSIntNesting,OSNextTaskID
** 調(diào)用模塊: OS_TASK_SW
**
** 作 者: 陳明計(jì)
** 日 期: 2003年8月3日
**------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSSched(void) small
{
OS_ENTER_CRITICAL();
if (OSIntNesting == 0) /* 是否是中斷中調(diào)用 */
{
OSFindNextRunningTask();
OS_TASK_SW(); /* 進(jìn)行任務(wù)調(diào)度 */
}
OS_EXIT_CRITICAL();
}
/*********************************************************************************************************
** 函數(shù)名稱: OSTimeTick
** 功能描述: 系統(tǒng)時(shí)鐘處理函數(shù),處理各個(gè)任務(wù)的延時(shí)
** 輸 入: 無
** 輸 出: 無
** 全局變量: OSWaitTick
** 調(diào)用模塊: OSIntSendSignal
**
** 作 者: 陳明計(jì)
** 日 期: 2003年8月3日
**------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSTimeTick(void) small
{
uint8 i;
for (i = 0; i < OS_MAX_TASKS; i++)
{
if (OSWaitTick[i] != 0 )
{
OSWaitTick[i]--;
if (OSWaitTick[i] == 0)
{
#if OS_MAX_TASKS < 9
OSTaskRuning[0] |= OSMapTbl[i];
#else
if (i < 8)
{
OSTaskRuning[0] |= OSMapTbl[i];
}
else
{
OSTaskRuning[1] |= OSMapTbl[i & 0x07];
}
#endif
}
}
}
OSSched();
}
/*********************************************************************************************************
** 函數(shù)名稱: OSTimeDly
** 功能描述: 系統(tǒng)等待函數(shù),任務(wù)調(diào)用此函數(shù)可以等待一定時(shí)間
** 輸 入: ticks : 等待超時(shí)時(shí)的系統(tǒng)嘀嗒數(shù)
** 輸 出 : 無
**
** 全局變量: OSWaitTick
** 調(diào)用模塊: OS_TaskSuspend,OSSched
**
** 作 者: 陳明計(jì)
** 日 期: 2003年8月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSTimeDly(uint8 ticks) small
{
OSWaitTick[OSTaskID] = ticks; /* 設(shè)置超時(shí)時(shí)間 */
OS_ENTER_CRITICAL();
while (OSWaitTick[OSTaskID] != 0) /* 判斷超時(shí)時(shí)間是否到 */
{
OS_TaskSuspend(OSTaskID); /* 任務(wù)進(jìn)入等待狀態(tài) */
OSSched(); /* 開始任務(wù)切換 */
}
OS_EXIT_CRITICAL();
}
/*********************************************************************************************************
** 函數(shù)名稱: OSTimeDlyResume
** 功能描述: 讓處在延時(shí)期的任務(wù)結(jié)束延時(shí)
** 輸 入: TaskID : 任務(wù)ID
** 輸 出 : 無
** 全局變量: OSWaitTick
** 調(diào)用模塊: OSTaskResume
**
** 作 者: 陳明計(jì)
** 日 期: 2003年8月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSTimeDlyResume(uint8 TaskID) small
{
OSWaitTick[TaskID] = 0;
OSTaskResume(TaskID);
}
/*********************************************************************************************************
** 函數(shù)名稱: OSWait
** 功能描述: 系統(tǒng)等待函數(shù),任務(wù)調(diào)用此函數(shù)可以等待一定時(shí)間或信號(hào)
** 輸 入: typ: 等待事件類型,目前可以取以下值,或是其中任意個(gè)值的按位或
** K_SIG: 等待信號(hào)
** K_TMO: 等待超時(shí)
** ticks : 等待超時(shí)時(shí)的系統(tǒng)嘀嗒數(shù)
** 輸 出 : NOT_OK : 參數(shù)錯(cuò)誤
** TMO_EVENT : 超時(shí)到
** SIG_EVENT : 有信號(hào)
** 全局變量: OSWaitTick
** 調(diào)用模塊: OSTaskSuspend,OSTimeDly,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陳明計(jì)
** 日 期: 2003年8月3日
**------------------------------------------------------------------------------------------------------
** 修改人: 陳明計(jì)
** 日 期: 2004年2月4日
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#ifndef OSWait_EN
#define OSWait_EN 0
#endif
#if OSWait_EN > 0
uint8 OSWait(uint8 typ, uint8 ticks) small
{
OSWaitTick[OSTaskID] = ticks; /* 設(shè)置超時(shí)時(shí)間 */
/* 可以優(yōu)化寄存器的使用 */
switch(typ)
{
case K_SIG: /* 等待信號(hào),即掛起自己 */
OSTaskSuspend(OSTaskID);
return SIG_EVENT;
case K_TMO: /* 等待超時(shí),即延時(shí)一段時(shí)間 */
OSTimeDly(OSWaitTick[OSTaskID]);
return TMO_EVENT;
case (K_TMO | K_SIG): /* 等待信號(hào)(掛起自己)直到超時(shí) */
/* 別的任務(wù)或中斷可以恢復(fù)它 */
OS_ENTER_CRITICAL();
if (OSWaitTick[OSTaskID] == 0) /* 判斷超時(shí)時(shí)間是否到 */
{
return TMO_EVENT;
}
OS_TaskSuspend(OSTaskID); /* 任務(wù)進(jìn)入等待狀態(tài) */
OSSched();
OS_EXIT_CRITICAL();
if (OSWaitTick[OSTaskID] != 0)
{
OSWaitTick[OSTaskID] = 0;
return SIG_EVENT;
}
return TMO_EVENT;
default:
OSWaitTick[OSTaskID] = 0;
return NOT_OK;
}
}
#endif
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -