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