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

📄 os_cpu_a.s90

📁 IAR_ATMega16_UCOS_II.rar
💻 S90
字号:
;********************************************************************************************************
;                                           I/O PORT ADDRESSES
;********************************************************************************************************

SREG    = 0x3F
SPH     = 0x3E
SPL     = 0x3D

;********************************************************************************************************
;                                          PUBLIC DECLARATIONS
;********************************************************************************************************

                MODULE  OS_CPU_A
                PUBLIC  OSStartHighRdy
                PUBLIC  OSCtxSw
                PUBLIC  OSIntCtxSw
                PUBLIC  IntEnter
                PUBLIC  IntExit
;********************************************************************************************************
;                                         EXTERNAL DECLARATIONS
;********************************************************************************************************
          
                EXTERN  OSIntExit
                EXTERN  OSIntNesting
                EXTERN  OSPrioCur
                EXTERN  OSPrioHighRdy
                EXTERN  OSRunning
                ;EXTERN  OSTaskSwHook
                EXTERN  OSTCBCur
                EXTERN  OSTCBHighRdy
                EXTERN  OSTimeTick
                EXTERN  OSICB

;********************************************************************************************************
;                                         MACROS
;********************************************************************************************************

PUSHRS          MACRO                               ; Save all registers
                ST      -Y,R0
                ST      -Y,R1
                ST      -Y,R2
                ST      -Y,R3
                ST      -Y,R4
                ST      -Y,R5
                ST      -Y,R6
                ST      -Y,R7
                ST      -Y,R8
                ST      -Y,R9
                ST      -Y,R10
                ST      -Y,R11
                ST      -Y,R12
                ST      -Y,R13
                ST      -Y,R14
                ST      -Y,R15
                ST      -Y,R16
                ST      -Y,R17
                ST      -Y,R18
                ST      -Y,R19
                ST      -Y,R20
                ST      -Y,R21
                ST      -Y,R22
                ST      -Y,R23
                ST      -Y,R24
                ST      -Y,R25
                ST      -Y,R26
                ST      -Y,R27
                ST      -Y,R30
                ST      -Y,R31
                ENDM

POPRS           MACRO                               ; Restore all registers
                LD      R31,Y+
                LD      R30,Y+
                LD      R27,Y+
                LD      R26,Y+
                LD      R25,Y+
                LD      R24,Y+
                LD      R23,Y+
                LD      R22,Y+
                LD      R21,Y+
                LD      R20,Y+
                LD      R19,Y+
                LD      R18,Y+
                LD      R17,Y+
                LD      R16,Y+
                LD      R15,Y+
                LD      R14,Y+
                LD      R13,Y+
                LD      R12,Y+
                LD      R11,Y+
                LD      R10,Y+
                LD      R9,Y+
                LD      R8,Y+
                LD      R7,Y+
                LD      R6,Y+
                LD      R5,Y+
                LD      R4,Y+
                LD      R3,Y+
                LD      R2,Y+
                LD      R1,Y+
                LD      R0,Y+
                ENDM

PUSHSP          MACRO                               ; Save stack pointer
                IN      R16,SPH
                ST      -Y,R16
                IN      R16,SPL
                ST      -Y,R16
                ENDM

POPSP           MACRO                               ; Restore stack pointer
                LD      R16,Y+
                OUT     SPL,R16
                LD      R16,Y+
                OUT     SPH,R16
                ENDM

PUSHSREG        MACRO                               ; Save status register
                IN      R16,SREG
                ;CBR     R16,0x80                    ; Clear interrupt bit in status reg and save
                ST      -Y,R16
                ENDM

POPSREG         MACRO                               ; Restore status registers
                LD      R16,Y+
                OUT     SREG,R16
                ENDM

                RSEG    CODE
;********************************************************************************************************

IntEnter:       PUSHRS
                PUSHSREG
                LDS     R16, OSIntNesting
                INC     R16
                STS     OSIntNesting, R16
                CPI     R16, 1
                BRNE    IntEnter1
                
                POP     R31
                POP     R30
                PUSHSP
                LDS     R26,OSTCBCur                ; x = OSTCBCur->OSTCBStkPtr
                LDS     R27,OSTCBCur+1              ;
                ST      x+,R28                      ; Save Y (R29:R28) pointer to current task
                ST      x+,R29                      ;
                LDS     R28,OSICB                   ; Load Y (R29:R28) pointer from OSICB
                LDS     R29,OSICB+1
                LDS     R16,OSICB+2                 ; Restore SP from OSICB
                OUT     SPL,R16
                LDS     R16,OSICB+3
                OUT     SPH,R16                
                IJMP
        
IntEnter1:      LDS     R16,OSICB+4                 ;Save old frame pointer to the stack
                ST      -Y,R16                
                LDS     R16,OSICB+5
                ST      -Y,R16
                STS     OSICB+4,R28                 ;Save Y to the frame pointer
                STS     OSICB+5,R29
                RET
;********************************************************************************************************
IntExit:        LDS     R16, OSIntNesting
                TST     R16
                BRNE    IntExit1
                LDS     R30,OSTCBCur                ; Z = OSTCBCur->OSTCBStkPtr
                LDS     R31,OSTCBCur+1              ;
                LD      R28,Z+                      ; Load Y (R29:R28) pointer
                LD      R29,Z+                      ;
                POPSP                               ; Restore stack pointer
                POPSREG                             ; Restore status register
                POPRS                               ; Restore all registers
                RETI                                ; Start task
                
IntExit1:       LDS    R28,OSICB+4                  ;Load Y from frame pointer
                LDS    R29,OSICB+5
                LD     R16,Y+                       ;Load old frame pointer from stack
                STS    OSICB+5,R16
                LD     R16,Y+
                STS    OSICB+4,R16
                POPSREG
                POPRS
                RETI
;********************************************************************************************************

OSStartHighRdy: ;CALL    OSTaskSwHook                ; Invoke user defined context switch hook
                LDS     R16,OSRunning               ; Indicate that we are multitasking
                INC     R16                         ;
                STS     OSRunning,R16               ;
                STS     OSICB,R28
                STS     OSICB+1,R29
                POP     R16
                POP     R16
                IN      R16,SPL
                STS     OSICB+2,R16
                IN      R16,SPH
                STS     OSICB+3,R16
                LDS     R30,OSTCBHighRdy            ; Let Z point to TCB of highest priority task
                LDS     R31,OSTCBHighRdy+1          ; ready to run
                LD      R28,Z+                      ; Load Y (R29:R28) pointer
                LD      R29,Z+                      ;

                POPSP                               ; Restore stack pointer
                POPSREG                             ; Restore status register
                POPRS                               ; Restore all registers
                RETI                                ; Start task

;********************************************************************************************************
OSCtxSw:        PUSHRS                              ; Save current task's context
                PUSHSREG
                PUSHSP

                LDS     R30,OSTCBCur                ; Z = OSTCBCur->OSTCBStkPtr
                LDS     R31,OSTCBCur+1              ;
                ST      Z+,R28                      ; Save Y (R29:R28) pointer
                ST      Z+,R29                      ;

               ; CALL    OSTaskSwHook                ; Call user defined task switch hook

OSIntCtxSw:     LDS     R16,OSPrioHighRdy           ; OSPrioCur = OSPrioHighRdy
                STS     OSPrioCur,R16

                LDS     R30,OSTCBHighRdy            ; Let Z point to TCB of highest priority task
                LDS     R31,OSTCBHighRdy+1          ; ready to run
                STS     OSTCBCur,R30                ; OSTCBCur = OSTCBHighRdy
                STS     OSTCBCur+1,R31              ;

                LD      R28,Z+                      ; Restore Y pointer
                LD      R29,Z+                      ;
                POPSP                               ; Restore stack pointer
                POPSREG                             ; Restore status register
                POPRS                               ; Restore all registers
                RETI
                END

⌨️ 快捷键说明

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