⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_core.c

📁 uc/os操作系统在msp430单片机上的移植
💻 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 + -