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

📄 os_mbox.s79

📁 ARM仿真案例
💻 S79
📖 第 1 页 / 共 4 页
字号:
        MOVS     R4,R0
        MOVS     R5,R1
        MOVS     R6,R2
//  391 #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
//  392     OS_CPU_SR  cpu_sr;
//  393 #endif    
//  394     
//  395     
//  396 #if OS_ARG_CHK_EN > 0
//  397     if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
        CMP      R4,#+0
        BNE      ??OSMboxPostOpt_0
//  398         return (OS_ERR_PEVENT_NULL);
        MOVS     R0,#+4
        B        ??OSMboxPostOpt_1
//  399     }
//  400     if (msg == (void *)0) {                           /* Make sure we are not posting a NULL pointer   */
??OSMboxPostOpt_0:
        CMP      R5,#+0
        BNE      ??OSMboxPostOpt_2
//  401         return (OS_ERR_POST_NULL_PTR);
        MOVS     R0,#+3
        B        ??OSMboxPostOpt_1
//  402     }
//  403 #endif
//  404     if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {  /* Validate event block type                     */
??OSMboxPostOpt_2:
        LDRB     R0,[R4, #+0]
        CMP      R0,#+1
        BEQ      ??OSMboxPostOpt_3
//  405         return (OS_ERR_EVENT_TYPE);
        MOVS     R0,#+1
        B        ??OSMboxPostOpt_1
//  406     }
//  407     OS_ENTER_CRITICAL();
??OSMboxPostOpt_3:
        _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
        MOVS     R7,R0
//  408     if (pevent->OSEventGrp != 0x00) {                 /* See if any task pending on mailbox            */
        LDRB     R0,[R4, #+1]
        CMP      R0,#+0
        BEQ      ??OSMboxPostOpt_4
//  409         if ((opt & OS_POST_OPT_BROADCAST) != 0x00) {  /* Do we need to post msg to ALL waiting tasks ? */
        LSLS     R0,R6,#+31
        BPL      ??OSMboxPostOpt_5
//  410             while (pevent->OSEventGrp != 0x00) {      /* Yes, Post to ALL tasks waiting on mailbox     */           
//  411                 OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX);    
??OSMboxPostOpt_6:
        MOVS     R2,#+2
        MOVS     R1,R5
        MOVS     R0,R4
        _BLF     OS_EventTaskRdy,??OS_EventTaskRdy??rT
//  412             }
        LDRB     R0,[R4, #+1]
        CMP      R0,#+0
        BNE      ??OSMboxPostOpt_6
        B        ??OSMboxPostOpt_7
//  413         } else {
//  414             OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX);    /* No,  Post to HPT waiting on mbox         */
??OSMboxPostOpt_5:
        MOVS     R2,#+2
        MOVS     R1,R5
        MOVS     R0,R4
        _BLF     OS_EventTaskRdy,??OS_EventTaskRdy??rT
//  415         }
//  416         OS_EXIT_CRITICAL();
??OSMboxPostOpt_7:
        MOVS     R0,R7
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  417         OS_Sched();                                        /* Find highest priority task ready to run  */
        _BLF     OS_Sched,??OS_Sched??rT
//  418         return (OS_NO_ERR);
        B.N      ??OSMboxPostOpt_8
//  419     }
//  420     if (pevent->OSEventPtr != (void *)0) {            /* Make sure mailbox doesn't already have a msg  */
??OSMboxPostOpt_4:
        LDR      R0,[R4, #+4]
        CMP      R0,#+0
        BEQ      ??OSMboxPostOpt_9
//  421         OS_EXIT_CRITICAL();
        MOVS     R0,R7
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  422         return (OS_MBOX_FULL);
        MOVS     R0,#+20
        B        ??OSMboxPostOpt_1
//  423     }
//  424     pevent->OSEventPtr = msg;                         /* Place message in mailbox                      */
??OSMboxPostOpt_9:
        STR      R5,[R4, #+4]
//  425     OS_EXIT_CRITICAL();
        MOVS     R0,R7
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  426     return (OS_NO_ERR);
??OSMboxPostOpt_8:
        MOVS     R0,#+0
??OSMboxPostOpt_1:
        POP      {R4-R7}
        POP      {R1}
        BX       R1               ;; return
        CFI EndBlock cfiBlock11
//  427 }

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock12 Using cfiCommon0
        CFI NoFunction
        ARM
??OSMboxQuery??rA:
        ADD      R12,PC,#+1
        BX       R12
        CFI EndBlock cfiBlock12
        REQUIRE OSMboxQuery
//  428 #endif
//  429 
//  430 
//  431 /*
//  432 *********************************************************************************************************
//  433 *                                        QUERY A MESSAGE MAILBOX
//  434 *
//  435 * Description: This function obtains information about a message mailbox.
//  436 *
//  437 * Arguments  : pevent        is a pointer to the event control block associated with the desired mailbox
//  438 *
//  439 *              p_mbox_data   is a pointer to a structure that will contain information about the message
//  440 *                            mailbox.
//  441 *
//  442 * Returns    : OS_NO_ERR           The call was successful and the message was sent
//  443 *              OS_ERR_EVENT_TYPE   If you are attempting to obtain data from a non mailbox.
//  444 *              OS_ERR_PEVENT_NULL  If 'pevent' is a NULL pointer
//  445 *********************************************************************************************************
//  446 */
//  447 
//  448 #if OS_MBOX_QUERY_EN > 0

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock13 Using cfiCommon1
        CFI Function OSMboxQuery
        THUMB
//  449 INT8U  OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *p_mbox_data)
//  450 {
OSMboxQuery:
        PUSH     {R4,R5,LR}
        CFI ?RET Frame(CFA, -4)
        CFI R5 Frame(CFA, -8)
        CFI R4 Frame(CFA, -12)
        CFI CFA R13+12
        MOVS     R4,R0
        MOVS     R5,R1
//  451 #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
//  452     OS_CPU_SR  cpu_sr;
//  453 #endif    
//  454     INT8U     *psrc;
//  455     INT8U     *pdest;
//  456 
//  457 
//  458 #if OS_ARG_CHK_EN > 0
//  459     if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
        CMP      R4,#+0
        BNE      ??OSMboxQuery_0
//  460         return (OS_ERR_PEVENT_NULL);
        MOVS     R0,#+4
        B        ??OSMboxQuery_1
//  461     }
//  462 #endif
//  463     if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {       /* Validate event block type                */
??OSMboxQuery_0:
        LDRB     R0,[R4, #+0]
        CMP      R0,#+1
        BEQ      ??OSMboxQuery_2
//  464         return (OS_ERR_EVENT_TYPE);
        MOVS     R0,#+1
        B        ??OSMboxQuery_1
//  465     }
//  466     OS_ENTER_CRITICAL();
??OSMboxQuery_2:
        _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
//  467     p_mbox_data->OSEventGrp = pevent->OSEventGrp;          /* Copy message mailbox wait list           */
        LDRB     R1,[R4, #+1]
        STRB     R1,[R5, #+12]
//  468     psrc                    = &pevent->OSEventTbl[0];
        MOVS     R1,R4
//  469     pdest                   = &p_mbox_data->OSEventTbl[0];
        ADDS     R2,R5,#+4
//  470 
//  471 #if OS_EVENT_TBL_SIZE > 0
//  472     *pdest++ = *psrc++;
        LDRB     R3,[R1, #+8]
        STRB     R3,[R2, #+0]
//  473 #endif
//  474 
//  475 #if OS_EVENT_TBL_SIZE > 1
//  476     *pdest++ = *psrc++;
        LDRB     R3,[R1, #+9]
        STRB     R3,[R2, #+1]
//  477 #endif
//  478 
//  479 #if OS_EVENT_TBL_SIZE > 2
//  480     *pdest++ = *psrc++;
        LDRB     R3,[R1, #+10]
        STRB     R3,[R2, #+2]
//  481 #endif
//  482 
//  483 #if OS_EVENT_TBL_SIZE > 3
//  484     *pdest++ = *psrc++;
        LDRB     R3,[R1, #+11]
        STRB     R3,[R2, #+3]
//  485 #endif
//  486 
//  487 #if OS_EVENT_TBL_SIZE > 4
//  488     *pdest++ = *psrc++;
        LDRB     R3,[R1, #+12]
        STRB     R3,[R2, #+4]
//  489 #endif
//  490 
//  491 #if OS_EVENT_TBL_SIZE > 5
//  492     *pdest++ = *psrc++;
        LDRB     R3,[R1, #+13]
        STRB     R3,[R2, #+5]
        ADDS     R1,R1,#+14
        ADDS     R2,R2,#+6
//  493 #endif
//  494 
//  495 #if OS_EVENT_TBL_SIZE > 6
//  496     *pdest++ = *psrc++;
        LDRB     R3,[R1, #+0]
        STRB     R3,[R2, #+0]
//  497 #endif
//  498 
//  499 #if OS_EVENT_TBL_SIZE > 7
//  500     *pdest   = *psrc;
        LDRB     R1,[R1, #+1]
        STRB     R1,[R2, #+1]
//  501 #endif
//  502     p_mbox_data->OSMsg = pevent->OSEventPtr;               /* Get message from mailbox                 */
        LDR      R1,[R4, #+4]
        STR      R1,[R5, #+0]
//  503     OS_EXIT_CRITICAL();
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  504     return (OS_NO_ERR);
        MOVS     R0,#+0
??OSMboxQuery_1:
        POP      {R4,R5}
        POP      {R1}
        BX       R1               ;; return
        CFI EndBlock cfiBlock13
//  505 }

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock14 Using cfiCommon1
        CFI NoFunction
        THUMB
??OS_CPU_SR_Save??rT:
        LDR      R3,??Subroutine7_0  ;; OS_CPU_SR_Save
        BX       R3
        DATA
??Subroutine7_0:
        DC32     OS_CPU_SR_Save
        CFI EndBlock cfiBlock14

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock15 Using cfiCommon1
        CFI NoFunction
        THUMB
??OS_CPU_SR_Restore??rT:
        LDR      R3,??Subroutine8_0  ;; OS_CPU_SR_Restore
        BX       R3
        DATA
??Subroutine8_0:
        DC32     OS_CPU_SR_Restore
        CFI EndBlock cfiBlock15

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock16 Using cfiCommon1
        CFI NoFunction
        THUMB
??OS_EventWaitListInit??rT:
        LDR      R3,??Subroutine9_0  ;; OS_EventWaitListInit
        BX       R3
        DATA
??Subroutine9_0:
        DC32     OS_EventWaitListInit
        CFI EndBlock cfiBlock16

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock17 Using cfiCommon1
        CFI NoFunction
        THUMB
??OS_EventTaskRdy??rT:
        LDR      R3,??Subroutine10_0  ;; OS_EventTaskRdy
        BX       R3
        DATA
??Subroutine10_0:
        DC32     OS_EventTaskRdy
        CFI EndBlock cfiBlock17

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock18 Using cfiCommon1
        CFI NoFunction
        THUMB
??OS_Sched??rT:
        LDR      R3,??Subroutine11_0  ;; OS_Sched
        BX       R3
        DATA
??Subroutine11_0:
        DC32     OS_Sched
        CFI EndBlock cfiBlock18

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock19 Using cfiCommon1
        CFI NoFunction
        THUMB
??OS_EventTaskWait??rT:
        LDR      R3,??Subroutine12_0  ;; OS_EventTaskWait
        BX       R3
        DATA
??Subroutine12_0:
        DC32     OS_EventTaskWait
        CFI EndBlock cfiBlock19

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock20 Using cfiCommon1
        CFI NoFunction
        THUMB
??OS_EventTO??rT:
        LDR      R3,??Subroutine13_0  ;; OS_EventTO
        BX       R3
        DATA
??Subroutine13_0:
        DC32     OS_EventTO
        CFI EndBlock cfiBlock20

        END
//  506 #endif                                                     /* OS_MBOX_QUERY_EN                         */
//  507 #endif                                                     /* OS_MBOX_EN                               */
// 
// 920 bytes in segment CODE
// 
// 808 bytes of CODE memory (+ 112 bytes shared)
//
//Errors: none
//Warnings: none

⌨️ 快捷键说明

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