os_sem.lis

来自「将本站的UCOSFORAVR128V276版本升级到了280版」· LIS 代码 · 共 1,276 行 · 第 1/5 页

LIS
1,276
字号
 0336           ; 
 0336           ; 
 0336           ; 
 0336           ; #if OS_ARG_CHK_EN > 0
 0336           ;     if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
 0336           ;         return (OS_ERR_PEVENT_NULL);
 0336           ;     }
 0336           ;     if (p_sem_data == (OS_SEM_DATA *)0) {                  /* Validate 'p_sem_data'                    */
 0336           ;         return (OS_ERR_PDATA_NULL);
 0336           ;     }
 0336           ; #endif
 0336           ;     if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {        /* Validate event block type                */
 0336 EA85              ldd R30,y+10
 0338 FB85              ldd R31,y+11
 033A 8081              ldd R24,z+0
 033C 8330              cpi R24,3
 033E 11F0              breq L49
 0340                   .dbline 415
 0340                   .dbline 416
 0340           ;         return (OS_ERR_EVENT_TYPE);
 0340 01E0              ldi R16,1
 0342 26C0              xjmp L48
 0344           L49:
 0344                   .dbline 418
 0344           ;     }
 0344           ;     OS_ENTER_CRITICAL();
 0344 0E940000          xcall _OS_CPU_SR_Save
 0348 402F              mov R20,R16
 034A                   .dbline 419
 034A           ;     p_sem_data->OSEventGrp = pevent->OSEventGrp;           /* Copy message mailbox wait list           */
 034A EA85              ldd R30,y+10
 034C FB85              ldd R31,y+11
 034E 2580              ldd R2,z+5
 0350 F701              movw R30,R14
 0352 2482              std z+4,R2
 0354                   .dbline 420
 0354           ;     psrc                   = &pevent->OSEventTbl[0];
 0354 8A85              ldd R24,y+10
 0356 9B85              ldd R25,y+11
 0358 0696              adiw R24,6
 035A 5C01              movw R10,R24
 035C                   .dbline 421
 035C           ;     pdest                  = &p_sem_data->OSEventTbl[0];
 035C B701              movw R22,R14
 035E 6E5F              subi R22,254  ; offset = 2
 0360 7F4F              sbci R23,255
 0362                   .dbline 422
 0362 CC24              clr R12
 0364 07C0              xjmp L54
 0366           L51:
 0366                   .dbline 422
 0366                   .dbline 423
 0366 F501              movw R30,R10
 0368 DB01              movw R26,R22
 036A 0190              ld R0,Z+
 036C 5F01              movw R10,R30
 036E 0D92              st X+,R0
 0370 BD01              movw R22,R26
 0372                   .dbline 424
 0372           L52:
 0372                   .dbline 422
 0372 C394              inc R12
 0374           L54:
 0374                   .dbline 422
 0374           ;     for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
 0374 8C2D              mov R24,R12
 0376 8230              cpi R24,2
 0378 B0F3              brlo L51
 037A                   .dbline 425
 037A           ;         *pdest++ = *psrc++;
 037A           ;     }
 037A           ;     p_sem_data->OSCnt = pevent->OSEventCnt;                /* Get semaphore count                      */
 037A EA85              ldd R30,y+10
 037C FB85              ldd R31,y+11
 037E 2380              ldd R2,z+3
 0380 3480              ldd R3,z+4
 0382 F701              movw R30,R14
 0384 3182              std z+1,R3
 0386 2082              std z+0,R2
 0388                   .dbline 426
 0388           ;     OS_EXIT_CRITICAL();
 0388 042F              mov R16,R20
 038A 0E940000          xcall _OS_CPU_SR_Restore
 038E                   .dbline 427
 038E           ;     return (OS_NO_ERR);
 038E 0027              clr R16
 0390                   .dbline -2
 0390           L48:
 0390 0E940000          xcall pop_gset5
 0394 2496              adiw R28,4
 0396                   .dbline 0 ; func end
 0396 0895              ret
 0398                   .dbsym r cpu_sr 20 c
 0398                   .dbsym r pdest 22 pc
 0398                   .dbsym r psrc 10 pc
 0398                   .dbsym r i 12 c
 0398                   .dbsym r p_sem_data 14 pS[os_sem_data]
 0398                   .dbsym l pevent 10 pS[os_event]
 0398                   .dbend
 0398                   .dbfunc e OSSemSet _OSSemSet fV
 0398           ;         cpu_sr -> R20
 0398           ;            err -> y+6
 0398           ;            cnt -> R22,R23
 0398           ;         pevent -> R10,R11
                        .even
 0398           _OSSemSet::
 0398 0E940000          xcall push_gset3
 039C B901              movw R22,R18
 039E 5801              movw R10,R16
 03A0                   .dbline -1
 03A0                   .dbline 458
 03A0           ; }
 03A0           ; #endif                                                     /* OS_SEM_QUERY_EN                          */
 03A0           ; 
 03A0           ; /*$PAGE*/
 03A0           ; /*
 03A0           ; *********************************************************************************************************
 03A0           ; *                                              SET SEMAPHORE
 03A0           ; *
 03A0           ; * Description: This function sets the semaphore count to the value specified as an argument.  Typically,
 03A0           ; *              this value would be 0.
 03A0           ; *
 03A0           ; *              You would typically use this function when a semaphore is used as a signaling mechanism
 03A0           ; *              and, you want to reset the count value.
 03A0           ; *
 03A0           ; * Arguments  : pevent     is a pointer to the event control block
 03A0           ; *
 03A0           ; *              cnt        is the new value for the semaphore count.  You would pass 0 to reset the
 03A0           ; *                         semaphore count.
 03A0           ; *
 03A0           ; *              err        is a pointer to an error code returned by the function as follows:
 03A0           ; *
 03A0           ; *                            OS_NO_ERR            The call was successful and the semaphore value was set.
 03A0           ; *                            OS_ERR_EVENT_TYPE    If you didn't pass a pointer to a semaphore.
 03A0           ; *                            OS_ERR_PEVENT_NULL   If 'pevent' is a NULL pointer.
 03A0           ; *                            OS_ERR_TASK_WAITING  If tasks are waiting on the semaphore.
 03A0           ; *********************************************************************************************************
 03A0           ; */
 03A0           ; 
 03A0           ; #if OS_SEM_SET_EN > 0
 03A0           ; void  OSSemSet (OS_EVENT *pevent, INT16U cnt, INT8U *err)
 03A0           ; {
 03A0                   .dbline 460
 03A0           ; #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
 03A0           ;     OS_CPU_SR  cpu_sr = 0;
 03A0 4427              clr R20
 03A2                   .dbline 474
 03A2           ; #endif
 03A2           ; 
 03A2           ; 
 03A2           ; 
 03A2           ; #if OS_ARG_CHK_EN > 0
 03A2           ;     if (err == (INT8U *)0) {                          /* Validate 'err'                                */
 03A2           ;         return;
 03A2           ;     }
 03A2           ;     if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
 03A2           ;         *err = OS_ERR_PEVENT_NULL;
 03A2           ;         return;
 03A2           ;     }
 03A2           ; #endif
 03A2           ;     if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
 03A2 F501              movw R30,R10
 03A4 8081              ldd R24,z+0
 03A6 8330              cpi R24,3
 03A8 29F0              breq L56
 03AA                   .dbline 474
 03AA                   .dbline 475
 03AA           ;         *err = OS_ERR_EVENT_TYPE;
 03AA 81E0              ldi R24,1
 03AC EE81              ldd R30,y+6
 03AE FF81              ldd R31,y+7
 03B0 8083              std z+0,R24
 03B2                   .dbline 476
 03B2           ;         return;
 03B2 21C0              xjmp L55
 03B4           L56:
 03B4                   .dbline 478
 03B4           ;     }
 03B4           ;     OS_ENTER_CRITICAL();
 03B4 0E940000          xcall _OS_CPU_SR_Save
 03B8 402F              mov R20,R16
 03BA                   .dbline 479
 03BA           ;     *err = OS_NO_ERR;
 03BA 2224              clr R2
 03BC EE81              ldd R30,y+6
 03BE FF81              ldd R31,y+7
 03C0 2082              std z+0,R2
 03C2                   .dbline 480
 03C2           ;     if (pevent->OSEventCnt > 0) {                     /* See if semaphore already has a count          */
 03C2 F501              movw R30,R10
 03C4 2380              ldd R2,z+3
 03C6 3480              ldd R3,z+4
 03C8 2220              tst R2
 03CA 11F4              brne X7
 03CC 3320              tst R3
 03CE 21F0              breq L58
 03D0           X7:
 03D0                   .dbline 480
 03D0                   .dbline 481
 03D0           ;         pevent->OSEventCnt = cnt;                     /* Yes, set it to the new value specified.       */
 03D0 F501              movw R30,R10
 03D2 7483              std z+4,R23
 03D4 6383              std z+3,R22
 03D6                   .dbline 482
 03D6 0CC0              xjmp L59
 03D8           L58:
 03D8                   .dbline 482
 03D8           ;     } else {                                          /* No                                            */
 03D8                   .dbline 483
 03D8           ;         if (pevent->OSEventGrp == 0) {                /*      See if task(s) waiting?                  */
 03D8 F501              movw R30,R10
 03DA 2580              ldd R2,z+5
 03DC 2220              tst R2
 03DE 21F4              brne L60
 03E0                   .dbline 483
 03E0                   .dbline 484
 03E0           ;             pevent->OSEventCnt = cnt;                 /*      No, OK to set the value                  */
 03E0 F501              movw R30,R10
 03E2 7483              std z+4,R23
 03E4 6383              std z+3,R22
 03E6                   .dbline 485
 03E6 04C0              xjmp L61
 03E8           L60:
 03E8                   .dbline 485
 03E8           ;         } else {
 03E8                   .dbline 486
 03E8           ;             *err               = OS_ERR_TASK_WAITING;
 03E8 88E0              ldi R24,8
 03EA EE81              ldd R30,y+6
 03EC FF81              ldd R31,y+7
 03EE 8083              std z+0,R24
 03F0                   .dbline 487
 03F0           ;         }
 03F0           L61:
 03F0                   .dbline 488
 03F0           ;     }
 03F0           L59:
 03F0                   .dbline 489
 03F0           ;     OS_EXIT_CRITICAL();
 03F0 042F              mov R16,R20
 03F2 0E940000          xcall _OS_CPU_SR_Restore
 03F6                   .dbline -2
 03F6           L55:
 03F6 0E940000          xcall pop_gset3
 03FA                   .dbline 0 ; func end
 03FA 0895              ret
 03FC                   .dbsym r cpu_sr 20 c
 03FC                   .dbsym l err 6 pc
 03FC                   .dbsym r cnt 22 i
 03FC                   .dbsym r pevent 10 pS[os_event]
 03FC                   .dbend

⌨️ 快捷键说明

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