根据网上的资料,采用定时器2自动装载模式。每10ms进一次中断。
图中可以看出,调用rtos_wait(100)后,PC=PC+3=0x0163,SP=SP+2;把PC值压栈,可以参考LCALL addr16这条汇编指令
PC是16位,所以需要两个8位的空间,因此SP需要加2。
/*
使用keil4
可运行8个任务
任务从rtos_wait()处切换,在定时时间到后从定时中断中切换回来。
使用定时器2作为系统始终
*/
#include <regx52.H>
#include <INTRINS.H>
typedef unsigned char u8;
typedef unsigned int u16;
sbit LED1 = P2 ^ 0;
sbit LED2 = P2 ^ 1;
//两个宏定义是为了保护现场,不被定时中断打乱。
//主要用于需要一次性运行完毕的代码中。
#define OPEN_SYS_ISR() {EA=1;TR2=1;}
#define CLOSE_SYS_IS