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

📄 os.c

📁 基本STC4052写的一个小的OS, 完成了任务调度功能,及堆栈空间切换, 及中断处理
💻 C
字号:
//////////////////////////////////////////////////////////////////
//                          
//      Copyright (c) 2006-2010 walnutcy 
//      All Right Reserved.       
//                                 
//      $Author    walnutcy           
//      $Email     walnutcy@163.com   
//      $Version   v1.0        
//      $FileName        
//      $Since       
//      $Log     
//                    
//      DESCRIPTION      
//                      
//	    History:      
//	    <author>          <time>     <version >    <desc>     
//      walnutcy       2006-11-22      0.1          建立
//////////////////////////////////////////////////////////////////

#include "os.h"


BOOL isNeedTaskSW;

OS_WALNUT gOs;

U8 gIdleTick;
U8 gIdleStack[25];

U8 gOsIntLevel;
BOOL gOsShedLock;
BOOL gOsMsgIntShed;
///////////////////////////////////////////////
//  Name    : OsTaskIdle (void) 
//  Function: 空闲任务 
//  Author  : walnutcy   
//  Date    : 2006-11-23
///////////////////////////////////////////////
void OsTaskIdle (void)	REENTRANT
{
	gIdleTick = 0;
	isNeedTaskSW = 1;
	while (1)
	{
		gIdleTick++;
		if (isNeedTaskSW)		
		{
			isNeedTaskSW = 0;
			OSTaskSW();
		}
//		WDT_CONTR = 0x3C;//1.14s WatchDog
	}
}
///////////////////////////////////////////////
//  Name    : OsInit (void) 
//  Function: OS初始化
//  Author  : walnutcy   
//  Date    : 2006-11-23
///////////////////////////////////////////////
void OsInit (void) REENTRANT
{
	U8 i;
	gOs.osPrio = 0x0000;
	gOs.taskNum	 = 0;
	gOsIntLevel = 0;
	gOsShedLock = 0;
	gOsMsgIntShed = 0;
	gOs.currTask = OS_TASK_MAX_NUM-1;
	for (i=0;i<OS_TASK_MAX_NUM;i++)
	{	
		gOs.tcb[i].state = OS_TASK_NULL;
	}
	OsTaskCreate((OS_TASK_MAX_NUM-1),OsTaskIdle,(U8)gIdleStack);
		
}

///////////////////////////////////////////////
//  Name    : OsInit (void) 
//  Function: OS初始化
//  Author  : walnutcy   
//  Date    : 2006-11-23
///////////////////////////////////////////////
U8 OsStackInit (PFUNPROC fun,U8 stack) 	REENTRANT
{
		IU8* stk = stack;
		*stk++ = ((U16)fun)&0xFF; //PC.L
		*stk++ = ((U16)fun)>>8;	  //PC.H
		*stk++ = 0;
		*stk++ = 0;
		*stk++ = 0;
		*stk++ = ((U16)fun)&0xFF; //DPL
		*stk++ = ((U16)fun)>>8;	  //DPH
		*stk++ = 0;  
		*stk++ = 0;
		*stk++ = 0;
		*stk++ = 0;
		*stk++ = 0;
		*stk++ = 0;
		*stk++ = 0;
		*stk = 0;
		return stk;
}

///////////////////////////////////////////////
//  Name    : OsInit (void) 
//  Function: OS初始化
//  Author  : walnutcy   
//  Date    : 2006-11-23
///////////////////////////////////////////////
CBOOL OsTaskCreate (U8 prio,PFUNPROC fun,U8 stack)	REENTRANT
{
	if (OS_TASK_MAX_NUM<=gOs.taskNum)
	{	return C_FALSE;
	}
	if (OS_TASK_MAX_NUM<=prio)
	{	return C_FALSE;
	}
	if (gOs.osPrio&(1<<prio))
	{	return C_FALSE;//该优先级任务已经存在
	}
	EnterCritical();
	gOs.osPrio |= (1<<prio);
	gOs.taskNum++;

	gOs.tcb[prio].state = OS_TASK_RDY;
	gOs.tcb[prio].prio = prio;
	gOs.tcb[prio].fun	= fun;
	gOs.tcb[prio].delay = 0;
	stack  = OsStackInit(fun,stack);
	gOs.tcb[prio].sp	 = stack;

	ExitCritical();
	return C_TRUE;			
}


///////////////////////////////////////////////
//  Name    : OsInit (void) 
//  Function: OS初始化
//  Author  : walnutcy   
//  Date    : 2006-11-23
///////////////////////////////////////////////
void OsStart (void)	REENTRANT
{	//启动IDLE任务
	gOs.tcb[OS_TASK_MAX_NUM-1].sp -= 14;
	gOs.tcb[OS_TASK_MAX_NUM-1].state = OS_TASK_RUN;
	SP = gOs.tcb[OS_TASK_MAX_NUM-1].sp;
	gOs.tcb[OS_TASK_MAX_NUM-1].fun();
}

///////////////////////////////////////////////
//  Name    : OsSendMsg (U8 msg) 
//  Function: 向任务发送消息
//  Author  : walnutcy   
//  Date    : 2006-11-23
///////////////////////////////////////////////
CBOOL OsSendMsg (U8 msg)  REENTRANT
{
	if (OS_TASK_MAX_NUM<=msg)
	{	return C_FALSE;
	}
	EnterCritical();
	if (gOs.osPrio&(1<<msg))
	{
		if (OS_TASK_RUN!=gOs.tcb[msg].state)
		{
			gOs.tcb[msg].state = OS_TASK_RDY;
			gOsMsgIntShed = 1;				
		}
	}
	ExitCritical();
	if (0==gOsIntLevel)
	{	gOsMsgIntShed = 0;
		OSTaskSW();
	}
}

///////////////////////////////////////////////
//  Name    : OsWaitMsg (void) 
//  Function: 当前任务一直等待,直到有新消息到
//  Author  : walnutcy   
//  Date    : 2006-11-23
///////////////////////////////////////////////
void OsWaitMsg (void) REENTRANT
{
	EnterCritical();
	gOs.tcb[gOs.currTask].state = OS_TASK_WAIT;
	ExitCritical();
	OSTaskSW();	
}

#ifdef OS_KILL
///////////////////////////////////////////////
//  Name    : OsFreeRes (U8 prio) 
//  Function: 释放资源(本机资源只有串口,如有其它,需修改)
//  Author  : walnutcy   
//  Date    : 2006-11-23
///////////////////////////////////////////////
void OsFreeRes (U8 prio)
{
	if (UART_PrinterNo()==prio)
	{
		UARTFreePrinter(); 
	}
}

///////////////////////////////////////////////
//  Name    : OsTaskKill (U8 prio) 
//  Function: 杀死任务
//  Author  : walnutcy   
//  Date    : 2006-11-23
///////////////////////////////////////////////
CBOOL OsTaskKill (U8 prio)	REENTRANT
{
	if (OS_TASK_MAX_NUM<=prio)
	{	return C_FALSE;
	}
	if (!(gOs.osPrio&(1<<prio)))
	{	return C_FALSE;//该优先级任务不存在
	}
	EnterCritical();
	OsFreeRes (prio);
	gOs.tcb[prio].state = OS_TASK_NULL;
	gOs.taskNum--;
	gOs.osPrio &= ~(1<<prio);
	ExitCritical();
	OSTaskSW();
	return C_TRUE;
}
#endif

#ifdef OS_DELAY
///////////////////////////////////////////////
//  Name    : OsDelay (U8 delay)
//  Function: 任务延迟时间(ms)
//  Author  : walnutcy   
//  Date    : 2006-11-23
///////////////////////////////////////////////
void OsDelay (U8 delay)	REENTRANT
{
	if (0==delay)
	{	return;
	}
	EnterCritical();
	gOs.tcb[gOs.currTask].delay = delay;
	gOs.tcb[gOs.currTask].state = OS_TASK_WAIT;
	ExitCritical();
	OSTaskSW();
}

///////////////////////////////////////////////
//  Name    : OsDealDelay (void) 
//  Function: 处理系统时间延迟
//  Author  : walnutcy   
//  Date    : 2006-11-23
///////////////////////////////////////////////
void OsDealDelay (void)	REENTRANT
{
	U8 i;
	for (i=0;i<OS_TASK_MAX_NUM;i++)
	{
		if (gOs.osPrio&(1<<i))
		{
			if (gOs.tcb[i].delay)
			{
				gOs.tcb[i].delay--;
				if (0==gOs.tcb[i].delay)
				{	//任务挂起
					gOs.tcb[i].state = OS_TASK_RDY;	
				}
			}
				
		} 
	}
}

#endif




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -