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

📄 cn_os.c

📁 一个小的嵌入式os
💻 C
📖 第 1 页 / 共 2 页
字号:

	return result;	//if there is a high priority task is ready,so it will return the 
				//high priority's ID,else Cn.oS won't do anything
}
//==============================================
//			:Cn.oS[Operating System from China]
//function	:task switch for irq,it will be called by irq
//			:
//author		:kaka (sn.kaka@yahoo.com )	 
//data		:20080730
//			:
//==============================================
//==============================================
//			:Cn.oS[Operating System from China]
//function	:主要工作在Cn_oS_Delay_Manager_For_Timeout(void)
//			:都完成了,这里留着对休眠消息的扩展
//author		:kaka (sn.kaka@yahoo.com )	 
//data		:20080730
//			:
//==============================================


void	Switch_Task_For_Time_out(void)
{		int i;
		char id;
		char id_id;
		char finded=0;
		char t;
		int  temp[TASK_NUMBER+10],temp2[TASK_NUMBER+10];
		finded=finded;
		id_id=Current_Task_ID;
		i=1;
		id=Current_Task_ID;
		t=Cn_oS_Delay_Manager_For_Timeout();
		/*
		Current_Task_ID=kaka%TASK_NUMBER;
		Current_Task_ID++;

		Current_Task_P=T_INFO[Current_Task_ID].Task_P;
		Current_PCB_P_NEXT=T_INFO[Current_Task_ID].PCB;
		Current_PCB_P=Current_PCB_P_NEXT;
  		CLEAR_IRQ_PENDING; 
  		*/
		 ///*

		
		
		
		
		/*
		if(1==0)			//she isn't be used now!!!
						//not for ever!!!
			{
			
		while(i<TASK_NUMBER)
			{
				if( (Cn_oS_Core_list[i]&0x1)==0&finded==0)
					{
						finded=1;
						if(id==0)
							{
							id_id=i;
							}
						else
							{
							if(i<id)
								{
								id_id=i;
								}
							}
						
					}
				i++;
				if(finded==1) break;
			}
			if(finded!=1)
				{
					Current_Task_ID=id_id;		
					Current_Task_P=T_INFO[Current_Task_ID].Task_P;
					Current_PCB_P_NEXT=T_INFO[Current_Task_ID].PCB;
					Current_PCB_P=Current_PCB_P_NEXT;
				}
			Time_out_must_do=0;

			}
		else
			{
				Time_out_temp=Time_out_temp;
				Time_out_must_do=0;		
			
			}
		*/
/*
for(i=0;i<TASK_NUMBER;i++)
{
	if(	(T_INFO[i].Delay_tick>10)&(T_INFO[i].Delay_tick<50))
		{
			temp[i]=T_INFO[i].Delay_tick;
		}
	else
		{
			temp[i]=T_INFO[i].Delay_tick;
		}
}
for(i=50;i<TASK_NUMBER;i++)
{
	if(	(T_INFO[i].Delay_tick>10)&(T_INFO[i].Delay_tick<50))
		{
			temp[i]=T_INFO[i].Delay_tick;
		}
	else
		{
			temp[i]=T_INFO[i].Delay_tick;
		}
}
for(i=30;i<TASK_NUMBER;i++)
{
	if(	(T_INFO[i].Delay_tick>10)&(T_INFO[i].Delay_tick<50))
		{
			temp[i]=T_INFO[i].Delay_tick;
		}
	else
		{
			temp[i]=T_INFO[i].Delay_tick;
		}
}
for(i=10;i<TASK_NUMBER;i++)
{
	if(	(T_INFO[i].Delay_tick>10)&(T_INFO[i].Delay_tick<50))
		{
			temp[i]=T_INFO[i].Delay_tick;
		}
	else
		{
			temp[i]=T_INFO[i].Delay_tick;
		}
}



*/




Current_Task_ID=t;		
Current_Task_P=T_INFO[Current_Task_ID].Task_P;
Current_PCB_P_NEXT=T_INFO[Current_Task_ID].PCB;
Current_PCB_P=Current_PCB_P_NEXT;





CLEAR_IRQ_PENDING;  	//CLEAR the timer 5 pending

				
}

//==============================================
//			:Cn.oS[Operating System from China]
//function	:task switch for task,we can call it sofeswitch
//			:
//author		:kaka (sn.kaka@yahoo.com )	 
//data		:20080730
//			:
//==============================================
//==============================================
//			:Cn.oS[Operating System from China]
//function	:任务级别的任务切换,恩? 怎么这么噢口
//			:可以叫他软件切换
//author		:kaka (sn.kaka@yahoo.com )	 
//data		:20080730
//			:
//==============================================
void	Switch_Task(void)
{		int i=1;
		char finded=0;
		/*
		Current_Task_ID=kaka%TASK_NUMBER;
		Current_Task_ID++;

		Current_Task_P=T_INFO[Current_Task_ID].Task_P;
		Current_PCB_P_NEXT=T_INFO[Current_Task_ID].PCB;
		Current_PCB_P=Current_PCB_P_NEXT;
  		CLEAR_IRQ_PENDING; 
  		*/
		
		//Cn_oS_Delay_Manager();
		while(i<TASK_NUMBER)
			{
				if( (Cn_oS_Core_list[i]&0x1)==0)
					{
						finded=1;
						Current_Task_ID=i;
						Current_Task_P=T_INFO[Current_Task_ID].Task_P;
						Current_PCB_P_NEXT=T_INFO[Current_Task_ID].PCB;
						Current_PCB_P=Current_PCB_P_NEXT;
					}
				i++;
				if(finded==1) break;
			}


		
			if(finded==0)
				{
						Current_Task_ID=0;
						Current_Task_P=T_INFO[0].Task_P;
						Current_PCB_P_NEXT=T_INFO[0].PCB;
						Current_PCB_P=Current_PCB_P_NEXT;
				}

			
		
//CLEAR_IRQ_PENDING;  	

				
}

//==============================================
//			:Cn.oS[Operating System from China]
//function	:a function for TDM
//			:
//data		:20080714
//data		:20080716	
//			  
//			  By kaka
//data		:
//==============================================
//==============================================
//			:Cn.oS[Operating System from China]
//function	:时分没有优先级的任务切换,
//			:这样一来
//			:分时操作系统和实时操作系统容为一身			
//			:经过试验的验证,只要要求不是很高
//			:分时系统性能要高一些,当然你永远
//			:不会知道你的任务下一时刻会运行什么
//			:哎,看来上帝是公平的阿~~~
//			:程序如此,尚且人乎?
//data		:20080714
//data		:20080716	
//			  
//			  By kaka
//data		:
//==============================================

void	Switch_Task_For_TDM(void)
{		
		Current_Task_ID=kaka%TASK_NUMBER;
		Current_Task_ID++;

		Current_Task_P=T_INFO[Current_Task_ID].Task_P;
		Current_PCB_P_NEXT=T_INFO[Current_Task_ID].PCB;
		Current_PCB_P=Current_PCB_P_NEXT;
  		CLEAR_IRQ_PENDING; 

				
}



//==============================================
//			:Cn.oS[Operating System from China]
//function	:Set the Current_Task_ID to Zero,get the PCB's point
//			:Set the timer5,but don't let the timer run in this function
//data		:20080714
//data		:20080716	
//			 remove some sentence 
//			  don't let the timer run in this function 
//			  By kaka
//data		:
//==============================================
//==============================================
//			:Cn.oS[Operating System from China]
//function	:操作体统的运行必须从任务0开始
//			:任务0是一个引导程序,当然在
//			:系统跑起来之后任务0又担当着空闲任务
//			:用以统计系统的繁忙情况
//			:	
//			:
//data		:20080714
//data		:20080716	
//			 remove some sentence 
//			  don't let the timer run in this function 
//			  By kaka
//data		:
//==============================================

void Cn_oS_Start(void)
{

	//Switch_Task();
	Current_Task_ID=0;				//the task0 is the first task
	Current_Task_P=T_INFO[Current_Task_ID].Task_P;
	Current_PCB_P=T_INFO[Current_Task_ID].PCB;
	Current_PCB_P_NEXT=T_INFO[Current_Task_ID].PCB;
	Init_Core_list();
	Init_Timer5 ();
	ATTEMPER_first();
	
}







//==============================================
//			:Cn.oS[Operating System from China]
//function	:it isn't used
//			:
//author		:kaka (sn.kaka@yahoo.com )	 
//data		:20080730
//			:
//==============================================
//==============================================
//			:Cn.oS[Operating System from China]
//function	:同样是在错误的时期诞生的错误的程序
//			:
//author		:kaka (sn.kaka@yahoo.com )	 
//data		:20080730
//			:
//==============================================

void Save_Info(void)
{

	T_INFO[Current_Task_ID].Task_P=Current_Task_P;
	T_INFO[Current_Task_ID].Stack_P=Current_PCB_P;

}


//==============================================
//			:Cn.oS[Operating System from China]
//function	:it isn't used
//			:
//author		:kaka (sn.kaka@yahoo.com )	 
//data		:20080730
//			:
//==============================================
//==============================================
//			:Cn.oS[Operating System from China]
//function	:同样是在错误的时期诞生的错误的程序
//			:
//author		:kaka (sn.kaka@yahoo.com )	 
//data		:20080730
//			:
//==============================================


void	Recover_Info(void)

{

	Current_Task_P=T_INFO[Current_Task_ID].Task_P;
	Current_PCB_P=T_INFO[Current_Task_ID].Stack_P;

}





⌨️ 快捷键说明

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