MCS-51系统中断优先级的软扩展
//…
//先调整系统栈以保存IP、IE,其过程如图1所示,再为给定中断
//(prio也是中断号)设置优先级
void SetPriority(unsigned char prio){
ENTER_CRITICAL();//关中断
#pragma asm
POP ACC //弹出返回地址的高位字节HAddr
POP B //弹出返回地址的低位字节Laddr
PUSH IP
PUSH IE //EA= =0
PUSH B //LAddr进栈
PUSH ACC //HAddr进制
#pragma endasm
switch(prio){
case 0:IP=X0_PRI_MASK;IE=X0_INT_MASK;
break;
//…
case4:IP=S_PRI_MASK;IE=S_INT_MASK;break;
}
ENTER_CRITICAL();//这里中断被打开,故再关中断
ResetIntSys();
EXIT_CRITICAL();//开中断
}
//从系统栈中恢复IE、IP,其过程如图1所示。该函数应在退出ISP时调用
void ResetPriority(void){
ENTER_CRITICAL();
#pragma asm
POP ACC //弹出返回地址的高位字节HAddr
POP B //弹出返回地址的低位字节LAddr
POP IE //EA= =0
POP IP
PUSH B //LAddr进栈
PUSH ACC //Haddr进栈
#pragma endasm
EXIT_CRITICAL();//开中断
}
//仅含一条指令:RETI,用以复位中断系统,以便系统在ISR执行过程中可响应其它中断
void ResetIntSys(void){
char code re
《MCS-51系统中断优先级的软扩展(第4页)》