📄 sw_int.c
字号:
//////////////////////////////////////////////////////////////////
//
// Copyright (c) 2006-2010 walnutcy
// All Right Reserved.
//
// $Author walnutcy
// $Email walnutcy@163.com
// $Version v1.0
// $FileName
// $Since
// $Log
//
// DESCRIPTION
//
// History:
// <author> <time> <version > <desc>
// walnutcy 2006-11-22 0.1 建立
//////////////////////////////////////////////////////////////////
#include "includes.h"
U8 sys10ms;
#pragma asm
;/////////////////////////////////////////////////
;////////add by walnutcy 2006-11-22
; PUBLIC PUSHALL
PUSHALL MACRO
;;;;;;;;;;;;;;;;;;;;;;
PUSH ACC
PUSH B
PUSH PSW
MOV PSW,#0x00
PUSH DPL
PUSH DPH
PUSH 0x00
PUSH 0x01
PUSH 0x02
PUSH 0x03
PUSH 0x04
PUSH 0x05
PUSH 0x06
PUSH 0x07
;;;;;;;;;;;;;;;;;;;;;;;;;;
ENDM
POPALL MACRO
;;;;;;;;;;;;;;;;;;;;
POP 0x07
POP 0x06
POP 0x05
POP 0x04
POP 0x03
POP 0x02
POP 0x01
POP 0x00
POP DPH
POP DPL
POP PSW
POP B
POP ACC
;;;;;;;;;;;;;;;;;;;;;;;;
ENDM
;/////////////////////////////////////////////////
#pragma endasm
void OsTaskSwitch (void) REENTRANT
{
U8 tmp;
U8 tmpsp1;
U8 tmpsp2;
if (gOsShedLock)
{ return;
}
__asm POP DPL
__asm POP DPH
if (1==gOsIntLevel)
{
tmpsp1 = DPL;
tmpsp2 = DPH;
__asm POP DPL
__asm POP DPH
}
tmp = gOs.currTask;
gOs.tcb[tmp].sp = SP;
if (OS_TASK_RUN==gOs.tcb[tmp].state)
{
gOs.tcb[tmp].state = OS_TASK_RDY;
}
for(tmp=0;tmp<OS_TASK_MAX_NUM;tmp++)
{
if (gOs.osPrio&(1<<tmp))
{
if (OS_TASK_RDY==gOs.tcb[tmp].state)
{
gOs.tcb[tmp].state = OS_TASK_RDY;
gOs.currTask = tmp;
SP = gOs.tcb[tmp].sp;
break;
}
}
}
__asm PUSH DPH
__asm PUSH DPL
if (1==gOsIntLevel)
{
DPH = tmpsp2;
DPL = tmpsp1;
__asm PUSH DPH
__asm PUSH DPL
}
}
void OsIntExit (void) REENTRANT
{
EnterCritical();
if (gOs.taskNum>1)
{
if (0==gOsMsgIntShed)
{ ExitCritical();
return;
}
gOsMsgIntShed = 0;
if (1==gOsIntLevel)
{
OsTaskSwitch();
}
}
ExitCritical();
}
void IR_CaptureInt6() //interrupt 6
{
U16 tmp;
#pragma asm
PUSHALL
#pragma endasm
gOsIntLevel++;
if (CCF1)// PCA module 1 : IR
{
CCF1 = 0;
IR_Decode();
}
#if 1
if (CCF0)// PCA module 0 :
{
CCF0 = 0;
tmp = CCAP0H;
tmp = (tmp << 8) + CCAP0L;
tmp += SYS_TIME_TICK;
CCAP0L = tmp & 0xff;
CCAP0H = tmp >> 8;
}
#endif
// if (CF) // PCA timer overflow
// {
// CF = 0;
// }
OsIntExit();
if (gOsIntLevel)
gOsIntLevel--;
#pragma asm
POPALL
RETI
#pragma endasm
}
void SysTimer0 (void)// interrupt 1 //FC66 1ms
{
#pragma asm
PUSHALL
#pragma endasm
gOsIntLevel++;
TH0 =0xFC;
TL0=0x67;
TR0=1;
sysTimeTick++ ;
#ifdef OS_DELAY
OsDealDelay();
#endif
sys10ms++;
if (10==sys10ms)
{ sys10ms = 0;
#ifdef SET_TIMER
Timer10msProc();
#endif
// isNeedTaskSW = 1;
gOsMsgIntShed = 1;
OsIntExit();
}
if (gOsIntLevel)
gOsIntLevel--;
#pragma asm
POPALL
RETI
#pragma endasm
}
void UartISR (void) //interrupt 4
{
U8 tmp;
#pragma asm
PUSHALL
#pragma endasm
gOsIntLevel++;
if (RI)// receive
{
RI = 0;
tmp = SBUF;
// SBUF = tmp;
// while (!TI);
// TI=0;
SRL_RevChar(tmp);
}
OsIntExit();
if (gOsIntLevel)
gOsIntLevel--;
#pragma asm
POPALL
RETI
#pragma endasm
}
void OSTaskSW (void) REENTRANT
{
EnterCritical();
#pragma asm
PUSHALL
#pragma endasm
if (gOs.taskNum<2)
{ return;//只有一个任务在运行
}
OsTaskSwitch();
#pragma asm
POPALL
#pragma endasm
ExitCritical();
}
void ISRAdrFun (void) REENTRANT
{
#pragma asm
NOP //3
NOP
NOP
NOP //6
NOP
NOP
NOP
NOP //0A
LJMP SysTimer0 //0B
; NOP
; NOP
NOP
NOP
;;//////////////////////////////////
NOP //10
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP //1A
NOP //1B
NOP
NOP
NOP
NOP
;;//////////////////////////////////
NOP //20
NOP
NOP
LJMP UartISR //23
; NOP
; NOP
NOP
NOP
NOP
NOP
NOP //2A
NOP //2B
NOP
NOP
NOP
NOP
;;//////////////////////////////////
NOP //30
NOP
NOP
LJMP IR_CaptureInt6 //33
; NOP
; NOP
NOP
NOP
NOP
NOP
NOP //3A
NOP //3B
NOP
NOP
NOP
NOP
;;//////////////////////////////////
NOP //40
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP //4A
NOP //4B
NOP
NOP
NOP
NOP
#pragma endasm
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -