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

📄 sleep.c

📁 minitos是一个实时的嵌入式操作系统
💻 C
字号:
/*
	miniTOS V0.1.3  1998-2004 (c) 林良水 (Lin LS)
	miniTOS是一个开放源码的软件,授权LGPL,但开发人员不保证本软件的可靠性,
以及对您的损失负任何责任。
	www.minitos.com

	本文实现miniTOS时间处理函数。

	create by Lin LS ,1998.10
	移植到Arm by Lin LS ,2000.8
	修改到at9140800 by LinLS,2003
	Bug Report: mail to(林良水)testmyself@163.net
*/
//#define VC_SLEEP

#include <stdio.h>

#include "minitosdef.h"
#include "extdefine.h"

#ifdef VC_SLEEP
#include "proctbl.h"
void lock_int(void){};
void unlock_int(void){};
void switch_task(void){};
void SendOneChar(int i,char a){i=i;a=a;};
#endif

//挂起进程等待ticks个定时中断。
void DelayTicks(int Ticks)
{
	PROC * ptrTmp,*ptrTmpOld;
	lock_int();
	ptrCurrProc->status|=0x80;		//bit0.7 is suspend for timetick
	ptrCurrProc->SleepTicks=Ticks;

//first unready current process,or will make err.
//because change ptrCurrProc->ptrNextProc value.
	unready(ptrCurrProc);

	if(ptrSleepProc==NULL)
	{	//原来没有sleep的进程,第一个进入sleep的进程
		ptrSleepProc=ptrCurrProc;
		ptrSleepProc->ptrNextProc=NULL;
	}else
	{
		ptrTmpOld=ptrSleepProc;	
		ptrTmp=ptrSleepProc;
		while(ptrTmp!=NULL)
		{	//find last sleep process,找sleep链表的最后一个
			ptrTmpOld=ptrTmp;
			ptrTmp=ptrTmp->ptrNextProc;
		}
		ptrTmpOld->ptrNextProc=ptrCurrProc;	//加入链表最后位置
		(ptrTmpOld->ptrNextProc)->ptrNextProc=NULL;
	}
	if(ptrProcRdy==NULL)
		;//SendOneChar(1,'t');
	else	;//SendOneChar(1,'d');

	sched();
	lock_int();
	ptrCurrProc->status&=0x7F;
	unlock_int();

}
//挂起进程等待I个100ms.
void Delay100ms(int i)
{
	DelayTicks(i*10);
}
//挂起进程等待sec秒。
void Sleep(int sec)
{
	Delay100ms(sec*10);
}

/*******************************************************************
**function: 本子程序是在TC2ISR中调用,在定事中断运行
**
**
**Problem:	误差几个ticks?????
**NOTES:	中断不能嵌套.
********************************************************************/
void OnTime(void)
{
	PROC * ptrTmp,* ptrTmpOld,*ptrTmp2;
	int count;
	count=0;
	ptrTmp=ptrSleepProc;
	ptrTmpOld=ptrSleepProc;

//	SendOneChar(1,'f');

	while(ptrTmp!=NULL)
	{
	//	SendOneChar(1,'t');
		
		if(ptrTmp->SleepTicks>0)	//为0和1的情况????
		{
		//	SendOneChar(1,'a');

			ptrTmp->SleepTicks--;
			ptrTmpOld=ptrTmp;			
			ptrTmp=ptrTmp->ptrNextProc; //指向ptrSleepProc中的下一个进程
			count++;
		//	SendOneChar(1,'0'+count);
		}else
		{
		//	SendOneChar(1,'b');
			ptrTmp2=ptrTmp->ptrNextProc; //先暂存Sleep链表的下一个位置,不然ready会破坏该链表
			ready(ptrTmp);

			//在ptrSleepProc的链表中去掉ptrTmp
			if(count==0)
			{	//是表中的第一个已经时间到了
				ptrSleepProc=ptrTmp2; //ptrSleepProc->ptrNextProc;
				ptrTmp=ptrSleepProc;
				ptrTmpOld=ptrSleepProc;

			}else
			{
				ptrTmpOld->ptrNextProc=ptrTmp2; //删掉ptrTmp
				ptrTmp=ptrTmpOld->ptrNextProc;	//继续判断下一个进程
					//在这里ptrTmpOld不用改变
				count++;
			}
			
		}

	}	//while

}


#ifdef VC_SLEEP
void main(void)
{
DelayTicks(250);

}
#endif

⌨️ 快捷键说明

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