创业史读书笔记500 创业史读书笔记500字初中( 二 )


TR2 = 1; //T2计数器打开 , 该计数器是52扩展的计数器
} //os_start(void)执行完 , 就实现RET , sp的内容赋给pc , 会接着执行任务一
//任务转换
void os_task_switch(void) {
unsigned char i;
EA = 0;
os_tcb[os_task_running_id].os_task_stack_top = SP;
os_task_int_tbl &= ~os_map_tbl[os_task_running_id];
for(i=0; i<MAX_TASKS; i++) {
if(os_task_rdy_tbl&os_map_tbl[i]) {
break;
}
}
os_task_running_id = i;
SP = os_tcb[os_task_running_id].os_task_stack_top;
if(os_task_int_tbl&os_map_tbl[os_task_running_id]) {
__asm POP 7 //Keil51的中断处理会先让这13个寄存器入栈 , 所以这里要出栈
__asm POP 6
__asm POP 5

创业史读书笔记500 创业史读书笔记500字初中

文章插图
__asm POP 4
__asm POP 3
__asm POP 2
__asm POP 1
__asm POP 0
__asm POP PSW
__asm POP DPL //13字节堆栈
__asm POP DPH
__asm POP B
__asm POP ACC
}
EA = 1;
__asm RETI //从中断服务返回主程序
}
//中断结束
void exit_int(void) {
unsigned char i;
SP -= 2;
if(--int_count == 0)
{ //如果中断数=0
os_tcb[os_task_running_id].os_task_stack_top = SP;
os_task_int_tbl |= os_map_tbl[os_task_running_id];
for(i=0; i<MAX_TASKS; i++)
{ //顺序检查任务是否准备好
if(os_task_rdy_tbl&os_map_tbl[i])
{
break;
}
}
os_task_running_id = i; //把就绪的任务号给任务运行号码
SP = os_tcb[os_task_running_id].os_task_stack_top; //堆栈指向运行任务
if(os_task_int_tbl&os_map_tbl[os_task_running_id])
{
__asm POP 7
__asm POP 6 //恢复任务寄存器
__asm POP 5
__asm POP 4
__asm POP 3
__asm POP 2
__asm POP 1
__asm POP 0
__asm POP PSW
__asm POP DPL
__asm POP DPH
__asm POP B
__asm POP ACC
}
EA = 1;
创业史读书笔记500 创业史读书笔记500字初中

文章插图
__asm RETI
}
//如果中断数还不为0
__asm POP 7
__asm POP 6 //恢复任务寄存器
__asm POP 5
__asm POP 4
__asm POP 3
__asm POP 2
__asm POP 1
__asm POP 0
__asm POP PSW
__asm POP DPL
__asm POP DPH
__asm POP B
__asm POP ACC
EA=1;
__asm RETI //计数器2中断服务程序结束 , 返回主程序
}
//滴答中断程序 , 计数器2的中断
void timer2_isr(void) interrupt 5 {
unsigned char i;
TF2=0;
enter_int();
for(i=0; i<MAX_TASKS; i++) { //每到一个中断节拍 , 检查任务等待时间 , 若为0 , 则就绪 , 否则 , 等待时间减1
if(os_tcb[i].os_task_wait_tick) {
os_tcb[i].os_task_wait_tick--;
if(os_tcb[i].os_task_wait_tick == 0) {
os_task_rdy_tbl |= os_map_tbl[i];
}
}
}
exit_int(); //
}
//下面是任务实现代码
void task_0(void) { //空循环
while(1) {
}
}
sbit seg2 = P2^5;
sbit seg3 = P2^6;
sbit seg4 = P2^7;
void delay_ms(unsigned int xms){ //只是程序延时
unsigned int x,y;
for(x=xms; x>0; x--)
for(y=248; y>0; y--);
}
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0};
void task_1(void) { //提取task_2的等待时间 , 显示在数码管上
unsigned char gw,sw,bw;
while(1) {
bw = os_tcb[2].os_task_wait_tick/100;
sw = os_tcb[2].os_task_wait_tick%100/10;
gw = os_tcb[2].os_task_wait_tick%10;