📄 os_core.src
字号:
MOV A,OSCurrentTaskID
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB+0BH)
MOV R0,A
INC R0
MOV A,@R0
ADD A,gStack
MOV SP,A
;
; memcpy(stack_bottom, stack_bottom_bak, Tasks_TCB[OSCurrentTaskID].stk_used);//将保存的堆栈数据拷贝到堆栈区
; SOURCE LINE # 279
MOV A,OSCurrentTaskID
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB+0BH)
MOV R0,A
MOV A,@R0
MOV DPH,A
INC R0
MOV A,@R0
MOV DPL,A
MOV R1,AR7
MOV R3,#01H
MOV R0,stack_bottom?350
MOV R4,#00H
MOV R5,#00H
MOV R6,DPH
MOV R7,A
LCALL ?C?COPY
;
; // //2.2 恢复任务特殊功能寄存器
; // #ifdef DEBUG
; // //方便在本文件中调试,查看代码方便,将多占2byte堆栈,和一点代码空间
; // Pop_Reg();
; // SP -= 13;
; // #else
; // #pragma ASM
; // #pragma ENDASM
; // #endif
; //2.3 将新任务原来断点地址压入堆栈
; //addr = (uint16)Tasks_TCB[OSCurrentTaskID].pTask;//将新任务原来断点地址压入堆栈,在该函数退出后将恢复运行
; //Write_data( ++SP, addr );
; //Write_data( ++SP, addr>>8 );
; //Write_data( ++SP, SPtemp );//恢复中断标志
;
; Write_data( ++SP, old_addr );
; SOURCE LINE # 296
MOV R7,old_addr?352+01H
INC SP
MOV R6,SP
MOV R0,AR6
MOV @R0,AR7
; Write_data( ++SP, old_addr>>8 );
; SOURCE LINE # 297
MOV A,old_addr?352
MOV R7,A
INC SP
MOV R6,SP
MOV R0,AR6
MOV @R0,AR7
; }
; SOURCE LINE # 298
?C0012:
RET
; END OF OSIntExit
;
; //功能描述: 系统时钟处理函数,处理各个任务的延时
; //任务延时减为0,就进入就绪状态
; //中断中调用, 各任务等待时间-1
; void OSTimeTick(void) SMALL
RSEG ?PR?OSTimeTick?OS_CORE
OSTimeTick:
USING 0
; SOURCE LINE # 303
; {uint8 prio;
; //OS_TCB *ptcb;
;
; //ptcb=&Tasks_TCB[0];
; for ( prio = 0; prio < OS_LOWEST_PRIO; prio++)//,ptcb++ )
; SOURCE LINE # 308
;---- Variable 'prio?454' assigned to Register 'R7' ----
CLR A
MOV R7,A
?C0013:
; {
; SOURCE LINE # 309
; // Check if there is a task at this location
; //if ( Tasks_TCB[prio].pTask )
; //{
; if(Tasks_TCB[prio].OSTCBDly != 0 )
; SOURCE LINE # 313
MOV A,R7
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB+03H)
MOV R0,A
MOV A,@R0
MOV R4,A
INC R0
MOV A,@R0
ORL A,R4
JZ ?C0015
; {
; SOURCE LINE # 314
; if ( --Tasks_TCB[prio].OSTCBDly == 0 )
; SOURCE LINE # 315
MOV A,R7
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB+03H)
MOV R0,A
INC R0
MOV A,@R0
DEC @R0
DEC R0
JNZ ?C0035
DEC @R0
?C0035:
DEC A
MOV AR4,@R0
ORL A,R4
JNZ ?C0015
; {
; SOURCE LINE # 316
; //if ((Tasks_TCB[prio].OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) // Is task suspended?
; //{
; OSRdyGrp |= OSMapTbl[prio>>3]; //prio>>3-->prio/8
; SOURCE LINE # 319
MOV A,R7
RRC A
RRC A
RRC A
ANL A,#01FH
MOV R6,A
MOV DPTR,#OSMapTbl
MOVC A,@A+DPTR
ORL OSRdyGrp,A
; OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07]; //prio&0x07-->prio%8
; SOURCE LINE # 320
MOV A,#LOW (OSRdyTbl)
ADD A,R6
MOV R0,A
MOV A,@R0
MOV R6,A
MOV A,R7
ANL A,#07H
MOVC A,@A+DPTR
ORL A,R6
MOV @R0,A
; //}
; //else
; //{
; // Schedule periodic tasks to run again
; Tasks_TCB[prio].OSTCBDly = 1;
; SOURCE LINE # 325
MOV A,R7
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB+03H)
MOV R0,A
MOV @R0,#00H
INC R0
MOV @R0,#01H
; //}
; }
; SOURCE LINE # 327
; }
; SOURCE LINE # 328
; //}
; }
; SOURCE LINE # 330
?C0015:
INC R7
CJNE R7,#05H,?C0013
; }
; SOURCE LINE # 331
?C0018:
RET
; END OF OSTimeTick
;
;
; //功能描述: 查找下一个优先级最高的就绪任务
; //找到优先级最高的任务立即退出,没找到就绪的任务那么系统就将执行优先级最低
; //的系统默认的任务
; //系统将要执行的任务号:OSNextTaskID
; void OSFindNextRunningTask(void) SMALL
RSEG ?PR?OSFindNextRunningTask?OS_CORE
OSFindNextRunningTask:
USING 0
; SOURCE LINE # 338
; {//OS_TCB *ptcb;
; //void ( code * fun )( void );
; void ( * fun )( void );
; uint8 y;
; uint8 prio;
;
;
; //while(OSRdyGrp!=0)
; if(OSRdyGrp!=0)
; SOURCE LINE # 347
MOV A,OSRdyGrp
JZ ?C0021
; {
; SOURCE LINE # 348
; y = OSUnMapTbl[OSRdyGrp]; //计算优先级,先计算组号
; SOURCE LINE # 349
MOV DPTR,#OSUnMapTbl
MOVC A,@A+DPTR
MOV R7,A
;---- Variable 'y?556' assigned to Register 'R7' ----
; prio=(INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
; SOURCE LINE # 350
ADD A,#LOW (OSRdyTbl)
MOV R0,A
MOV A,@R0
MOVC A,@A+DPTR
MOV R6,A
MOV A,R7
RLC A
RLC A
RLC A
ANL A,#0F8H
MOV R7,A
MOV A,R6
ADD A,R7
MOV R7,A
;---- Variable 'prio?557' assigned to Register 'R7' ----
;
; fun=Tasks_TCB[prio].pTask;
; SOURCE LINE # 352
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB)
MOV R0,A
INC R0
MOV A,@R0
MOV R2,A
INC R0
MOV A,@R0
;---- Variable 'fun?555' assigned to Register 'R1/R2/R3' ----
;
; //if((OSRdyTbl[y] &= ~OSMapTbl[prio&0x07])==0) //任务从就绪表中删除
; // OSRdyGrp &= ~OSMapTbl[y];
;
; if(fun!=0)
; SOURCE LINE # 357
MOV R4,AR2
ORL A,R4
JZ ?C0021
; {
; SOURCE LINE # 358
; //fun();
; OSCurrentTaskID=prio;
; SOURCE LINE # 360
MOV OSCurrentTaskID,R7
; }
; SOURCE LINE # 361
; }
; SOURCE LINE # 362
;
; // The scheduler enters idle mode at this point
; //Sys_Go_To_Sleep();
; }
; SOURCE LINE # 366
?C0021:
RET
; END OF OSFindNextRunningTask
;
; /*
; //任务延时
; 1.1 计算当前任务使用堆栈情况
; 1.2 保存任务特殊功能寄存器
; 1.3 保存任务堆栈+任务特殊功能寄存器->堆栈备份空间
; 1.4 切换任务
; 2.1 从堆栈备份空间->恢复新的就绪的任务的堆栈
; 2.2 恢复任务特殊功能寄存器
; 2.3 将新任务原来断点地址压入堆栈
; */
;
; //#pragma disable //禁止所有中断
; void os_dly_wait( U16 delay_time ) SMALL
RSEG ?PR?_os_dly_wait?OS_CORE
_os_dly_wait:
USING 0
; SOURCE LINE # 380
;---- Variable 'delay_time?658' assigned to Register 'R6/R7' ----
; //void OSTimeDly (uint16 ticks, uint8 prio) SMALL
; {//uint8 SPtemp;
; uint8 data IEtemp;
;
; //SPtemp=Read_data(SP--);//将堆栈中的中断标志读出来 #pragma disable //禁止所有中断
; IEtemp=IE;//保存中断
; SOURCE LINE # 386
;---- Variable 'IEtemp?659' assigned to Register 'R5' ----
MOV R5,IE
; OS_AllIRQ_Unable(); //总中断禁止
; SOURCE LINE # 387
CLR EA
;
; if (delay_time > 0)
; SOURCE LINE # 389
SETB C
MOV A,R7
SUBB A,#00H
MOV A,R6
SUBB A,#00H
JC ?C0022
; { /* 0 means no delay! */
; SOURCE LINE # 390
; //IrqAll_Unable(); //总中断禁止 IrqT0_Unable(); //定时器0中断禁止
; Tasks_TCB[OSCurrentTaskID].OSTCBStat |= OS_STAT_SUSPEND; // 任务被挂起
; SOURCE LINE # 392
MOV A,OSCurrentTaskID
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB+05H)
MOV R0,A
MOV A,@R0
ORL A,#08H
MOV @R0,A
; if((OSRdyTbl[OSCurrentTaskID>>3] &= ~OSMapTbl[OSCurrentTaskID&0x07])==0) //任务从就绪表中删除
; SOURCE LINE # 393
MOV A,OSCurrentTaskID
RRC A
RRC A
RRC A
ANL A,#01FH
MOV R4,A
ADD A,#LOW (OSRdyTbl)
MOV R0,A
MOV A,@R0
MOV R3,A
MOV A,OSCurrentTaskID
ANL A,#07H
MOV DPTR,#OSMapTbl
MOVC A,@A+DPTR
CPL A
ANL A,R3
MOV @R0,A
JNZ ?C0023
; OSRdyGrp &= ~OSMapTbl[OSCurrentTaskID>>3]; // prio>>3-->prio/8, //prio&0x07-->prio%8
; SOURCE LINE # 394
MOV A,R4
MOVC A,@A+DPTR
CPL A
ANL OSRdyGrp,A
?C0023:
; Tasks_TCB[OSCurrentTaskID].OSTCBDly = delay_time; // Load delay_time in TCB
; SOURCE LINE # 395
MOV A,OSCurrentTaskID
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB+03H)
MOV R0,A
MOV @R0,AR6
INC R0
MOV @R0,AR7
; //IrqAll_Enable(); //总中断允许 IrqT0_Enable(); //打开T0中断允许
; }
; SOURCE LINE # 397
?C0022:
;
; TF0=1;//设置T0中断,调用任务切换
; SOURCE LINE # 399
SETB TF0
;
; /*
; //1.2 保存任务特殊功能寄存器
; #ifdef DEBUG
; SP += 13;
; //方便在本文件中调试,查看代码方便,将多占2byte堆栈,和一点代码空间
; Push_Reg();
; #else
; #pragma asm
; ;//压栈和出栈按中断压栈和出栈的顺序
; PUSH ACC
; PUSH B
; PUSH DPH
; PUSH DPL
; PUSH PSW
; PUSH 0
; PUSH 1
; PUSH 2
; PUSH 3
; PUSH 4
; PUSH 5
; PUSH 6
; PUSH 7
; #pragma ENDASM
; #endif
;
; //下次任务运行地址是从调用os_dly_wait()地址之后开始运行
; OSIntExit();
;
; //2.2 恢复任务特殊功能寄存器
; #ifdef DEBUG
; //方便在本文件中调试,查看代码方便,将多占2byte堆栈,和一点代码空间
; Pop_Reg();
; SP -= 13;
; #else
; #pragma ASM
; #pragma ENDASM
; #endif
;
; */
;
; //OS_AllIRQ_Enable(); //总中断允许
; IE=IEtemp; //恢复所有中断状态
; SOURCE LINE # 442
MOV IE,R5
; //DelayNop(10);
; }
; SOURCE LINE # 444
RET
; END OF _os_dly_wait
;
;
; /*********************************************************************************************************
; ** 函数名称: OSTaskSuspend
; ** 功能描述: 使指定任务休眠,但不进行任务切换
; ** 输 入: TaskID : 任务ID
; ** 输 出: 无
; ** 全局变量:
; ********************************************************************************************************/
; //挂起一个任务
; //#pragma disable //禁止所有中断
; void OSTaskSuspend (uint8 TaskID) SMALL
RSEG ?PR?_OSTaskSuspend?OS_CORE
_OSTaskSuspend:
USING 0
; SOURCE LINE # 456
;---- Variable 'TaskID?760' assigned to Register 'R7' ----
; {uint8 data IEtemp;
; //OS_TCB *ptcb;
;
; IEtemp=IE;//保存中断
; SOURCE LINE # 460
;---- Variable 'IEtemp?761' assigned to Register 'R6' ----
MOV R6,IE
; OS_AllIRQ_Unable(); //总中断禁止
; SOURCE LINE # 461
CLR EA
; // IrqAll_Unable(); //总中断禁止 IrqT0_Unable(); //定时器0中断禁止
; //ptcb=&Tasks_TCB[TaskID];
; Tasks_TCB[TaskID].OSTCBStat |= OS_STAT_SUSPEND; // Task is ready to run
; SOURCE LINE # 464
MOV A,R7
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB+05H)
MOV R0,A
MOV A,@R0
ORL A,#08H
MOV @R0,A
; if((OSRdyTbl[TaskID>>3] &= ~OSMapTbl[TaskID&0x07])==0) //任务从就绪表中删除
; SOURCE LINE # 465
MOV A,R7
RRC A
RRC A
RRC A
ANL A,#01FH
MOV R5,A
ADD A,#LOW (OSRdyTbl)
MOV R0,A
MOV A,@R0
MOV R4,A
MOV A,R7
ANL A,#07H
MOV DPTR,#OSMapTbl
MOVC A,@A+DPTR
CPL A
ANL A,R4
MOV @R0,A
JNZ ?C0025
; OSRdyGrp &= ~OSMapTbl[TaskID>>3]; //TaskID>>3-->TaskID/8, //TaskID&0x07-->TaskID%8
; SOURCE LINE # 466
MOV A,R5
MOVC A,@A+DPTR
CPL A
ANL OSRdyGrp,A
?C0025:
;
; // IrqAll_Enable(); //总中断允许 IrqT0_Enable(); //打开T0中断允许
; TF0=1;//设置T0中断,调用任务切换
; SOURCE LINE # 469
SETB TF0
; IE=IEtemp; //恢复所有中断状态
; SOURCE LINE # 470
MOV IE,R6
; }
; SOURCE LINE # 471
RET
; END OF _OSTaskSuspend
;
; //唤醒挂起的任务
; //#pragma disable //禁止所有中断
;
; void OSTaskResume (uint8 prio) SMALL
RSEG ?PR?_OSTaskResume?OS_CORE
_OSTaskResume:
USING 0
; SOURCE LINE # 476
;---- Variable 'prio?862' assigned to Register 'R7' ----
; {uint8 data IEtemp;
; //OS_TCB *ptcb;
;
; IEtemp=IE;//保存中断
; SOURCE LINE # 480
;---- Variable 'IEtemp?863' assigned to Register 'R6' ----
MOV R6,IE
; OS_AllIRQ_Unable(); //总中断禁止
; SOURCE LINE # 481
CLR EA
; // IrqAll_Unable(); //总中断禁止 IrqT0_Unable(); //定时器0中断禁止
; //ptcb=&Tasks_TCB[prio];
; if (((Tasks_TCB[prio].OSTCBStat &= ~OS_STAT_SUSPEND) == OS_STAT_RDY) && // Remove suspension
; SOURCE LINE # 484
MOV A,R7
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB+05H)
MOV R0,A
MOV A,@R0
ANL A,#0F7H
MOV @R0,A
JNZ ?C0027
MOV A,R7
MOV B,#0DH
MUL AB
ADD A,#LOW (Tasks_TCB+03H)
MOV R0,A
MOV A,@R0
MOV R4,A
INC R0
MOV A,@R0
ORL A,R4
JNZ ?C0027
; (Tasks_TCB[prio].OSTCBDly == 0))
; {
; SOURCE LINE # 486
; //Make task ready to run
; OSRdyGrp |= OSMapTbl[prio>>3]; //prio>>3-->prio/8
; SOURCE LINE # 488
MOV A,R7
RRC A
RRC A
RRC A
ANL A,#01FH
MOV R5,A
MOV DPTR,#OSMapTbl
MOVC A,@A+DPTR
ORL OSRdyGrp,A
; OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07]; //prio&0x07-->prio%8
; SOURCE LINE # 489
MOV A,#LOW (OSRdyTbl)
ADD A,R5
MOV R0,A
MOV A,@R0
MOV R5,A
MOV A,R7
ANL A,#07H
MOVC A,@A+DPTR
ORL A,R5
MOV @R0,A
; }
; SOURCE LINE # 490
?C0027:
; // IrqAll_Enable(); //总中断允许 IrqT0_Enable(); //打开T0中断允许
;
; TF0=1;//设置T0中断,调用任务切换
; SOURCE LINE # 493
SETB TF0
; IE=IEtemp; //恢复所有中断状态
; SOURCE LINE # 494
MOV IE,R6
; }
; SOURCE LINE # 495
RET
; END OF _OSTaskResume
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -