📄 os_core.ls1
字号:
638 ; SOURCE LINE # 108
000B AF81 639 MOV R7,SP
000D 1581 640 DEC SP
000F A807 641 MOV R0,AR7
0011 E6 642 MOV A,@R0
643 ;---- Variable 'addr?143' assigned to Register 'R6/R7' ----
644 ; addr <<= 8;
645 ; SOURCE LINE # 109
0012 7F00 646 MOV R7,#00H
0014 FE 647 MOV R6,A
648 ; addr += Read_data(SP) ;//Read_data(SP-1); //读出刚才压入堆栈的函数地址.低地址.有错
649 ; SOURCE LINE # 110
0015 AD81 650 MOV R5,SP
0017 A805 651 MOV R0,AR5
0019 E6 652 MOV A,@R0
001A 2F 653 ADD A,R7
001B FF 654 MOV R7,A
001C E4 655 CLR A
001D 3E 656 ADDC A,R6
657 ; SP++;
658 ; SOURCE LINE # 111
001E 0581 659 INC SP
660 ;
661 ;
662 ; //保存系统任务
663 ; Tasks_TCB[OS_MAX_TASKS-1].pTask = (void code *)addr; // Load Stack pointer
in TCB
664 ; SOURCE LINE # 115
0020 A907 665 MOV R1,AR7
0022 7500FF F 666 MOV Tasks_TCB+034H,#0FFH
0025 F500 F 667 MOV Tasks_TCB+035H,A
0027 8900 F 668 MOV Tasks_TCB+036H,R1
669 ; //Tasks_TCB[OS_MAX_TASKS-1].OSTCBPrio = (INT8U)priority; // Load task priority
into TCB
670 ; Tasks_TCB[OS_MAX_TASKS-1].OSTCBStat = OS_STAT_RDY; // Task is ready to run
671 ; SOURCE LINE # 117
0029 E4 672 CLR A
002A F500 F 673 MOV Tasks_TCB+039H,A
674 ; Tasks_TCB[OS_MAX_TASKS-1].OSTCBDly = 0; //Task is not delayed
675 ; SOURCE LINE # 118
002C F500 F 676 MOV Tasks_TCB+037H,A
002E F500 F 677 MOV Tasks_TCB+038H,A
678 ; Tasks_TCB[OS_MAX_TASKS-1].stk = taskMAX_stack;
679 ; SOURCE LINE # 119
0030 750001 F 680 MOV Tasks_TCB+03AH,#01H
0033 750000 F 681 MOV Tasks_TCB+03BH,#HIGH (taskMAX_stack)
0036 750000 F 682 MOV Tasks_TCB+03CH,#LOW (taskMAX_stack)
683 ; Tasks_TCB[OS_MAX_TASKS-1].size = sizeof(taskMAX_stack);
684 ; SOURCE LINE # 120
0039 F500 F 685 MOV Tasks_TCB+03DH,A
003B 750018 F 686 MOV Tasks_TCB+03EH,#018H
687 ; Tasks_TCB[OS_MAX_TASKS-1].stk_used = (2+13);
688 ; SOURCE LINE # 121
003E F500 F 689 MOV Tasks_TCB+03FH,A
0040 75000F F 690 MOV Tasks_TCB+040H,#0FH
691 ;
692 ; pstack=Tasks_TCB[OS_MAX_TASKS-1].stk;
693 ; SOURCE LINE # 123
0043 850000 F 694 MOV pstack?142,Tasks_TCB+03BH
0046 850000 F 695 MOV pstack?142+01H,Tasks_TCB+03CH
696 ;
697 ; //系统任务就绪
698 ; //OSTaskResume(OS_MAX_TASKS-1);
A51 MACRO ASSEMBLER OS_CORE 06/06/2008 11:39:27 PAGE 12
699 ; OSRdyGrp |= OSMapTbl[(OS_MAX_TASKS-1)>>3]; //prio>>3-->prio/8
700 ; SOURCE LINE # 127
0049 900000 F 701 MOV DPTR,#OSMapTbl
004C 93 702 MOVC A,@A+DPTR
004D 4200 F 703 ORL OSRdyGrp,A
704 ; OSRdyTbl[(OS_MAX_TASKS-1)>>3] |= OSMapTbl[(OS_MAX_TASKS-1)&0x07]; //prio&0x07-
->prio%8
705 ; SOURCE LINE # 128
004F 900000 F 706 MOV DPTR,#OSMapTbl+04H
0052 E4 707 CLR A
0053 93 708 MOVC A,@A+DPTR
0054 4200 F 709 ORL OSRdyTbl,A
710 ;
711 ;
712 ; //将task函数地址替换为进入该函数后地址,该函数退出后将执行task函数
713 ; task();//该函数里面会打开中断
714 ; SOURCE LINE # 132
0056 AA00 F 715 MOV R2,task?141+01H
0058 A900 F 716 MOV R1,task?141+02H
005A 020000 F 717 LJMP ?C?ICALL
718 ; END OF _os_sys_init
719
720 ; //addr = (uint16)task;
721 ; //Write_data( ++SP, addr );
722 ; //Write_data( ++SP, addr>>8 );
723 ; //Write_data( ++SP, IEtemp );
724 ;
725 ; }
726 ;
727 ; /*------------------------------------------------------------------*-
728 ; 创建任务
729 ;
730 ; * pFunction--任务地址
731 ; * prio--优先级
732 ;
733 ; task, Task to create
734 ; prio, Task priority (1-254)
735 ; stk, Pointer to the task's stack
736 ; size, Number of bytes in the stack
737 ;
738 ; 任务创建后进入就绪状态
739 ; -*------------------------------------------------------------------*/
740 ; #pragma disable //禁止所有中断
741 ;
742 ; OS_TID os_tsk_create_user( pFUN task, U8 prio, void* stk, U16 size ) SMALL
743
---- 744 RSEG ?PR?_os_tsk_create_user?OS_CORE
0000 745 _os_tsk_create_user:
0000 D3 746 SETB C
0001 10AF01 747 JBC EA,?C0029
0004 C3 748 CLR C
0005 749 ?C0029:
0005 C0D0 750 PUSH PSW
751 USING 0
752 ; SOURCE LINE # 155
0007 8B00 F 753 MOV task?244,R3
0009 8A00 F 754 MOV task?244+01H,R2
000B 8900 F 755 MOV task?244+02H,R1
000D 8D00 F 756 MOV prio?245,R5
757 ; {//OS_TCB *ptcb;
758 ; char xdata *pstack;
759 ; uint16 i;
760 ;
761 ; //OS_ENTER_CRITICAL();
762 ; // IrqAll_Unable(); //总中断禁止 IrqT0_Unable(); //定时器0中断禁止
763 ;
A51 MACRO ASSEMBLER OS_CORE 06/06/2008 11:39:27 PAGE 13
764 ; //ptcb=&Tasks_TCB[prio];
765 ; if (Tasks_TCB[prio].pTask == NULL)
766 ; SOURCE LINE # 164
000F E500 F 767 MOV A,prio?245
0011 75F00D 768 MOV B,#0DH
0014 A4 769 MUL AB
0015 2400 F 770 ADD A,#LOW (Tasks_TCB)
0017 F8 771 MOV R0,A
0018 8603 772 MOV AR3,@R0
001A 08 773 INC R0
001B E6 774 MOV A,@R0
001C FA 775 MOV R2,A
001D 08 776 INC R0
001E E6 777 MOV A,@R0
001F 4A 778 ORL A,R2
0020 4B 779 ORL A,R3
0021 6003 780 JZ $ + 5H
0023 020000 F 781 LJMP ?C0006
782 ; {
783 ; SOURCE LINE # 165
784 ; Tasks_TCB[prio].pTask = task; // Load Stack pointer in TCB
785 ; SOURCE LINE # 166
0026 AA00 F 786 MOV R2,task?244+01H
0028 E500 F 787 MOV A,prio?245
002A 75F00D 788 MOV B,#0DH
002D A4 789 MUL AB
002E 2400 F 790 ADD A,#LOW (Tasks_TCB)
0030 F8 791 MOV R0,A
0031 A600 F 792 MOV @R0,task?244
0033 08 793 INC R0
0034 A602 794 MOV @R0,AR2
0036 08 795 INC R0
0037 A601 796 MOV @R0,AR1
797 ; //Tasks_TCB[prio].OSTCBPrio = (INT8U)priority; // Load task priority into T
CB
798 ; Tasks_TCB[prio].OSTCBStat = OS_STAT_RDY; // Task is ready to run
799 ; SOURCE LINE # 168
0039 E500 F 800 MOV A,prio?245
003B 75F00D 801 MOV B,#0DH
003E A4 802 MUL AB
003F 2400 F 803 ADD A,#LOW (Tasks_TCB+05H)
0041 F8 804 MOV R0,A
0042 E4 805 CLR A
0043 F6 806 MOV @R0,A
807 ; Tasks_TCB[prio].OSTCBDly = 0; //Task is not delayed
808 ; SOURCE LINE # 169
0044 E500 F 809 MOV A,prio?245
0046 75F00D 810 MOV B,#0DH
0049 A4 811 MUL AB
004A 2400 F 812 ADD A,#LOW (Tasks_TCB+03H)
004C F8 813 MOV R0,A
004D E4 814 CLR A
004E F6 815 MOV @R0,A
004F 08 816 INC R0
0050 F6 817 MOV @R0,A
818 ; Tasks_TCB[prio].stk = stk;
819 ; SOURCE LINE # 170
0051 AA00 F 820 MOV R2,stk?246+01H
0053 A900 F 821 MOV R1,stk?246+02H
0055 E500 F 822 MOV A,prio?245
0057 75F00D 823 MOV B,#0DH
005A A4 824 MUL AB
005B 2400 F 825 ADD A,#LOW (Tasks_TCB+06H)
005D F8 826 MOV R0,A
005E A600 F 827 MOV @R0,stk?246
0060 08 828 INC R0
A51 MACRO ASSEMBLER OS_CORE 06/06/2008 11:39:27 PAGE 14
0061 A602 829 MOV @R0,AR2
0063 08 830 INC R0
0064 A601 831 MOV @R0,AR1
832 ; Tasks_TCB[prio].size = size;//size必须比2+13大
833 ; SOURCE LINE # 171
0066 E500 F 834 MOV A,prio?245
0068 75F00D 835 MOV B,#0DH
006B A4 836 MUL AB
006C 2400 F 837 ADD A,#LOW (Tasks_TCB+09H)
006E F8 838 MOV R0,A
006F A600 F 839 MOV @R0,size?247
0071 08 840 INC R0
0072 A600 F 841 MOV @R0,size?247+01H
842 ; Tasks_TCB[prio].stk_used = 2+13;//2个任务地址+13个特殊功能寄存器
843 ; SOURCE LINE # 172
0074 E500 F 844 MOV A,prio?245
0076 75F00D 845 MOV B,#0DH
0079 A4 846 MUL AB
007A 2400 F 847 ADD A,#LOW (Tasks_TCB+0BH)
007C F8 848 MOV R0,A
007D 7600 849 MOV @R0,#00H
007F 08 850 INC R0
0080 760F 851 MOV @R0,#0FH
852 ;
853 ; //设置任务就绪表,让任务就绪
854 ; OSRdyGrp |= OSMapTbl[prio>>3]; //prio>>3-->prio/8
855 ; SOURCE LINE # 175
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -