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

📄 os_cpu_a.s

📁 μC/OS-II and the Xilinx MicroBlaze
💻 S
📖 第 1 页 / 共 3 页
字号:
*                                        + 0x20     R9*                                        + 0x24     R10*                                        + 0x28     R11*                                        + 0x2C     R12*                                        + 0x30     R13*                                        + 0x34     R14*                                        + 0x38     R15*                                        + 0x3C     R17*                                        + 0x40     R18*                                        + 0x44     R19*                                        + 0x48     R20*                                        + 0x4C     R21*                                        + 0x50     R22*                                        + 0x54     R23*                                        + 0x58     R24*                                        + 0x5C     R25*                                        + 0x60     R26*                                        + 0x64     R27*                                        + 0x68     R28*                                        + 0x6C     R29*                                        + 0x70     R30*                                        + 0x74     R31                 (HIGH MEMORY)** Note(s)    : 1) If the task frame was saved by OSCtxSw(), IE would be set to 0.*                 If the task frame was saved by an ISR,    IE would be set to 1.**********************************************************************************************************/OSIntCtxSw:    BRLID   r15, OSTaskSwHook           /* Call OSTaskSwHook()                                         */    AND     r0,  r0, r0                 /* NO-OP                                                       */    LBUI    r3,  r0, OSPrioHighRdy      /* OSPrioCur = OSPrioHighRdy                                   */    SBI     r3,  r0, OSPrioCur    LWI     r3,  r0, OSTCBHighRdy       /* OSTCBCur  = OSTCBHighRdy                                    */              SWI     r3,  r0, OSTCBCur    LW      r1,  r0, r3                 /* SP = OSTCBHighRdy->OSTCBStkPtr                              */        LWI     r31, r1, STK_OFFSET_R31     /* **************** RESTORE NEW TASK'S CONTEXT *************** */    LWI     r30, r1, STK_OFFSET_R30    LWI     r29, r1, STK_OFFSET_R29    LWI     r28, r1, STK_OFFSET_R28    LWI     r27, r1, STK_OFFSET_R27    LWI     r26, r1, STK_OFFSET_R26    LWI     r25, r1, STK_OFFSET_R25    LWI     r24, r1, STK_OFFSET_R24    LWI     r23, r1, STK_OFFSET_R23    LWI     r22, r1, STK_OFFSET_R22    LWI     r21, r1, STK_OFFSET_R21    LWI     r20, r1, STK_OFFSET_R20    LWI     r19, r1, STK_OFFSET_R19    LWI     r18, r1, STK_OFFSET_R18    LWI     r17, r1, STK_OFFSET_R17           LWI     r15, r1, STK_OFFSET_R15    LWI     r14, r1, STK_OFFSET_R14    LWI     r13, r1, STK_OFFSET_R13    LWI     r12, r1, STK_OFFSET_R12    LWI     r11, r1, STK_OFFSET_R11    LWI     r10, r1, STK_OFFSET_R10    LWI     r9,  r1, STK_OFFSET_R09    LWI     r8,  r1, STK_OFFSET_R08    LWI     r7,  r1, STK_OFFSET_R07    LWI     r6,  r1, STK_OFFSET_R06    LWI     r5,  r1, STK_OFFSET_R05    LWI     r4,  r1, STK_OFFSET_R04    LWI     r2,  r1, STK_OFFSET_R02        LWI     r3,  r1, STK_OFFSET_RMSR    /* Get the saved RMSR                                          */    ANDI    r3,  r3, CPU_IE_BIT         /* See if IE is 0 (Saved by OSCtxSw()) or 1 (Saved by ISR)     */    BNEI    r3,  OSIntCtxSw_SavedByISR  /* Branch if ISR saved context                                 */                                        /* *********** The context was saved by OSCtxSw() ************ */    LWI     r3,  r1, STK_OFFSET_RMSR    /* Get the saved RMSR                                          */    MTS     RMSR,r3     LWI     r3,  r1, STK_OFFSET_R03     /* Restore R3 (was used a scratchpad register for RMSR)        */    ADDIK    r1,  r1, STK_CTX_SIZE      /* Clean up the stack (deallocate storage)                     */                       RTSD    r15, 8                      /* Context was saved by OSCtxSw()                              */    AND     r0,  r0, r0                 /* NO-OP                                                       */OSIntCtxSw_SavedByISR:                  /* ************ The context was saved by an ISR ************** */    LWI     r3,  r1, STK_OFFSET_RMSR    /* Get the saved RMSR                                          */    ANDNI   r3,  r3, CPU_IE_BIT         /* Clear the IE bit (It will be set by the return from INT.)   */    MTS     RMSR,r3     LWI     r3,  r1, STK_OFFSET_R03     /* Restore R3 (was used a scratchpad register for RMSR)        */    ADDIK   r1,  r1, STK_CTX_SIZE       /* Clean up the stack (deallocate storage)                     */                       RTID    r14, 0                      /* Context was saved by ISR, return address is in R14          */    AND     r0,  r0, r0                 /* NO-OP                                                       *//***********************************************************************************************************                                             OS_CPU_ISR()** Description: This routine is intended to be the target of the Interrupt processing functionality that *              occurs when the MicroBlaze is interrupted. The address, 'XOSExternalInterruptHandler', is *              used as the branch destination in the code that is executed at addresses 0x10 and 0x14 in *              the MicroBlaze vector table assuming that the vector table is in RAM* *              The XPS interrupt vector is replaced by OS_CPU_ISR() by executing the code from a C function:**                 *(INT32U *)0x00000010 = 0xB0000000 | ((INT32U)OS_CPU_ISR >> 16);*                 *(INT32U *)0x00000014 = 0xB8080000 | ((INT32U)OS_CPU_ISR & 0x0000FFFF);**              The interrupted task context is saved onto its stack as follows:**              OSTCBCur->OSTCBStkPtr     + 0x00     RMSR   (See Note 1) (LOW Memory)*                                        + 0x04     R2*                                        + 0x08     R3*                                        + 0x0C     R4*                                        + 0x10     R5     (p_arg passed to task)*                                        + 0x14     R6*                                        + 0x18     R7*                                        + 0x1C     R8*                                        + 0x20     R9*                                        + 0x24     R10*                                        + 0x28     R11*                                        + 0x2C     R12*                                        + 0x30     R13*                                        + 0x34     R14*                                        + 0x38     R15*                                        + 0x3C     R17*                                        + 0x40     R18*                                        + 0x44     R19*                                        + 0x48     R20*                                        + 0x4C     R21*                                        + 0x50     R22*                                        + 0x54     R23*                                        + 0x58     R24*                                        + 0x5C     R25*                                        + 0x60     R26*                                        + 0x64     R27*                                        + 0x68     R28*                                        + 0x6C     R29*                                        + 0x70     R30*                                        + 0x74     R31                 (HIGH MEMORY)** Note(s)    : 1) The IE bit is saved onto the stack 'set' since the code must return to the interrupted*                 task with interrupts enabled.**********************************************************************************************************/_interrupt_handler:OS_CPU_ISR:                                             /* ********** SAVE INTERRUPTED TASK'S CONTEXT *********** */    ADDIK    r1,  r1, -STK_CTX_SIZE          /* Allocate storage for saving registers onto stack       */    SWI     r2,  r1,  STK_OFFSET_R02             SWI     r3,  r1,  STK_OFFSET_R03    SWI     r4,  r1,  STK_OFFSET_R04    SWI     r5,  r1,  STK_OFFSET_R05    SWI     r6,  r1,  STK_OFFSET_R06    SWI     r7,  r1,  STK_OFFSET_R07    SWI     r8,  r1,  STK_OFFSET_R08    SWI     r9,  r1,  STK_OFFSET_R09    SWI     r10, r1,  STK_OFFSET_R10    SWI     r11, r1,  STK_OFFSET_R11    SWI     r12, r1,  STK_OFFSET_R12    SWI     r13, r1,  STK_OFFSET_R13    SWI     r14, r1,  STK_OFFSET_R14    SWI     r15, r1,  STK_OFFSET_R15    SWI     r17, r1,  STK_OFFSET_R17              SWI     r18, r1,  STK_OFFSET_R18    SWI     r19, r1,  STK_OFFSET_R19    SWI     r20, r1,  STK_OFFSET_R20    SWI     r21, r1,  STK_OFFSET_R21    SWI     r22, r1,  STK_OFFSET_R22    SWI     r23, r1,  STK_OFFSET_R23    SWI     r24, r1,  STK_OFFSET_R24    SWI     r25, r1,  STK_OFFSET_R25    SWI     r26, r1,  STK_OFFSET_R26    SWI     r27, r1,  STK_OFFSET_R27    SWI     r28, r1,  STK_OFFSET_R28    SWI     r29, r1,  STK_OFFSET_R29    SWI     r30, r1,  STK_OFFSET_R30    SWI     r31, r1,  STK_OFFSET_R31    MFS     r3,  RMSR                        /* save the MSR                                           */    ORI     r3,  r3, CPU_IE_BIT              /* Set IE to 1 to return to interrupted task with INT en. */    SWI     r3,  r1, STK_OFFSET_RMSR         /* MSR is at top of frame                                 */    LBUI    r3,  r0, OSIntNesting            /* if (OSIntNesting == 0) {                               */    BNEI    r3,  OS_CPU_ISR_1    LWI     r3,  r0, OSTCBCur                /*     OSTCBCur->OSTCBStkPtr = SP                         */    SW      r1,  r0, r3                      /* }                                                      */OS_CPU_ISR_1:    LBUI    r3,  r0, OSIntNesting    ADDIK   r3,  r3, 1                       /* OSIntNesting++;                                        */    SBI     r3,  r0, OSIntNesting    BRLID   r15, BSP_IntHandler              /* Call the provided C level interrupt handler            */    AND     r0,  r0, r0                      /* NO-OP                                                  */        BRLID   r15, OSIntExit                   /* OSIntExit()                                            */    AND     r0,  r0, r0                      /* NO-OP                                                  */    LWI     r31, r1, STK_OFFSET_R31          /* ********* RESTORE INTERRUPTED TASK'S CONTEXT ********* */    LWI     r30, r1, STK_OFFSET_R30    LWI     r29, r1, STK_OFFSET_R29    LWI     r28, r1, STK_OFFSET_R28    LWI     r27, r1, STK_OFFSET_R27    LWI     r26, r1, STK_OFFSET_R26    LWI     r25, r1, STK_OFFSET_R25    LWI     r24, r1, STK_OFFSET_R24    LWI     r23, r1, STK_OFFSET_R23    LWI     r22, r1, STK_OFFSET_R22    LWI     r21, r1, STK_OFFSET_R21    LWI     r20, r1, STK_OFFSET_R20    LWI     r19, r1, STK_OFFSET_R19    LWI     r18, r1, STK_OFFSET_R18    LWI     r17, r1, STK_OFFSET_R17          LWI     r15, r1, STK_OFFSET_R15    LWI     r14, r1, STK_OFFSET_R14    LWI     r13, r1, STK_OFFSET_R13    LWI     r12, r1, STK_OFFSET_R12    LWI     r11, r1, STK_OFFSET_R11    LWI     r10, r1, STK_OFFSET_R10    LWI     r9,  r1, STK_OFFSET_R09    LWI     r8,  r1, STK_OFFSET_R08    LWI     r7,  r1, STK_OFFSET_R07    LWI     r6,  r1, STK_OFFSET_R06    LWI     r5,  r1, STK_OFFSET_R05    LWI     r4,  r1, STK_OFFSET_R04    LWI     r2,  r1, STK_OFFSET_R02        LWI     r3,  r1, STK_OFFSET_RMSR         /* Get RMSR                                               */    ANDNI   r3,  r3, CPU_IE_BIT              /* Clear IE to prevent interrupts until stack is cleaned  */    MTS     RMSR,r3     LWI     r3,  r1, STK_OFFSET_R03          /* Restore R3 (was used a scratchpad register for RMSR)   */    ADDIK   r1,  r1, STK_CTX_SIZE            /* Clean up the stack                                     */                       RTID    r14, 0                           /* Return from interrupt with interrupts enabled          */    AND     r0,  r0, r0                      /* NO-OP                                                  */

⌨️ 快捷键说明

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