?? os_core.c
字號:
/*********************************************************************************************************
** Small RTOS(51)
** The Real-Time Kernel(For Keil c51)
**
** (c) Copyright 2002-2002, chenmingji
** All Rights Reserved
**
** V1.10.5
********************************************************************************************************/
#define IN_OS_CORE
#include "config.h"
#if EN_OS_INT_ENTER > 0
uint8 OSIntNesting;
#endif
uint8 OSTaskID = 0;
uint8 OSNextTaskID = 0;
uint8 OSWaitTick[OS_MAX_TASKS - 1];
#if OS_MAX_TASKS < 9
uint8 OSTaskRuning = 0xff;
#else
uint16 OSTaskRuning = 0xffff;
#endif
uint8 const OSMapTbl[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
uint8 Os_Enter_Sum = 0;
void OSSched(void);
/*********************************************************************************************************
** 函數(shù)名稱: OSIntSendSignal
** 功能描述: 中斷中給指定任務(wù)發(fā)送信號,既使指定任務(wù)就緒
** 輸 入: TaskId : 任務(wù)ID
** 輸 出: 無
** 全局變量: OSTaskRuning-
********************************************************************************************************/
void OSIntSendSignal(uint8 TaskId)
{
OS_ENTER_CRITICAL();
#if OS_MAX_TASKS < 9
OSTaskRuning |= OSMapTbl[TaskId];
#else
if (TaskId < 8)
{
((uint8 *)(&OSTaskRuning))[LOW_BYTE] |= OSMapTbl[TaskId];
}
else
{
((uint8 *)(&OSTaskRuning))[HIGH_BYTE] |= OSMapTbl[TaskId & 0x07];
}
#endif
OS_EXIT_CRITICAL();
}
/*********************************************************************************************************
** 函數(shù)名稱: OSSendSignal
** 功能描述: 任務(wù)中給指定任務(wù)發(fā)送信號,既使指定任務(wù)就緒
** 輸 入: TaskId : 任務(wù)ID
** 輸 出: 無
** 全局變量: 無
** 調(diào)用模塊: OSSched,OSIntSendSignal
**
** 作 者: 陳明計
** 日 期: 2002年6月20日
**-------------------------------------------------------------------------------------------------------
** 修 改: 陳明計
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修 改:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSSendSignal(uint8 TaskId)
{
OSIntSendSignal(TaskId);
OSSched(); //開始任務(wù)切換
}
/*********************************************************************************************************
** 函數(shù)名稱: OSClearSignal
** 功能描述: 清除指定任務(wù)信號,既使指定任務(wù)休眠
** 輸 入: TaskId : 任務(wù)ID
** 輸 出: 無
** 全局變量: OSTaskRuning
** 調(diào)用模塊: 無
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSClearSignal(uint8 TaskId)
{
OS_ENTER_CRITICAL();
#if OS_MAX_TASKS < 9
OSTaskRuning &= ~OSMapTbl[TaskId];
#else
if (TaskId < 8)
{
((uint8 *)(&OSTaskRuning))[LOW_BYTE] &= ~OSMapTbl[TaskId];
}
else
{
((uint8 *)(&OSTaskRuning))[HIGH_BYTE] &= ~OSMapTbl[TaskId & 0x07];
}
#endif
OS_EXIT_CRITICAL();
}
/*********************************************************************************************************
** 函數(shù)名稱: OSIntExit
** 功能描述: 中斷退出處理函數(shù),在此進(jìn)行中斷后的任務(wù)切換
** 輸 入: 無
** 輸 出: 無
** 全局變量: OSIntNesting,OSNextTaskID
** 調(diào)用模塊: OSIntCtxSw
********************************************************************************************************/
void OSIntExit(void)
{
uint8 temp;
OS_ENTER_CRITICAL();
#if EN_OS_INT_ENTER > 0
if (OSIntNesting > 0)
{
OSIntNesting--;
}
if (OSIntNesting == 0)
{
#endif
Os_Enter_Sum = 0;
#if OS_MAX_TASKS < 9
temp = OSTaskRuning;
for (OSNextTaskID = 0; OSNextTaskID < (OS_MAX_TASKS - 1); OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
OSIntCtxSw();
#else
temp = OSTaskRuning % 256;
for (OSNextTaskID = 0; OSNextTaskID < 8; OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
goto TaskSw;
}
temp = temp >> 1;
}
temp = OSTaskRuning /256 ;
for (; OSNextTaskID < (OS_MAX_TASKS - 1); OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
TaskSw:
OSIntCtxSw();
#endif
#if EN_OS_INT_ENTER >0
}
Os_Enter_Sum = 1;
#endif
}
/*********************************************************************************************************
** 函數(shù)名稱: OSSched
** 功能描述: 非中斷的任務(wù)切換函數(shù)
** 輸 入: 無
** 輸 出: 無
** 全局變量: OSIntNesting,OSNextTaskID
** 調(diào)用模塊: OS_TASK_SW
********************************************************************************************************/
void OSSched(void)
{
uint8 temp;
OS_ENTER_CRITICAL();
#if EN_OS_INT_ENTER > 0
if (OSIntNesting == 0)
{
#endif
Os_Enter_Sum = 0;
#if OS_MAX_TASKS < 9
temp = OSTaskRuning;
for (OSNextTaskID = 0; OSNextTaskID < (OS_MAX_TASKS - 1); OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
OS_TASK_SW();
#else
temp = OSTaskRuning % 256;
for (OSNextTaskID = 0; OSNextTaskID < 8; OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
goto TaskSw;
}
temp = temp >> 1;
}
temp = OSTaskRuning / 256 ;
for (; OSNextTaskID < (OS_MAX_TASKS - 1); OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
TaskSw:
OS_TASK_SW();
#endif
#if EN_OS_INT_ENTER > 0
}
else
{
Os_Enter_Sum = 0;
OS_EXIT_CRITICAL();
}
#endif
}
/*********************************************************************************************************
** 函數(shù)名稱: OSTimeTick
** 功能描述: 系統(tǒng)時鐘處理函數(shù),處理各個任務(wù)的延時
** 輸 入: 無
** 輸 出: 無
** 全局變量: OSWaitTick
** 調(diào)用模塊: OSIntSendSignal
********************************************************************************************************/
void OSTimeTick(void)
{
uint8 i;
for (i = 0; i < (OS_MAX_TASKS - 1); i++)
{
if (OSWaitTick[i] != 0 )
{
OSWaitTick[i]--;
if (OSWaitTick[i] == 0)
{
OSIntSendSignal(i);
}
}
}
}
/*********************************************************************************************************
** 函數(shù)名稱: OSWait
** 功能描述: 系統(tǒng)等待函數(shù),任務(wù)調(diào)用此函數(shù)可以等待一定時間或信號
** 輸 入: typ: 等待事件類型,目前可以取以下值,或是其中任意個值的按位或
** K_SIG: 等待信號
** K_TMO: 等待超時
** ticks : 等待超時時的系統(tǒng)嘀嗒數(shù)
** 輸 出 : NOT_OK : 參數(shù)錯誤
** TMO_EVENT : 超時到
** SIG_EVENT : 有信號
** 全局變量: OSWaitTick
** 調(diào)用模塊: OSClearSignal
**
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSWait(uint8 typ, uint8 ticks)
{
OSWaitTick[OSTaskID] = ticks;
switch(typ)
{
case K_SIG:
OSWaitTick[OSTaskID] = 0;
OSClearSignal(OSTaskID);
OSSched();
return SIG_EVENT;
case K_TMO:
OS_ENTER_CRITICAL();
while (OSWaitTick[OSTaskID] != 0)
{
OSClearSignal(OSTaskID);
OSSched();
OS_ENTER_CRITICAL();
}
OS_EXIT_CRITICAL();
return TMO_EVENT;
case (K_TMO | K_SIG):
if (OSWaitTick[OSTaskID] == 0)
{
return TMO_EVENT;
}
OSClearSignal(OSTaskID);
OSSched();
if (OSWaitTick[OSTaskID] != 0)
{
OSWaitTick[OSTaskID] = 0;
return SIG_EVENT;
}
return TMO_EVENT;
default:
OSWaitTick[OSTaskID] = 0;
return NOT_OK;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -