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

📄 os_sem.s79

📁 ARM仿真案例
💻 S79
📖 第 1 页 / 共 4 页
字号:
//  335         return (OS_ERR_EVENT_TYPE);
        MOVS     R0,#+1
        B        ??OSSemPost_1
//  336     }
//  337     OS_ENTER_CRITICAL();
??OSSemPost_2:
        _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
        MOVS     R5,R0
//  338     if (pevent->OSEventGrp != 0x00) {                      /* See if any task waiting for semaphore    */
        LDRB     R0,[R4, #+1]
        CMP      R0,#+0
        BEQ      ??OSSemPost_3
//  339         OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM);   /* Ready highest prio task waiting on event */
        MOVS     R2,#+1
        MOVS     R1,#+0
        MOVS     R0,R4
        _BLF     OS_EventTaskRdy,??OS_EventTaskRdy??rT
//  340         OS_EXIT_CRITICAL();
        MOVS     R0,R5
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  341         OS_Sched();                                        /* Find highest priority task ready to run  */
        _BLF     OS_Sched,??OS_Sched??rT
//  342         return (OS_NO_ERR);
??OSSemPost_4:
        MOVS     R0,#+0
        B        ??OSSemPost_1
//  343     }
//  344     if (pevent->OSEventCnt < 65535u) {                /* Make sure semaphore will not overflow         */
??OSSemPost_3:
        LDRH     R0,[R4, #+2]
        LDR      R1,??OSSemPost_5  ;; 0xffff
        CMP      R0,R1
        BEQ      ??OSSemPost_6
//  345         pevent->OSEventCnt++;                         /* Increment semaphore count to register event   */
        ADDS     R0,R0,#+1
        STRH     R0,[R4, #+2]
//  346         OS_EXIT_CRITICAL();
        MOVS     R0,R5
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  347         return (OS_NO_ERR);
        B.N      ??OSSemPost_4
//  348     }
//  349     OS_EXIT_CRITICAL();                               /* Semaphore value has reached its maximum       */
??OSSemPost_6:
        MOVS     R0,R5
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  350     return (OS_SEM_OVF);
        MOVS     R0,#+50
??OSSemPost_1:
        POP      {R4,R5}
        POP      {R1}
        BX       R1               ;; return
        Nop      
        DATA
??OSSemPost_5:
        DC32     0xffff
        CFI EndBlock cfiBlock9
//  351 }

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock10 Using cfiCommon0
        CFI NoFunction
        ARM
??OSSemQuery??rA:
        ADD      R12,PC,#+1
        BX       R12
        CFI EndBlock cfiBlock10
        REQUIRE OSSemQuery
//  352 /*$PAGE*/
//  353 /*
//  354 *********************************************************************************************************
//  355 *                                          QUERY A SEMAPHORE
//  356 *
//  357 * Description: This function obtains information about a semaphore
//  358 *
//  359 * Arguments  : pevent        is a pointer to the event control block associated with the desired
//  360 *                            semaphore
//  361 *
//  362 *              p_sem_data    is a pointer to a structure that will contain information about the
//  363 *                            semaphore.
//  364 *
//  365 * Returns    : OS_NO_ERR           The call was successful and the message was sent
//  366 *              OS_ERR_EVENT_TYPE   If you are attempting to obtain data from a non semaphore.
//  367 *              OS_ERR_PEVENT_NULL  If 'pevent' is a NULL pointer.
//  368 *********************************************************************************************************
//  369 */
//  370 
//  371 #if OS_SEM_QUERY_EN > 0

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock11 Using cfiCommon1
        CFI Function OSSemQuery
        THUMB
//  372 INT8U  OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *p_sem_data)
//  373 {
OSSemQuery:
        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
//  374 #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
//  375     OS_CPU_SR  cpu_sr;
//  376 #endif    
//  377     INT8U     *psrc;
//  378     INT8U     *pdest;
//  379 
//  380 
//  381 #if OS_ARG_CHK_EN > 0
//  382     if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
        CMP      R4,#+0
        BNE      ??OSSemQuery_0
//  383         return (OS_ERR_PEVENT_NULL);
        MOVS     R0,#+4
        B        ??OSSemQuery_1
//  384     }
//  385 #endif
//  386     if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {        /* Validate event block type                */
??OSSemQuery_0:
        LDRB     R0,[R4, #+0]
        CMP      R0,#+3
        BEQ      ??OSSemQuery_2
//  387         return (OS_ERR_EVENT_TYPE);
        MOVS     R0,#+1
        B        ??OSSemQuery_1
//  388     }
//  389     OS_ENTER_CRITICAL();
??OSSemQuery_2:
        _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
//  390     p_sem_data->OSEventGrp = pevent->OSEventGrp;           /* Copy message mailbox wait list           */
        LDRB     R1,[R4, #+1]
        STRB     R1,[R5, #+10]
//  391     psrc              = &pevent->OSEventTbl[0];
        MOVS     R1,R4
//  392     pdest             = &p_sem_data->OSEventTbl[0];
        ADDS     R2,R5,#+2
//  393 #if OS_EVENT_TBL_SIZE > 0
//  394     *pdest++ = *psrc++;
        LDRB     R3,[R1, #+8]
        STRB     R3,[R2, #+0]
//  395 #endif
//  396 
//  397 #if OS_EVENT_TBL_SIZE > 1
//  398     *pdest++ = *psrc++;
        LDRB     R3,[R1, #+9]
        STRB     R3,[R2, #+1]
//  399 #endif
//  400 
//  401 #if OS_EVENT_TBL_SIZE > 2
//  402     *pdest++ = *psrc++;
        LDRB     R3,[R1, #+10]
        STRB     R3,[R2, #+2]
//  403 #endif
//  404 
//  405 #if OS_EVENT_TBL_SIZE > 3
//  406     *pdest++ = *psrc++;
        LDRB     R3,[R1, #+11]
        STRB     R3,[R2, #+3]
//  407 #endif
//  408 
//  409 #if OS_EVENT_TBL_SIZE > 4
//  410     *pdest++ = *psrc++;
        LDRB     R3,[R1, #+12]
        STRB     R3,[R2, #+4]
//  411 #endif
//  412 
//  413 #if OS_EVENT_TBL_SIZE > 5
//  414     *pdest++ = *psrc++;
        LDRB     R3,[R1, #+13]
        STRB     R3,[R2, #+5]
        ADDS     R1,R1,#+14
        ADDS     R2,R2,#+6
//  415 #endif
//  416 
//  417 #if OS_EVENT_TBL_SIZE > 6
//  418     *pdest++ = *psrc++;
        LDRB     R3,[R1, #+0]
        STRB     R3,[R2, #+0]
//  419 #endif
//  420 
//  421 #if OS_EVENT_TBL_SIZE > 7
//  422     *pdest   = *psrc;
        LDRB     R1,[R1, #+1]
        STRB     R1,[R2, #+1]
//  423 #endif
//  424     p_sem_data->OSCnt      = pevent->OSEventCnt;           /* Get semaphore count                      */
        LDRH     R1,[R4, #+2]
        STRH     R1,[R5, #+0]
//  425     OS_EXIT_CRITICAL();
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  426     return (OS_NO_ERR);
        MOVS     R0,#+0
??OSSemQuery_1:
        POP      {R4,R5}
        POP      {R1}
        BX       R1               ;; return
        CFI EndBlock cfiBlock11
//  427 }

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

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

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

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

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

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

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

        END
//  428 #endif                                                     /* OS_SEM_QUERY_EN                          */
//  429 #endif                                                     /* OS_SEM_EN                                */
// 
// 776 bytes in segment CODE
// 
// 672 bytes of CODE memory (+ 104 bytes shared)
//
//Errors: none
//Warnings: none

⌨️ 快捷键说明

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