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

📄 mcs251.c

📁 基于80251的UCOS II源代码,仅供参考和学习.
💻 C
📖 第 1 页 / 共 2 页
字号:
    asm("      PUSH   WR26                         ; 4~                                              \n");
    asm("      PUSH   WR28                         ; 4~                                              \n");
    asm("      PUSH   WR30                         ; 4~                                              \n");
    asm("      MOV    WR4,00:_OSTCBCur             ; 3~ Save current task's stack pointer in task TCB\n");
    asm("      MOV    DR0,SPX                      ; 2~    (only lower 16 bits)                      \n");
    asm("      MOV    @WR4,WR2                     ; 3~                                              \n");
    asm("      MOV    WR4,00:_OSTCBHighRdy         ; 2~ Get pointer to highest priority top of stack \n");
    asm("      MOV    00:_OSTCBCur,WR4             ; 3~ OSTCBCur = OSTCBHighRdy                      \n");
    asm("      MOV    WR2,@WR4                     ; 3~ Get stack pointer of highest priority task   \n");
    asm("      XRL    WR0,WR0                      ; 2~    (only lower 16 bits)                      \n");
    asm("      MOV    SPX,DR0                      ; 2~                                              \n");
    asm("      POP    WR30                         ; 4~    Restore WR0 to WR30                       \n");
    asm("      POP    WR28                         ; 4~                                              \n");
    asm("      POP    WR26                         ; 4~                                              \n");
    asm("      POP    WR24                         ; 4~                                              \n");
    asm("      POP    WR22                         ; 4~                                              \n");
    asm("      POP    WR20                         ; 4~                                              \n");
    asm("      POP    WR18                         ; 4~                                              \n");
    asm("      POP    WR16                         ; 4~                                              \n");
    asm("      POP    WR14                         ; 4~                                              \n");
    asm("      POP    WR12                         ; 4~                                              \n");
    asm("      POP    WR10                         ; 4~                                              \n");
    asm("      POP    WR8                          ; 4~                                              \n");
    asm("      POP    WR6                          ; 4~                                              \n");
    asm("      POP    WR4                          ; 4~                                              \n");
    asm("      POP    WR2                          ; 4~                                              \n");
    asm("      POP    WR0                          ; 4~                                              \n");
    asm("      POP    PSW                          ; 3~ Restore Program Status Words                 \n");
    asm("      POP    PSW1                         ; 3~                                              \n");
    asm("      RETI                                ;12~ Start executing high priority task code      \n");
}

/*$PAGE*/
/*
**********************************************************************************************************
*                                PERFORM A CONTEXT SWITCH (From an ISR)
*                                         void OSIntCtxSw(void)
*
* Total execution time : 109 machine cycles
**********************************************************************************************************
*/

void OSIntCtxSw(void)
{
    asm("      EXTERN _OSTCBHighRdy                                                                  \n");
    asm("      EXTERN _OSTCBCur                                                                      \n");
    asm("                                                                                            \n");
    asm("      DEC    SPX,#4                       ; 4~ Ignore 'CALL' to OSIntExit and OSIntCtxSw    \n");
    asm("      MOV    WR4,00:_OSTCBCur             ; 3~ Save current task's stack pointer in task TCB\n");
    asm("      MOV    DR0,SPX                      ; 2~                                              \n");
    asm("      MOV    @WR4,WR2                     ; 3~                                              \n");
    asm("      MOV    WR4,00:_OSTCBHighRdy         ; 3~ Get pointer to highest priority top of stack \n");
    asm("      MOV    00:_OSTCBCur,WR4             ; 3~ OSTCBCur = OSTCBHighRdy                      \n");
    asm("      MOV    WR2,@WR4                     ; 3~ SPX = OSTCBHighRdy->OSTCBStkPtr              \n");
    asm("      XRL    WR0,WR0                      ; 2~    (only lower 16 bits)                      \n");
    asm("      MOV    SPX,DR0                      ; 2~                                              \n");
    asm("      POP    WR30                         ; 2~    Restore WR0 to WR30                       \n");
    asm("      POP    WR28                         ; 4~                                              \n");
    asm("      POP    WR26                         ; 4~                                              \n");
    asm("      POP    WR24                         ; 4~                                              \n");
    asm("      POP    WR22                         ; 4~                                              \n");
    asm("      POP    WR20                         ; 4~                                              \n");
    asm("      POP    WR18                         ; 4~                                              \n");
    asm("      POP    WR16                         ; 4~                                              \n");
    asm("      POP    WR14                         ; 4~                                              \n");
    asm("      POP    WR12                         ; 4~                                              \n");
    asm("      POP    WR10                         ; 4~                                              \n");
    asm("      POP    WR8                          ; 4~                                              \n");
    asm("      POP    WR6                          ; 4~                                              \n");
    asm("      POP    WR4                          ; 4~                                              \n");
    asm("      POP    WR2                          ; 4~                                              \n");
    asm("      POP    WR0                          ; 4~                                              \n");
    asm("      POP    PSW                          ; 3~ Restore Program Status Words                 \n");
    asm("      POP    PSW1                         ; 3~                                              \n");
    asm("      RETI                                ;12~ Start executing high priority task code      \n");
}

/*$PAGE*/
/*
**********************************************************************************************************
*                                            HANDLE TICK ISR
*                                          void OSTickISR(void)
*
* Total execution time : 179 machine cycles +
*                        OSIntEnter()       +
*                        OSTimeTick()       +
*                        OSIntExit()
* Notes: 1) HPT means High 'Priority Task'
**********************************************************************************************************
*/

void OSTickISR(void)
{
    asm("      EXTERN $OSIntEnter                                                                    \n");
    asm("      EXTERN $OSIntExit                                                                     \n");
    asm("      EXTERN $OSTimeTick                                                                    \n");
    asm("                                                                                            \n");
    asm("      PUSH   PSW1                         ; 3~ Save context of current task                 \n");
    asm("      PUSH   PSW                          ; 3~                                              \n");
    asm("      PUSH   WR0                          ; 4~    Save WR0 to WR30                          \n");
    asm("      PUSH   WR2                          ; 4~                                              \n");
    asm("      PUSH   WR4                          ; 4~                                              \n");
    asm("      PUSH   WR6                          ; 4~                                              \n");
    asm("      PUSH   WR8                          ; 4~                                              \n");
    asm("      PUSH   WR10                         ; 4~                                              \n");
    asm("      PUSH   WR12                         ; 4~                                              \n");
    asm("      PUSH   WR14                         ; 4~                                              \n");
    asm("      PUSH   WR16                         ; 4~                                              \n");
    asm("      PUSH   WR18                         ; 4~                                              \n");
    asm("      PUSH   WR20                         ; 4~                                              \n");
    asm("      PUSH   WR22                         ; 4~                                              \n");
    asm("      PUSH   WR24                         ; 4~                                              \n");
    asm("      PUSH   WR26                         ; 4~                                              \n");
    asm("      PUSH   WR28                         ; 4~                                              \n");
    asm("      PUSH   WR30                         ; 4~                                              \n");
    asm("      LCALL  $OSIntEnter                  ; 9~ Notify uC/OS about ISR                       \n");
    asm("      LCALL  $OSTimeTick                  ; 9~ Handle system tick                           \n");
    asm("      LCALL  $OSIntExit                   ; 9~ Exit through scheduler if HPT is ready       \n");
    asm("      POP    WR30                         ; 4~ Restore WR0 to WR30                          \n");
    asm("      POP    WR28                         ; 4~                                              \n");
    asm("      POP    WR26                         ; 4~                                              \n");
    asm("      POP    WR24                         ; 4~                                              \n");
    asm("      POP    WR22                         ; 4~                                              \n");
    asm("      POP    WR20                         ; 4~                                              \n");
    asm("      POP    WR18                         ; 4~                                              \n");
    asm("      POP    WR16                         ; 4~                                              \n");
    asm("      POP    WR14                         ; 4~                                              \n");
    asm("      POP    WR12                         ; 4~                                              \n");
    asm("      POP    WR10                         ; 4~                                              \n");
    asm("      POP    WR8                          ; 4~                                              \n");
    asm("      POP    WR6                          ; 4~                                              \n");
    asm("      POP    WR4                          ; 4~                                              \n");
    asm("      POP    WR2                          ; 4~                                              \n");
    asm("      POP    WR0                          ; 4~                                              \n");
    asm("      POP    PSW                          ; 3~ Restore Program Status Words                 \n");
    asm("      POP    PSW1                         ; 3~                                              \n");
    asm("      RETI                                ;12~ Start executing high priority task code      \n");
}

⌨️ 快捷键说明

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