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

📄 tisr.c

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

	本文实现miniTOS task isr处理。

	create by Lin LS ,2005.6
	Bug Report: mail to(林良水)testmyself@tom.com
*/


#include <stdio.h>

#include "minitosdef.h"
#include "extdefine.h"
//#include "./inc/define.h"
#include "./arch/arm/arm.h"

extern void (*TisrEntry)(void);

/*************************************************
**Function: 所有的Tisr是从这里开始
**input: proc--进程入口
         
**************************************************/
void TisrShell(void (*tisr_proc)(void) )
{
    while(1)
    {
        do
        {
            tisr_proc();
            ptrCurrProc->TisrRunCount--;
        }while(ptrCurrProc->TisrRunCount);
            //用户进程结束,把本进程从Ready表中删除。while(1)是为了防止被别的进程意外调度,继续运行
        lock_int();
        ptrCurrProc->status|=0x8000;    //0x8000位表示进程已经运行结束了
        unready(ptrCurrProc);           //把本进程unready
        sched();                        //调度最高优先级任务运行
        unlock_int();
            //又从新开始运行tisr
    }
}


/*************************************************************************
**Function:建立进程
**Input: 

**return :Not NULL -- pointer for create TISR.
              NULL-- Error
***************************************************************************/
TISR * CreateTISR(TISR *tisr,void (*tisr_proc)(void),char *StkBottom,int prio)
{
        //int i;
        if(tisr==NULL)
        {
            //从系统中分配,(可malloc),暂不支持,bug????
        }

        tisr->SP=StkBottom; //stack bottom,little endian,bug????align

        tisr->IP=TisrEntry;   //task isr entry
        tisr->CPSR=SVCMODE;   //CPSR value bug???????  SVCMODE
        tisr->SPSR=SVCMODE;
        tisr->r0=(int)tisr_proc;  //进程作为ProcShell第一个参数
        tisr->r1=0x31;        //作为ProcShell第2个参数
        tisr->r2=0x32;   //作为ProcShell第3个参数
        tisr->r3=0x33;
        tisr->r4=0x34;
        tisr->r5=0x35;
        tisr->r6=0x36;
        tisr->r7=0x37;
        tisr->r8=0x38;
        tisr->r9=0x39;
        tisr->r10=0x3a;
        tisr->r11=0x3b;
        tisr->r12=0x3c;
        tisr->lr=0x3e;
            //tisr prio must =1 or 2
        if( (prio==1)||(prio==2) )
            tisr->priority=prio;
        else
            tisr->priority=2;
            
        tisr->RunTicksInit=0x0FFFFFFF;  //run always
        tisr->RunTicksCount=tisr->RunTicksInit;
        
                //signal初始化
        tisr->SignalInRun=FALSE;
        tisr->EnableSignal=0;
        tisr->SignalHandler=NULL;
        tisr->signal=0;
        
        tisr->TisrRunCount=0;
           
        return (tisr);
}

//该程序一般实在硬件中断中被调用
int  ActiveTISR(TISR *tisr)
{
 //   lock_int();   //在硬件中断中被调用,已关中断
    // all ready run?
    if (tisr -> TisrRunCount)
    {//yes,已经被运行了
        tisr -> TisrRunCount++;
        if(tisr -> TisrRunCount==0)
        {//overflow
            tisr -> TisrRunCount=0xffffffff;
        }
        unlock_int();
        return 0;
    }else
    {//no,first run
        tisr -> TisrRunCount++;
        ready(tisr);    //使tisr可运行,需要等硬件中断处理完成才可能被调度
        
    }
//    unlock_int();
    return 0;
    
}

⌨️ 快捷键说明

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