?? os_core._c
字號:
/*
*********************************************************************************************************
* minOS 0.01v
* The Real-Time OS Kernel
* All Rights Reserved
* File : OS_Core.C
* 作者 : 21icbbs網友 LM7556 ,2004年7月 by : LM7556 , China , 2004-2004
*
*********************************************************************************************************
*/
#define OS_GLOBALS /* Declare GLOBAL variables */
#include "OS_Includes.h"
// initialization OSTCB --- 初始化任務控制塊.
void OSInit(void)
{ INT8U i;
for (i=0;i<OS_MAX_TASKS;i++)
{
OSTCB[i].OSStkTop=(INT16U)NULL;
OSTCB[i].OSTaskStatus=OS_TASK_Suspend;
OSTCB[i].OSTimeDly=0;
}
/*
OS_TCB *pOS_TCB;
pOS_TCB=OSTCB;
for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++)
{
pOS_TCB->OSStkTop=(INT16U)NULL;
pOS_TCB->OSTaskStatus=OS_TASK_Suspend;
pOS_TCB->OSTimeDly=0;
}
*/
}
//Start OS --- 啟動OS
void OSStart(void)
{
Init_OS_Timer();
OS_TASK_CrtPrio=Task_main_Prio;
OSTCB[OS_TASK_CrtPrio].OSTaskStatus=OS_TASK_Run;
OS_INT_ENABLE();
OS_TASK_INT();
}
//返回優先級最高的處于就緒態任務的優先級,否則返回no_TASK_Rdy。
static INT8U OSPrioHighRdy(void)
{ INT8U i;
for (i=0;i<OS_MAX_TASKS;i++)
{
if ((OSTCB[i].OSStkTop!=(INT8U)NULL) & (OSTCB[i].OSTaskStatus==OS_TASK_Rdy)) {return i;}
}
return no_TASK_Rdy;
/*
OS_TCB *pOS_TCB;
pOS_TCB=OSTCB;
for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++)
{
if ((pOS_TCB->OSStkTop!=(INT8U)NULL) & (pOS_TCB->OSTaskStatus==OS_TASK_Rdy)) {return i;}
}
return no_TASK_Rdy;
*/
}
//Task OSTimeDly Decrease 1 per Time Tick --- 每個時鐘節拍,任務等待延時的時間OSTimeDly減1.
//如果任務的OSTimeDly減到0,把任務設置為準備就緒OS_TASK_Rdy。
void OSTimeTick(void)
{ INT8U i;
for (i=0;i<OS_MAX_TASKS;i++)
{
if (OSTCB[i].OSTimeDly>OS_TASK_TimeOut)
{
if (--OSTCB[i].OSTimeDly==0) {OSTCB[i].OSTaskStatus=OS_TASK_Rdy;}
}
}
OS_TASK_HighPri=OSPrioHighRdy();
/*
OS_TCB *pOS_TCB;
pOS_TCB=OSTCB;
for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++)
{
if (pOS_TCB->OSTimeDly>OS_TASK_TimeOut)
{
if (--pOS_TCB->OSTimeDly==0) {pOS_TCB->OSTaskStatus=OS_TASK_Rdy;}
}
}
OS_TASK_HighPri=OSPrioHighRdy();
*/
}
#if OS_TIME_DLY_EN
//OS Time Delay --- 使任務延時Tdly個時間節拍
void OSTimeDly(INT16U Tdly) /* Delay Tdly clock tick */
{
OSTCB[OS_TASK_CrtPrio].OSTimeDly=Tdly+OS_TASK_TimeOut;
OSTCB[OS_TASK_CrtPrio].OSTaskStatus=OS_TASK_WaitTicks;
OSSched();
}
#endif
#if OS_TASK_SUSPEND_EN>0
//把正在運行的任務掛起(Suspend a task)。
void OSTaskSuspend(INT8U TaskPrio)
{
OSTCB[TaskPrio].OSTaskStatus=OS_TASK_Suspend;
OSSched();
}
#endif
#if OS_TASK_Resume_EN>0
// 恢復被掛起的任務(resume a task)。
void OSTaskResume(INT8U TaskPrio)
{
OSTCB[TaskPrio].OSTaskStatus=OS_TASK_Rdy;
}
#endif
//任務調度,把CPU控制權轉到優先級最高的處于就緒態的任務。如果沒有處于就緒態的任務,就地等待,
void OSSched(void)
{
do
{
OS_TASK_HighPri=OSPrioHighRdy();
} while (OS_TASK_HighPri==no_TASK_Rdy);
OSTCB[OS_TASK_HighPri].OSTaskStatus=OS_TASK_Run;
OS_TASK_INT();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -