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

📄 os_xa-al.as

📁 uCOS的源码例子
💻 AS
字号:
;********************************************************************************************************
;                                                 uC/OS
;                                          The Real-Time Kernel
;
;                                   XA SPECIFIC ASSEMBLY LANGUAGE CODE
;
;                                       Philips Semiconductors, Inc.
;                                             XA (Large Model)
;
; File : OS_XA-AL.AS
;********************************************************************************************************

            global  _OSStartHighRdy
            signat  _OSStartHighRdy,24
            global  _OSCtxSw
            signat  _OSCtxSw,24
            global  _OSIntCtxSw
            signat  _OSIntCtxSw,24

            global  _OSTCBHighRdy
            global  _OSTCBCur

BIT_SSEL0   equ     218h                         ; Segment selection register bit definition
BIT_SSEL1   equ     219h
BIT_SSEL2   equ     21ah
BIT_SSEL3   equ     21bh
BIT_SSEL4   equ     21ch
BIT_SSEL5   equ     21dh
BIT_SSEL6   equ     21eh
BIT_SSEL7   equ     21fh

REG_CS      equ     440h                         ; XA registers
REG_DS      equ     441h
REG_ES      equ     442h
REG_SSEL    equ     403h
REG_PSWH    equ     401h

;/*$PAGE*/
;*********************************************************************************************************
;                                      START MULTITASKING
;                                   void OSStartHighRdy(void)
;
; Total execution time :  97 bus cycles
;*********************************************************************************************************
            psect   ltext,class=CODE,space=0,align=2

_OSStartHighRdy:
            mov     r0,#(_OSTCBHighRdy) and 0ffffh; 4~, R3:R2  = OSTCBHighRdy
            mov.b   REG_ES,#seg(_OSTCBHighRdy)    ; 4~
            setb    BIT_SSEL0                     ; 4~, SSEL.0 = 1 (R0 uses ES register)
            mov.w   r2,[r0]                       ; 3~
            mov.w   r3,[r0+2]                     ; 3~

            mov.w   r0,r2                         ; 3~, ES:R0  = OSTCBHighRdy
            mov.b   REG_ES,r3l                    ; 4~,   ES

            mov.w   r2,[r0+]                      ; 4~, DS:USP = OSTCBHighRdy->OSTCBStkPtr
            mov.w   usp,r2                        ; 3~
            mov.b   REG_DS,[r0]                   ; 3~,   DS
            clr     BIT_SSEL0                     ; 4~,   SSEL.0 = 0 (R0 uses DS register)

            popu    r2                            ; 5~, Move PCL from US to SS
            push    r2                            ; 5~
            popu    r2                            ; 5~, Move PCH from US to SS
            push    r2                            ; 5~
            popu    r2                            ; 5~, Move PSW from US to SS
            push    r2                            ; 5~
            popu.b  REG_SSEL                      ; 5~, Get SSEL
            popu.b  REG_ES                        ; 5~, Get ES
            popu    r0,r1,r2,r3,r4,r5,r6          ;18~, Load task's context
            reti                                  ;10~, Run task
;/*$PAGE*/
;*********************************************************************************************************
;                                PERFORM A CONTEXT SWITCH (From task level)
;                                           void OSCtxSw(void)
;
; Total execution time : 244 bus cycles
;*********************************************************************************************************
            psect   ltext,class=CODE,space=0,align=2

_OSCtxSw:
            pushu   r0,r1,r2,r3,r4,r5,r6          ;24~, Save current task's context
            pushu.b REG_ES                        ; 5~, Save ES
            pushu.b REG_SSEL                      ; 5~, Save SSEL
            pop     r2                            ; 5~, Move PSW from SS to US
            pushu   r2                            ; 5~
            pop     r2                            ; 5~, Move PCH from SS to US
            pushu   r2                            ; 5~
            pop     r2                            ; 5~, Move PCL from SS to US
            pushu   r2                            ; 5~

            mov     r0,#(_OSTCBCur) and 0ffffh    ; 4~, R3:R2  = OSTCBCur
            mov.b   REG_ES,#seg(_OSTCBCur)        ; 4~
            setb    BIT_SSEL0                     ; 4~, SSEL.0 = 1 (R0 uses ES register)
            mov.w   r2,[r0]                       ; 3~
            mov.w   r3,[r0+2]                     ; 3~
            mov.w   r0,r2                         ; 3~, ES:R0  = OSTCBCur
            mov.b   REG_ES,r3l                    ; 4~
            mov.b   r2h,#0                        ; 3~
            mov.b   r2l,REG_DS                    ; 4~
            mov.w   r3,usp                        ; 3~, OSTCBCur->OSTCBStkPtr = USP
            mov.w   [r0],r3                       ; 3~
            mov.w   [r0+2],r2                     ; 3~

            mov     r0,#(_OSTCBHighRdy) and 0ffffh; 4~, R3:R2  = OSTCBHighRdy
            mov.b   REG_ES,#seg(_OSTCBHighRdy)    ; 4~
            mov.w   r2,[r0]                       ; 3~
            mov.w   r3,[r0+2]                     ; 3~
            mov     r0,#(_OSTCBCur) and 0ffffh    ; 4~
            mov.b   REG_ES,#seg(_OSTCBCur)        ; 4~
            mov.w   [r0],r2                       ; 3~,
            mov.w   [r0+2],r3                     ; 3~

            mov.w   r0,r2                         ; 3~, ES:R0 = OSTCBHighRdy
            mov.b   REG_ES,r3l                    ; 4~
            mov.w   r2,[r0]                       ; 3~, R3:R2 = OSTCBHighRdy->OSTCBStkPtr
            mov.w   r3,[r0+2]                     ; 3~

            mov.w   usp,r2                        ; 3~, DS:USP = OSTCBHighRdy->OSTCBStkPtr
            mov.b   REG_DS,r3l                    ; 4~
            clr     BIT_SSEL0                     ; 4~

            popu    r2                            ; 5~, Move PCL from US to SS
            push    r2                            ; 5~
            popu    r2                            ; 5~, Move PCH from US to SS
            push    r2                            ; 5~
            popu    r2                            ; 5~, Move PSW from US to SS
            push    r2                            ; 5~
            popu.b  REG_SSEL                      ; 5~, Get SSEL
            popu.b  REG_ES                        ; 5~, Get ES
            popu    r0,r1,r2,r3,r4,r5,r6          ;18~, Load new task's context
            reti                                  ;10~, Return to new task
;/*$PAGE*/
;*********************************************************************************************************
;                                PERFORM A CONTEXT SWITCH (From an ISR)
;                                         void OSIntCtxSw(void)
;
; Total execution time : 172 bus cycles
;
; Notes : The offset added to the first instruction may need to be adjusted based on the compiler
;         options used.
;*********************************************************************************************************
            psect   ltext,class=CODE,space=0,align=2

_OSIntCtxSw:
            add.w   r7,#10                        ; 3~, Ignore calls to OSIntExit, OSIntCtxSw and locals

            mov     r0,#(_OSTCBCur) and 0ffffh    ; 4~
            mov.b   REG_ES,#seg(_OSTCBCur)        ; 4~
            setb    BIT_SSEL0                     ; 4~     SSEL.0 = 1 (R0 uses ES register)
            mov.w   r2,[r0]                       ; 3~, R3:R2 = OSTCBCur
            mov.w   r3,[r0+2]                     ; 3~
            mov.w   r0,r2                         ; 3~, ES:R0 = OSTCBCur
            mov.b   REG_ES,r3l                    ; 4~
            mov.b   r2h,#0                        ; 3~
            mov.b   r2l,REG_DS                    ; 4~
            mov.w   r3,usp                        ; 3~, OSTCBCur->OSTCBStkPtr = USP
            mov.w   [r0],r3                       ; 3~
            mov.w   [r0+2],r2                     ; 3~

            mov     r0,#(_OSTCBHighRdy) and 0ffffh; 4~
            mov.b   REG_ES,#seg(_OSTCBHighRdy)    ; 4~
            mov.w   r2,[r0]                       ; 3~, R3:R2  = OSTCBHighRdy
            mov.w   r3,[r0+2]                     ; 3~
            mov     r0,#(_OSTCBCur) and 0ffffh    ; 4~
            mov.b   REG_ES,#seg(_OSTCBCur)        ; 4~
            mov.w   [r0],r2                       ; 3~,
            mov.w   [r0+2],r3                     ; 3~

            mov.w   r0,r2                         ; 3~, ES:R0 = OSTCBHighRdy
            mov.b   REG_ES,r3l                    ; 4~
            mov.w   r2,[r0]                       ; 3~, R3:R2 = OSTCBHighRdy->OSTCBStkPtr
            mov.w   r3,[r0+2]                     ; 3~

            mov.w   usp,r2                        ; 3~, DS:USP = OSTCBHighRdy->OSTCBStkPtr
            mov.b   REG_DS,r3l                    ; 4~
            clr     BIT_SSEL0                     ; 4~     SSEL.0 = 0 (R0 uses DS register)

            popu    r2                            ; 5~, Move PCL from US to SS
            push    r2                            ; 5~
            popu    r2                            ; 5~, Move PCH from US to SS
            push    r2                            ; 5~
            popu    r2                            ; 5~, Move PSW from US to SS
            push    r2                            ; 5~
            popu.b  REG_SSEL                      ; 5~, Get SSEL
            popu.b  REG_ES                        ; 5~, Get ES
            popu    r0,r1,r2,r3,r4,r5,r6          ;18~, Load new task's context
            reti                                  ;10~, Return to new task

⌨️ 快捷键说明

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