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

📄 signal.c

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

	本文实现miniTOS signal。

	create by Lin LS ,2005.3
	Bug Report: mail to(林良水)testmyself@163.net
*/


#include <stdio.h>
#include "minitosdef.h"
#include "extdefine.h"

void SignalShell(void);
int InitSignal( void (*handler)(int) );
int StartSignal(int SignalMask);
int Signal(PROC *proc,int signal);

int InitSignal( void (*handler)(int) )
{   
        //入口为空,无效
    if(handler==NULL)
    {
        return -2;
    }
            //设置handler
    ptrCurrProc->SignalHandler=handler;
            //判断是否已经有信号发过来了
    if( (ptrCurrProc->signal & ptrCurrProc->EnableSignal)
	&&( !ptrCurrProc->SignalInRun) )
    {
            //有,信号
        ptrCurrProc->SignalInRun=TRUE;
        SignalShell();
    }
	return 0;
}

int StartSignal(int SignalMask)
{
    int OldMask;
    OldMask=ptrCurrProc->EnableSignal;
            //重设Enable Mask
    ptrCurrProc->EnableSignal=SignalMask;
            //判断是否已经有信号发过来了
    if( (ptrCurrProc->signal & ptrCurrProc->EnableSignal)
          &&( !ptrCurrProc->SignalInRun) 
          &&(ptrCurrProc->SignalHandler!=NULL )  )
    {
        //有,
        ptrCurrProc->SignalInRun=TRUE;
        SignalShell();
    }
    return OldMask;
}


int Signal(PROC *proc,int signal)
{
    if(proc==NULL)
    {
        return (-2);
    }
        //结束的进程不运行signal子程序
    if( (proc->status&PROC_TERMINATE)||(proc->status&PROC_FINISH) )
    {
        return -1;
    }
        //给proc signal
    proc->signal=signal;
    
        //判断有没有激活的signal
    if( !(proc->signal & proc->EnableSignal) )
    {
        return 0;
     }
        //是本进程给本进程发signal
     if(proc==ptrCurrProc)
     {
        //运行signal子进程
        ptrCurrProc->SignalInRun=TRUE;
        SignalShell();
     }else
     {
  /*      proc->SignalStart=TRUE;
        proc->status_bak=proc->status;
        set_signal_shell_register_and_stack();
        if(proc->status!=0)
        {
            ready(proc);
            proc->status=0;
            sched();
        
        }
  */      
     }
     return 0;
}

void SignalShell(void)
{
    int sig;
    
    sig= ptrCurrProc->signal & ptrCurrProc->EnableSignal;
     if( sig  )
     {
           
           ( *(ptrCurrProc->SignalHandler) )(sig);
     }
     ptrCurrProc->signal=0;
     ptrCurrProc->SignalInRun=FALSE;
    
    
}

⌨️ 快捷键说明

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