📄 task.c
字号:
/*
miniTOS V0.1.4 1998-2005 (c) 林良水 (Lin LS)
miniTOS是一个开放源码的软件,授权LGPL,但开发人员不保证本软件的可靠性,
以及对您的损失负任何责任。
www.minitos.com
*/
//#define VC_Task
#include <stdio.h>
#include "minitosdef.h"
#include "extdefine.h"
//#include "./inc/define.h"
#include "./arch/arm/arm.h"
#ifdef VC_Task
#include "ProcTbl.h"
void ready(void) {}
#endif
extern void (*ProcEntry)(void);
/*************************************************
**Function: 所有的进程都是从这里开始
**input: proc--进程入口
argc--参数1
argv--参数2
**************************************************/
void ProcShell(void (*proc)(int,void*) ,int argc,void*argv)
{
proc(argc,argv);
//用户进程结束,把本进程从Ready表中删除。while(1)是为了防止被别的进程意外调度,继续运行
while(1)
{
lock_int();
ptrCurrProc->status|=0x8000; //0x8000位表示进程已经运行结束了
unready(ptrCurrProc); //把本进程unready
sched(); //调度最高优先级任务运行
unlock_int();
}
}
/*************************************************
**Function:开机启动把Proc[i].IP初始化
**input:
*************************************************/
void InitProcIPtoNULL(void)
{
int i;
for(i=0;i<N_PROC;i++)
{
Proc[i].IP=NULL;
}
}
/*************************************************************************
**Function:建立进程
**Input: proc--
argc--
argv--不能用局部变量,防止退出时已经释放空间
**return :Not NULL -- pointer for create process.
NULL-- Error
***************************************************************************/
PROC * CreateProcess(void (*proc)(int,void*),int argc,void *argv,char *StkBottom,
int prio,int RunTicks,char RunNow)
{
int i;
for(i=0;i<N_PROC;i++)
{
if(Proc[i].IP==NULL)
break;
}
if(i==N_PROC)
return NULL; //Proc slot is full.
Proc[i].SP=StkBottom; //stack bottom,little endian,bug????
Proc[i].IP=ProcEntry; //task
Proc[i].CPSR=SVCMODE; //CPSR value bug??????? SVCMODE
Proc[i].SPSR=SVCMODE;
Proc[i].r0=(int)proc; //进程作为ProcShell第一个参数
Proc[i].r1=argc; //作为ProcShell第2个参数
Proc[i].r2=(int)argv; //作为ProcShell第3个参数
Proc[i].r3=0x33;
Proc[i].r4=0x34;
Proc[i].r5=0x35;
Proc[i].r6=0x36;
Proc[i].r7=0x37;
Proc[i].r8=0x38;
Proc[i].r9=0x39;
Proc[i].r10=0x3a;
Proc[i].r11=0x3b;
Proc[i].r12=0x3c;
Proc[i].lr=0x3e;
Proc[i].priority=prio;
Proc[i].RunTicksInit=RunTicks;
Proc[i].RunTicksCount=Proc[i].RunTicksInit;
//signal初始化
Proc[i].SignalInRun=FALSE;
Proc[i].EnableSignal=0;
Proc[i].SignalHandler=NULL;
Proc[i].signal=0;
//
//if(RunNow==MO_RUN)
{
//lock_int();
ready(&Proc[i]); //
//unlock_int();
}
return (&Proc[i]);
}
/*
修改时间片值,返回原来的时间片值
*/
int ChangeTimeSlice(PROC * proc,int TimeSlice)
{
int ret;
ret=proc->RunTicksInit;
if(TimeSlice<=0)TimeSlice=1;
proc->RunTicksInit=TimeSlice;
return ret;
}
int SuspendProcess(PROC *proc)
{
//判断进程是否已经挂起或退出
if(proc->status!=0)
{ //status!=0表示已经挂起
return 0;
}
lock_int();
unready(proc); //挂起进程
proc->status|=0x40; //置挂起标志,目前该标志位只有1位
sched(); //需要调度,防止挂起的是本进程,如果挂起的是本进程需要让出cpu
//status标志必须在ResumeProcess中清除,因为一进入ready就必须清除该标志
return 0;
}
int ResumeProcess(PROC *proc)
{
//判断进程是否已经挂起
if( (proc->status|0x40)!=0x40 )
{ //没有挂起
return 1;
}
lock_int();
ready(proc); //read 挂起的进程
//清除标志
proc->status&=~0x40; //清楚挂起标志,目前该标志位只有1位
sched(); //需要调度,如果需要让出cpu
unlock_int();
return 0;
}
int TerminateProcess(PROC *proc)
{
return 0;
}
#ifdef VC_Task
void test(void)
{
}
void main(void)
{
char buf[500];
CreateProcess(test,1,NULL,buf+100,0,1,MO_RUN);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -