📄 sleep.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 + -