📄 os_core.c
字号:
//=================================================
//:os_core.c
// ----
//--
//--2007/08 by zhaoert
//==================================================
#include "os.h"
//----------------------------------------------------------
INT8U OSRdyTbl; //内核任务就绪表
INT8U OSPrioCur; //当前运行任务任务号
INT8U OSPrioHighRdy; //就绪最高优先级任务任务号
INT8U OSWaitTick[OS_MAX_TASK+1]; //
OS_STK* OSTaskStkPtr[9]={(OS_STK*)0x0980, //任务栈栈顶指针数组
(OS_STK*)0x0900,(OS_STK*)0x0880,(OS_STK*)0x0800,(OS_STK*)0x0780,
(OS_STK*)0x0700,(OS_STK*)0x0680,(OS_STK*)0x0600,(OS_STK*)0x0580};
//---------------------------------------------------------------
INT8U const OSMaskTbl[]={
0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
};
#if OS_SCHED_METHOD==1
#error OS_SCHED_METHOD==1
INT8U const OSMapTbl[] = {
0, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, //0x00--0x0F
5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, //0x10--0x1F
6, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, //0x20--0x2F
5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, //0x30--0x3F
7, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, //0x40--0x4F
5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, //0x50--0x5F
6, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, //0x60--0x6F
5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, //0x70--0x7F
8, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, //0x80--0x8F
5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, //0x90--0x9F
6, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, //0xA0--0xAF
5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, //0xB0--0xBF
7, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, //0xC0--0xCF
5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, //0xD0--0xDF
6, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, //0xE0--0xEF
5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1 //0xF0--0xFF
};
#endif
void TaskIdle(void); //空闲任务
//-----------------------------------------------------------------------------
//OSInit
void OSInit(void){
INT8U i;
for(i=0;i<OS_MAX_TASK+1;i++)
OSWaitTick[i]=0;
OSPrioCur=\
OSPrioHighRdy=\
OSRdyTbl=0;
}
//OSStart
void OSStart(void){
//OSInitIdleTask
OSTaskCreat(TaskIdle, OSTaskStkPtr[0], 0);
//OSInitTick
OSInitTick();
//OSStartRdy
#if OS_SCHED_METHOD==1
OSPrioHighRdy=OSMapTbl[OSRdyTbl];
#elif OS_SCHED_METHOD==2
INT8U i;
INT8U tmp=OSRdyTbl;
if(tmp){
for(i=1; i<OS_MAX_TASK+1;i++){
if(tmp&OSMaskTbl[i]){
OSPrioHighRdy=i;
break;
}
}
}
else{
OSPrioHighRdy=0;
}
#endif
OS_START_RDY();
}
//OSSched
// ----OS_SCHED_METHOD:--1 use OSMapTbl[ ] to get OSPrioHighRdy,
// --2 use for(;;)
// --3 use ASM
#if OS_SCHED_METHOD==1
#error OS_SCHED_METHOD==1
void OSSched(void){
OS_ENTER_CRITICAL();
OSPrioHighRdy=OSMapTbl[OSRdyTbl];
if(OSPrioHighRdy!=OSPrioCur){
OS_TASK_SW();
}
OS_EXIT_CRITICAL();
}
#elif OS_SCHED_METHOD==2
//#error OS_SCHED_METHOD==2
void OSSched(void){
INT8U i;
INT8U tmp=OSRdyTbl;
OS_ENTER_CRITICAL();
//get OSPrioHighRdy
if(tmp){
for(i=1; i<OS_MAX_TASK+1; i++){
if(tmp&OSMaskTbl[i]){
OSPrioHighRdy=i;
break;
}
}
}
else{
OSPrioHighRdy=0;
}
if(OSPrioHighRdy!=OSPrioCur){
OS_TASK_SW();
}
OS_EXIT_CRITICAL();
}
#endif
//TaskIdle
void TaskIdle(void){
while(1){
OSSched();
}
}
//--------------------------------------------------------
//OSTaskCreat
void OSTaskCreat(void(*task)(void), OS_STK* ptos, INT8U TaskID){
//OSInitTaskStk
OSInitTaskStk(task, ptos, TaskID);
//
OSRdyTbl|=OSMaskTbl[TaskID];
}
//OSSleep
void OSSleep(INT8U ticks){
OSRdyTbl&=~(OSMaskTbl[OSPrioCur]);
OSWaitTick[OSPrioCur] = ticks;
if(ticks){
OSSched();
}
}
//OSWakeUp
void OSWakeUp(INT8U TaskID){
OSWaitTick[TaskID]=0;
OSRdyTbl|=OSMaskTbl[TaskID];
//OSSched();
}
//OSTaskSuspend
BOOL OSTaskSuspend(INT8U TaskID){
OSRdyTbl&=~(OSMaskTbl[TaskID]);
OSSched();
return TRUE;
}
//OStaskResume
BOOL OSTaskResume(INT8U TaskID){
OSRdyTbl|=OSMaskTbl[TaskID];
OSSched();
return TRUE;
}
//OSTimeDly
void OSTimeDly(INT8U ticks){
INT8U tmp;
tmp = OSWaitTick[OSPrioCur];
if(ticks){
OSWaitTick[OSPrioCur] = ticks;
while(OSWaitTick[OSPrioCur]);
OSWaitTick[OSPrioCur]=tmp;
}
}
//:~
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -