📄 os_cpu_a.lst
字号:
483 ; } while (--i != 0);
0069 DAFA 484 DJNZ R2,StkInit18
485 ; }
006B 486 StkInit12:
487 ; cp = OSTsakStackBotton[TaskID];
006B 7400 F 488 MOV A,#LOW (OSTsakStackBotton)
006D 2B 489 ADD A,R3
006E F8 490 MOV R0,A
006F E6 491 MOV A,@R0
0070 F9 492 MOV R1,A
493 ; *cp++ = (uint16)task % 256;
0071 D0E0 494 pop ACC
0073 F7 495 MOV @R1,A
0074 09 496 INC R1
497 ; *cp++ = (uint16)task / 256;
0075 D0E0 498 pop ACC
0077 F7 499 MOV @R1,A
0078 09 500 INC R1
501
A51 MACRO ASSEMBLER OS_CPU_A 07/02/2005 23:47:38 PAGE 9
509 ; *cp = 0;
0079 E4 510 CLR A
007A F7 511 MOV @R1,A
512 ; }
007B 22 513 RET
514
515 ;/*****************************************************************************************
****************
516 ;** 函数名称: LoadCtx
517 ;** 功能描述: 任务环境恢复函数
518 ;** 输 入: OSTaskID,OSFastSwap
519 ;** 输 出 : 无
520 ;** 全局变量: 无
521 ;** 调用模块: 无
522 ;**
523 ;** 作 者: 陈明计
524 ;** 日 期: 2002年2月22日
525 ;**----------------------------------------------------------------------------------------
---------------
526 ;** 修 改: 陈明计
527 ;** 日 期: 2002年12月2日
528 ;**----------------------------------------------------------------------------------------
---------------
529 ;** 修 改: 陈明计
530 ;** 日 期: 2003年2月5日
531 ;**----------------------------------------------------------------------------------------
---------------
532 ;** 修 改:
533 ;** 日 期:
534 ;**----------------------------------------------------------------------------------------
---------------
535 ;******************************************************************************************
**************/
536
---- 537 RSEG ?PR?LoadCtx?OS_CPU_A
0000 538 LoadCtx:
539 USING 0
540
0000 D000 F 541 POP Os_Enter_Sum ;恢复关中断计数器
542
543
547
548 ;判断是否需要恢复所有寄存器
0002 E500 F 549 MOV A,OSTaskID
0004 B40202 550 CJNE A,#2,LoadCtx_0
0007 8022 551 SJMP LoadCtx_2
0009 552 LoadCtx_0:
0009 900000 F 553 MOV DPTR,#OSMapTbl
554
000C 93 555 MOVC A,@A+DPTR
000D 5500 F 556 ANL A,OSFastSwap
A51 MACRO ASSEMBLER OS_CPU_A 07/02/2005 23:47:38 PAGE 10
000F 701A 568 JNZ LoadCtx_2
569 ;恢复寄存器
0011 D007 570 POP 7
0013 D006 571 POP 6
0015 D005 572 POP 5
0017 D004 573 POP 4
0019 D003 574 POP 3
001B D002 575 POP 2
001D D001 576 POP 1
001F D000 577 POP 0
0021 D0D0 578 POP PSW
0023 D082 579 POP DPL
0025 D083 580 POP DPH
0027 D0F0 581 POP B
0029 D0E0 582 POP ACC
002B 583 LoadCtx_2:
584 ;判断是否需要开中断
002B 0500 F 585 INC Os_Enter_Sum
002D D50002 F 586 djnz Os_Enter_Sum,LoadCtx_3
587 SET_EA ;开中断
0032 589 LoadCtx_3:
0032 22 590 RET
591
592
593 ;/*****************************************************************************************
****************
594 ;** 函数名称: OSCtxSw
595 ;** 功能描述: 任务主动放弃CPU环境保存函数
596 ;** 输 入: OSTaskID
597 ;** 输 出 : 无
598 ;** 全局变量: OSFastSwap
599 ;** 调用模块: 无
600 ;**
601 ;** 作 者: 陈明计
602 ;** 日 期: 2002年2月22日
603 ;**----------------------------------------------------------------------------------------
---------------
604 ;** 修 改:
605 ;** 日 期:
606 ;**----------------------------------------------------------------------------------------
---------------
607 ;******************************************************************************************
**************/
---- 608 RSEG ?PR?OSCtxSw?OS_CPU_A
0000 609 OSCtxSw:
610 USING 0
611
612
616
0000 C000 F 617 PUSH Os_Enter_Sum ;保存关中断计数器
618 ;设置标志:任务再次恢复运行时不必恢复所有寄存器
0002 900000 F 619 MOV DPTR,#OSMapTbl
0005 E500 F 620 MOV A,OSTaskID
621
0007 93 622 MOVC A,@A+DPTR
0008 4200 F 623 ORL OSFastSwap,A
A51 MACRO ASSEMBLER OS_CPU_A 07/02/2005 23:47:38 PAGE 11
000A 020000 F 636 LJMP C_OSCtxSw
637 ;****************************************************************************************
638 ;/*****************************************************************************************
****************
639 ;** 函数名称: C_OSCtxSw
640 ;** 功能描述: 堆栈处理函数
641 ;** 输 入: 无
642 ;** 输 出 : 无
643 ;** 全局变量: OSTaskID,OSTsakStackBotton,SP
644 ;** 调用模块: LoadCtx
645 ;**
646 ;** 作 者: 陈明计
647 ;** 日 期: 2002年2月22日
648 ;**----------------------------------------------------------------------------------------
---------------
649 ;** 修 改: 陈明计
650 ;** 日 期: 2002年12月2日
651 ;**----------------------------------------------------------------------------------------
---------------
652 ;** 修 改:
653 ;** 日 期:
654 ;**----------------------------------------------------------------------------------------
---------------
655 ;******************************************************************************************
**************/
---- 656 RSEG ?PR?C_OSCtxSw?OS_CPU_A
0000 657 C_OSCtxSw:
658
0000 AA81 659 mov r2,sp
660
661 ; cp1 = (unsigned char idata *)SP +1;
0002 A881 662 MOV R0,SP
663
664 IF 0 <> 0
mov sp,#(Sp2-1) ;堆栈指向临时空间,允许“软非屏蔽中断”
ENDIF
667
0004 08 668 INC R0
669 ; temp = (unsigned char )OSTsakStackBotton[OSNextTaskID+1];
0005 7400 F 670 MOV A,#LOW (OSTsakStackBotton+01H)
0007 2500 F 671 ADD A,OSNextTaskID
0009 F9 672 MOV R1,A
000A E7 673 MOV A,@R1
000B FF 674 MOV R7,A
675 ; cp2 = OSTsakStackBotton[OSTaskID+1];
000C 7400 F 676 MOV A,#LOW (OSTsakStackBotton+01H)
000E 2500 F 677 ADD A,OSTaskID
0010 F9 678 MOV R1,A
0011 E7 679 MOV A,@R1
0012 F9 680 MOV R1,A
681 ; if( OSNextTaskID > OSTaskID)
0013 E500 F 682 MOV A,OSNextTaskID
0015 D3 683 SETB C
0016 9500 F 684 SUBB A,OSTaskID
0018 4033 685 JC ?C0001
686 ; {
687 ; while(cp2 != (unsigned char idata *)temp)
A51 MACRO ASSEMBLER OS_CPU_A 07/02/2005 23:47:38 PAGE 12
688 ; {
689 ; *cp1++ = *cp2++;
690 ; }
001A EF 691 MOV A,R7
001B C3 692 CLR C
001C 99 693 SUBB A,R1
001D FE 694 MOV R6,A
001E 695 ?C0002:
001E E7 696 MOV A,@R1
001F F6 697 MOV @R0,A
0020 08 698 INC R0
0021 09 699 INC R1
0022 DEFA 700 DJNZ R6,?C0002
0024 701 ?C0003:
702 ; temp = OSTsakStackBotton[OSTaskID+1] - (unsigned char idata *)SP-1;
0024 7400 F 703 MOV A,#LOW (OSTsakStackBotton+1)
0026 2500 F 704 ADD A,OSTaskID
0028 F9 705 MOV R1,A
0029 E7 706 MOV A,@R1
002A D3 707 SETB C
708 ;SUBB A,sp
002B 9A 709 SUBB A,r2
002C FF 710 MOV R7,A
711 ; SP = (unsigned char )cp1 - 1;
002D 18 712 DEC R0;
002E 8881 713 MOV SP,R0
714 ; for(i = OSTaskID+1;i < OSNextTaskID+1; i++)
715 ; {
716 ; OSTsakStackBotton[i] -= temp;
717 ; }
0030 E500 F 718 MOV A,OSNextTaskID
0032 C3 719 CLR C
0033 9500 F 720 SUBB A,OSTaskID
0035 FE 721 MOV R6,A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -