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