os_sem.lis

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

LIS
1,276
字号
 025E           ;     OS_EXIT_CRITICAL();
 025E 062F              mov R16,R22
 0260 0E940000          xcall _OS_CPU_SR_Restore
 0264                   .dbline 308
 0264           ;     OS_Sched();                                       /* Find next highest priority task ready         */
 0264 0E940000          xcall _OS_Sched
 0268                   .dbline 309
 0268           ;     OS_ENTER_CRITICAL();
 0268 0E940000          xcall _OS_CPU_SR_Save
 026C 602F              mov R22,R16
 026E                   .dbline 310
 026E           ;     if (OSTCBCur->OSTCBPendTO == TRUE) {              /* See if we timedout                            */
 026E E0910000          lds R30,_OSTCBCur
 0272 F0910100          lds R31,_OSTCBCur+1
 0276 8385              ldd R24,z+11
 0278 8130              cpi R24,1
 027A 51F4              brne L39
 027C                   .dbline 310
 027C                   .dbline 311
 027C           ;         OS_EventTO(pevent);
 027C 8501              movw R16,R10
 027E 0E940000          xcall _OS_EventTO
 0282                   .dbline 312
 0282           ;         OS_EXIT_CRITICAL();
 0282 062F              mov R16,R22
 0284 0E940000          xcall _OS_CPU_SR_Restore
 0288                   .dbline 313
 0288           ;         *err = OS_TIMEOUT;                            /* Indicate that didn't get event within TO      */
 0288 8AE0              ldi R24,10
 028A FA01              movw R30,R20
 028C 8083              std z+0,R24
 028E                   .dbline 314
 028E           ;         return;
 028E 0EC0              xjmp L32
 0290           L39:
 0290                   .dbline 316
 0290           ;     }
 0290           ;     OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
 0290 2224              clr R2
 0292 3324              clr R3
 0294 E0910000          lds R30,_OSTCBCur
 0298 F0910100          lds R31,_OSTCBCur+1
 029C 3782              std z+7,R3
 029E 2682              std z+6,R2
 02A0                   .dbline 317
 02A0           ;     OS_EXIT_CRITICAL();
 02A0 062F              mov R16,R22
 02A2 0E940000          xcall _OS_CPU_SR_Restore
 02A6                   .dbline 318
 02A6           ;     *err = OS_NO_ERR;
 02A6 2224              clr R2
 02A8 FA01              movw R30,R20
 02AA 2082              std z+0,R2
 02AC                   .dbline -2
 02AC           L32:
 02AC 0E940000          xcall pop_gset4
 02B0                   .dbline 0 ; func end
 02B0 0895              ret
 02B2                   .dbsym r cpu_sr 22 c
 02B2                   .dbsym r err 20 pc
 02B2                   .dbsym r timeout 12 i
 02B2                   .dbsym r pevent 10 pS[os_event]
 02B2                   .dbend
 02B2                   .dbfunc e OSSemPost _OSSemPost fc
 02B2           ;         cpu_sr -> R20
 02B2           ;         pevent -> R22,R23
                        .even
 02B2           _OSSemPost::
 02B2 0E940000          xcall push_gset2
 02B6 B801              movw R22,R16
 02B8 2197              sbiw R28,1
 02BA                   .dbline -1
 02BA                   .dbline 340
 02BA           ; }
 02BA           ; /*$PAGE*/
 02BA           ; /*
 02BA           ; *********************************************************************************************************
 02BA           ; *                                         POST TO A SEMAPHORE
 02BA           ; *
 02BA           ; * Description: This function signals a semaphore
 02BA           ; *
 02BA           ; * Arguments  : pevent        is a pointer to the event control block associated with the desired
 02BA           ; *                            semaphore.
 02BA           ; *
 02BA           ; * Returns    : OS_NO_ERR           The call was successful and the semaphore was signaled.
 02BA           ; *              OS_SEM_OVF          If the semaphore count exceeded its limit.  In other words, you have
 02BA           ; *                                  signalled the semaphore more often than you waited on it with either
 02BA           ; *                                  OSSemAccept() or OSSemPend().
 02BA           ; *              OS_ERR_EVENT_TYPE   If you didn't pass a pointer to a semaphore
 02BA           ; *              OS_ERR_PEVENT_NULL  If 'pevent' is a NULL pointer.
 02BA           ; *********************************************************************************************************
 02BA           ; */
 02BA           ; 
 02BA           ; INT8U  OSSemPost (OS_EVENT *pevent)
 02BA           ; {
 02BA                   .dbline 342
 02BA           ; #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
 02BA           ;     OS_CPU_SR  cpu_sr = 0;
 02BA 4427              clr R20
 02BC                   .dbline 352
 02BC           ; #endif
 02BC           ; 
 02BC           ; 
 02BC           ; 
 02BC           ; #if OS_ARG_CHK_EN > 0
 02BC           ;     if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
 02BC           ;         return (OS_ERR_PEVENT_NULL);
 02BC           ;     }
 02BC           ; #endif
 02BC           ;     if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {        /* Validate event block type                */
 02BC FB01              movw R30,R22
 02BE 8081              ldd R24,z+0
 02C0 8330              cpi R24,3
 02C2 11F0              breq L42
 02C4                   .dbline 352
 02C4                   .dbline 353
 02C4           ;         return (OS_ERR_EVENT_TYPE);
 02C4 01E0              ldi R16,1
 02C6 2DC0              xjmp L41
 02C8           L42:
 02C8                   .dbline 355
 02C8           ;     }
 02C8           ;     OS_ENTER_CRITICAL();
 02C8 0E940000          xcall _OS_CPU_SR_Save
 02CC 402F              mov R20,R16
 02CE                   .dbline 356
 02CE           ;     if (pevent->OSEventGrp != 0) {                             /* See if any task waiting for semaphore*/
 02CE FB01              movw R30,R22
 02D0 2580              ldd R2,z+5
 02D2 2220              tst R2
 02D4 71F0              breq L44
 02D6                   .dbline 356
 02D6                   .dbline 357
 02D6           ;         (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM); /* Ready HPT waiting on event           */
 02D6 81E0              ldi R24,1
 02D8 8883              std y+0,R24
 02DA 2227              clr R18
 02DC 3327              clr R19
 02DE 8B01              movw R16,R22
 02E0 0E940000          xcall _OS_EventTaskRdy
 02E4                   .dbline 358
 02E4           ;         OS_EXIT_CRITICAL();
 02E4 042F              mov R16,R20
 02E6 0E940000          xcall _OS_CPU_SR_Restore
 02EA                   .dbline 359
 02EA           ;         OS_Sched();                                            /* Find HPT ready to run                */
 02EA 0E940000          xcall _OS_Sched
 02EE                   .dbline 360
 02EE           ;         return (OS_NO_ERR);
 02EE 0027              clr R16
 02F0 18C0              xjmp L41
 02F2           L44:
 02F2                   .dbline 362
 02F2           ;     }
 02F2           ;     if (pevent->OSEventCnt < 65535u) {                /* Make sure semaphore will not overflow         */
 02F2 FB01              movw R30,R22
 02F4 8381              ldd R24,z+3
 02F6 9481              ldd R25,z+4
 02F8 8F3F              cpi R24,255
 02FA EFEF              ldi R30,255
 02FC 9E07              cpc R25,R30
 02FE 68F4              brsh L46
 0300                   .dbline 362
 0300                   .dbline 363
 0300           ;         pevent->OSEventCnt++;                         /* Increment semaphore count to register event   */
 0300 CB01              movw R24,R22
 0302 0396              adiw R24,3
 0304 FC01              movw R30,R24
 0306 8081              ldd R24,z+0
 0308 9181              ldd R25,z+1
 030A 0196              adiw R24,1
 030C 9183              std z+1,R25
 030E 8083              std z+0,R24
 0310                   .dbline 364
 0310           ;         OS_EXIT_CRITICAL();
 0310 042F              mov R16,R20
 0312 0E940000          xcall _OS_CPU_SR_Restore
 0316                   .dbline 365
 0316           ;         return (OS_NO_ERR);
 0316 0027              clr R16
 0318 04C0              xjmp L41
 031A           L46:
 031A                   .dbline 367
 031A           ;     }
 031A           ;     OS_EXIT_CRITICAL();                               /* Semaphore value has reached its maximum       */
 031A 042F              mov R16,R20
 031C 0E940000          xcall _OS_CPU_SR_Restore
 0320                   .dbline 368
 0320           ;     return (OS_SEM_OVF);
 0320 02E3              ldi R16,50
 0322                   .dbline -2
 0322           L41:
 0322 2196              adiw R28,1
 0324 0E940000          xcall pop_gset2
 0328                   .dbline 0 ; func end
 0328 0895              ret
 032A                   .dbsym r cpu_sr 20 c
 032A                   .dbsym r pevent 22 pS[os_event]
 032A                   .dbend
 032A                   .dbfunc e OSSemQuery _OSSemQuery fc
 032A                   .dbstruct 0 5 os_sem_data
 032A                   .dbfield 0 OSCnt i
 032A                   .dbfield 2 OSEventTbl A[2:2]c
 032A                   .dbfield 4 OSEventGrp c
 032A                   .dbend
 032A           ;         cpu_sr -> R20
 032A           ;          pdest -> R22,R23
 032A           ;           psrc -> R10,R11
 032A           ;              i -> R12
 032A           ;     p_sem_data -> R14,R15
 032A           ;         pevent -> y+10
                        .even
 032A           _OSSemQuery::
 032A 0E940000          xcall push_arg4
 032E 0E940000          xcall push_gset5
 0332 7901              movw R14,R18
 0334                   .dbline -1
 0334                   .dbline 392
 0334           ; }
 0334           ; /*$PAGE*/
 0334           ; /*
 0334           ; *********************************************************************************************************
 0334           ; *                                          QUERY A SEMAPHORE
 0334           ; *
 0334           ; * Description: This function obtains information about a semaphore
 0334           ; *
 0334           ; * Arguments  : pevent        is a pointer to the event control block associated with the desired
 0334           ; *                            semaphore
 0334           ; *
 0334           ; *              p_sem_data    is a pointer to a structure that will contain information about the
 0334           ; *                            semaphore.
 0334           ; *
 0334           ; * Returns    : OS_NO_ERR           The call was successful and the message was sent
 0334           ; *              OS_ERR_EVENT_TYPE   If you are attempting to obtain data from a non semaphore.
 0334           ; *              OS_ERR_PEVENT_NULL  If 'pevent'     is a NULL pointer.
 0334           ; *              OS_ERR_PDATA_NULL   If 'p_sem_data' is a NULL pointer
 0334           ; *********************************************************************************************************
 0334           ; */
 0334           ; 
 0334           ; #if OS_SEM_QUERY_EN > 0
 0334           ; INT8U  OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *p_sem_data)
 0334           ; {
 0334                   .dbline 402
 0334           ; #if OS_LOWEST_PRIO <= 63
 0334           ;     INT8U     *psrc;
 0334           ;     INT8U     *pdest;
 0334           ; #else
 0334           ;     INT16U    *psrc;
 0334           ;     INT16U    *pdest;
 0334           ; #endif
 0334           ;     INT8U      i;
 0334           ; #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
 0334           ;     OS_CPU_SR  cpu_sr = 0;
 0334 4427              clr R20
 0336                   .dbline 415
 0336           ; #endif

⌨️ 快捷键说明

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