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

📄 task.c

📁 minitos是一个实时的嵌入式操作系统
💻 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 + -