创业史读书笔记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;


特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。