⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_core.ls1

📁 uCOS-II_2.52在51上的移植程序
💻 LS1
📖 第 1 页 / 共 5 页
字号:
                     604                             ; SOURCE LINE # 115
0012 020000   F      605             LJMP    OSInitHookEnd
                     606     ; END OF _?OSInit
                     607     
                     608     ; #endif
                     609     ; }
                     610     ; /*$PAGE*/
                     611     ; /*
                     612     ; *****************************************************************************************
                             ****************
A51 MACRO ASSEMBLER  OS_CORE                                                              08/08/2005 12:35:32 PAGE    11

                     613     ; *                                              ENTER ISR
                     614     ; *
                     615     ; * Description: This function is used to notify uC/OS-II that you are about to service an 
                             interrupt
                     616     ; *              service routine (ISR).  This allows uC/OS-II to keep track of interrupt ne
                             sting and thus
                     617     ; *              only perform rescheduling at the last nested ISR.
                     618     ; *
                     619     ; * Arguments  : none
                     620     ; *
                     621     ; * Returns    : none
                     622     ; *
                     623     ; * Notes      : 1) This function should be called ith interrupts already disabled
                     624     ; *              2) Your ISR can directly increment OSIntNesting without calling this funct
                             ion because
                     625     ; *                 OSIntNesting has been declared 'global'.  
                     626     ; *              3) You MUST still call OSIntExit() even though you increment OSIntNesting 
                             directly.
                     627     ; *              4) You MUST invoke OSIntEnter() and OSIntExit() in pair.  In other words, 
                             for every call
                     628     ; *                 to OSIntEnter() at the beginning of the ISR you MUST have a call to OSI
                             ntExit() at the
                     629     ; *                 end of the ISR.
                     630     ; *              5) You are allowed to nest interrupts up to 255 levels deep.
                     631     ; *              6) I removed the OS_ENTER_CRITICAL() and OS_EXIT_CRITICAL() around the inc
                             rement because
                     632     ; *                 OSIntEnter() is always called with interrupts disabled.
                     633     ; *****************************************************************************************
                             ****************
                     634     ; */
                     635     ; 
                     636     ; void  OSIntEnter (void) reentrant
                     637     
----                 638             RSEG  ?PR?_?OSIntEnter?OS_CORE
0000                 639     _?OSIntEnter:
                     640             USING   0
                     641                             ; SOURCE LINE # 144
                     642     ; {
                     643     ;     if (OSRunning == TRUE) {
                     644                             ; SOURCE LINE # 146
0000 7800     F      645             MOV     R0,#LOW (OSRunning)
0002 E6              646             MOV     A,@R0
0003 B4010C          647             CJNE    A,#01H,?C0004
                     648     ;         if (OSIntNesting < 255) {
                     649                             ; SOURCE LINE # 147
0006 900000   F      650             MOV     DPTR,#OSIntNesting
0009 E0              651             MOVX    A,@DPTR
000A C3              652             CLR     C
000B 94FF            653             SUBB    A,#0FFH
000D 5003            654             JNC     ?C0004
                     655     ;             OSIntNesting++;                      /* Increment ISR nesting level          
                                           */
                     656                             ; SOURCE LINE # 148
000F E0              657             MOVX    A,@DPTR
0010 04              658             INC     A
0011 F0              659             MOVX    @DPTR,A
                     660     ;         }
                     661                             ; SOURCE LINE # 149
                     662     ;     }
                     663                             ; SOURCE LINE # 150
                     664     ; }
                     665                             ; SOURCE LINE # 151
0012                 666     ?C0004:
0012 22              667             RET     
                     668     ; END OF _?OSIntEnter
                     669     
A51 MACRO ASSEMBLER  OS_CORE                                                              08/08/2005 12:35:32 PAGE    12

                     670     ; /*$PAGE*/
                     671     ; /*
                     672     ; *****************************************************************************************
                             ****************
                     673     ; *                                               EXIT ISR
                     674     ; *
                     675     ; * Description: This function is used to notify uC/OS-II that you have completed serviving
                              an ISR.  When
                     676     ; *              the last nested ISR has completed, uC/OS-II will call the scheduler to det
                             ermine whether
                     677     ; *              a new, high-priority task, is ready to run.
                     678     ; *
                     679     ; * Arguments  : none
                     680     ; *
                     681     ; * Returns    : none
                     682     ; *
                     683     ; * Notes      : 1) You MUST invoke OSIntEnter() and OSIntExit() in pair.  In other words, 
                             for every call
                     684     ; *                 to OSIntEnter() at the beginning of the ISR you MUST have a call to OSI
                             ntExit() at the
                     685     ; *                 end of the ISR.
                     686     ; *              2) Rescheduling is prevented when the scheduler is locked (see OS_SchedLoc
                             k())
                     687     ; *****************************************************************************************
                             ****************
                     688     ; */
                     689     ; 
                     690     ; void  OSIntExit (void) reentrant
                     691     
----                 692             RSEG  ?PR?_?OSIntExit?OS_CORE
0000                 693     _?OSIntExit:
                     694             USING   0
                     695                             ; SOURCE LINE # 172
                     696     ; {
                     697     ; 
                     698     ;     
                     699     ;     
                     700     ;     if (OSRunning == TRUE) {
                     701                             ; SOURCE LINE # 177
0000 7800     F      702             MOV     R0,#LOW (OSRunning)
0002 E6              703             MOV     A,@R0
0003 6401            704             XRL     A,#01H
0005 6003            705             JZ      $ + 5H
0007 020000   F      706             LJMP    ?C0009
                     707     ;         OS_ENTER_CRITICAL();
                     708                             ; SOURCE LINE # 178
000A C2AF            709             CLR     EA
                     710     ;         if (OSIntNesting > 0) {                            /* Prevent OSIntNesting from w
                             rapping       */
                     711                             ; SOURCE LINE # 179
000C 900000   F      712             MOV     DPTR,#OSIntNesting
000F E0              713             MOVX    A,@DPTR
0010 D3              714             SETB    C
0011 9400            715             SUBB    A,#00H
0013 4003            716             JC      ?C0006
                     717     ;             OSIntNesting--;
                     718                             ; SOURCE LINE # 180
0015 E0              719             MOVX    A,@DPTR
0016 14              720             DEC     A
0017 F0              721             MOVX    @DPTR,A
                     722     ;         }
                     723                             ; SOURCE LINE # 181
0018                 724     ?C0006:
                     725     ;         if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Reschedule only if all ISRs
                              complete ... */
                     726                             ; SOURCE LINE # 182
A51 MACRO ASSEMBLER  OS_CORE                                                              08/08/2005 12:35:32 PAGE    13

0018 900000   F      727             MOV     DPTR,#OSIntNesting
001B E0              728             MOVX    A,@DPTR
001C 6003            729             JZ      $ + 5H
001E 020000   F      730             LJMP    ?C0007
0021 900000   F      731             MOV     DPTR,#OSLockNesting
0024 E0              732             MOVX    A,@DPTR
0025 707C            733             JNZ     ?C0007
                     734     ;             OSIntExitY    = OSUnMapTbl[OSRdyGrp];          /* ... and not locked.        
                                           */
                     735                             ; SOURCE LINE # 183
0027 900000   F      736             MOV     DPTR,#OSRdyGrp
002A E0              737             MOVX    A,@DPTR
002B 2400     F      738             ADD     A,#LOW (OSUnMapTbl)
002D F582            739             MOV     DPL,A
002F E4              740             CLR     A
0030 3400     F      741             ADDC    A,#HIGH (OSUnMapTbl)
0032 F583            742             MOV     DPH,A
0034 E0              743             MOVX    A,@DPTR
0035 900000   F      744             MOV     DPTR,#OSIntExitY
0038 F0              745             MOVX    @DPTR,A
                     746     ;             OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]])
                             ;
                     747                             ; SOURCE LINE # 184
0039 E0              748             MOVX    A,@DPTR
003A FF              749             MOV     R7,A
003B 2400     F      750             ADD     A,#LOW (OSRdyTbl)
003D F582            751             MOV     DPL,A
003F E4              752             CLR     A
0040 3400     F      753             ADDC    A,#HIGH (OSRdyTbl)
0042 F583            754             MOV     DPH,A
0044 E0              755             MOVX    A,@DPTR
0045 2400     F      756             ADD     A,#LOW (OSUnMapTbl)
0047 F582            757             MOV     DPL,A
0049 E4              758             CLR     A
004A 3400     F      759             ADDC    A,#HIGH (OSUnMapTbl)
004C F583            760             MOV     DPH,A
004E E0              761             MOVX    A,@DPTR
004F FE              762             MOV     R6,A
0050 EF              763             MOV     A,R7
0051 33              764             RLC     A
0052 33              765             RLC     A
0053 33              766             RLC     A
0054 54F8            767             ANL     A,#0F8H
0056 FF              768             MOV     R7,A
0057 EE              769             MOV     A,R6
0058 2F              770             ADD     A,R7
0059 FF              771             MOV     R7,A
005A 7800     F      772             MOV     R0,#LOW (OSPrioHighRdy)
005C F6              773             MOV     @R0,A
                     774     ;             if (OSPrioHighRdy != OSPrioCur) {              /* No Ctx Sw if current task i
                             s highest rdy */
                     775                             ; SOURCE LINE # 185
005D 18              776             DEC     R0
005E E6              777             MOV     A,@R0
005F 6F              778             XRL     A,R7
0060 6041            779             JZ      ?C0007
                     780     ;                 OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
                     781                             ; SOURCE LINE # 186
0062 08              782             INC     R0
0063 E6              783             MOV     A,@R0
0064 75F003          784             MOV     B,#03H
0067 A4              785             MUL     AB
0068 2400     F      786             ADD     A,#LOW (OSTCBPrioTbl)
006A F582            787             MOV     DPL,A
006C E4              788             CLR     A
006D 3400     F      789             ADDC    A,#HIGH (OSTCBPrioTbl)
A51 MACRO ASSEMBLER  OS_CORE                                                              08/08/2005 12:35:32 PAGE    14

006F F583            790             MOV     DPH,A
0071 E0              791             MOVX    A,@DPTR
0072 FB              792             MOV     R3,A
0073 A3              793             INC     DPTR
0074 E0              794             MOVX    A,@DPTR
0075 FA              795             MOV     R2,A
0076 A3              796             INC     DPTR

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -