os_sem.lis

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

LIS
1,276
字号
 0174           ;              }
 0174           ; #if OS_EVENT_NAME_SIZE > 1
 0174           ;              pevent->OSEventName[0] = '?';                 /* Unknown name                             */
 0174           ;              pevent->OSEventName[1] = OS_ASCII_NUL;
 0174           ; #endif
 0174           ;              pevent->OSEventType    = OS_EVENT_TYPE_UNUSED;
 0174 2224              clr R2
 0176 FB01              movw R30,R22
 0178 2082              std z+0,R2
 017A                   .dbline 218
 017A           ;              pevent->OSEventPtr     = OSEventFreeList;     /* Return Event Control Block to free list  */
 017A 20900000          lds R2,_OSEventFreeList
 017E 30900100          lds R3,_OSEventFreeList+1
 0182 3282              std z+2,R3
 0184 2182              std z+1,R2
 0186                   .dbline 219
 0186           ;              pevent->OSEventCnt     = 0;
 0186 2224              clr R2
 0188 3324              clr R3
 018A FB01              movw R30,R22
 018C 3482              std z+4,R3
 018E 2382              std z+3,R2
 0190                   .dbline 220
 0190           ;              OSEventFreeList        = pevent;              /* Get next free event control block        */
 0190 70930100          sts _OSEventFreeList+1,R23
 0194 60930000          sts _OSEventFreeList,R22
 0198                   .dbline 221
 0198           ;              OS_EXIT_CRITICAL();
 0198 0C2D              mov R16,R12
 019A 0E940000          xcall _OS_CPU_SR_Restore
 019E                   .dbline 222
 019E           ;              if (tasks_waiting == TRUE) {                  /* Reschedule only if task(s) were waiting  */
 019E 8E2D              mov R24,R14
 01A0 8130              cpi R24,1
 01A2 11F4              brne L30
 01A4                   .dbline 222
 01A4                   .dbline 223
 01A4           ;                  OS_Sched();                               /* Find highest priority task ready to run  */
 01A4 0E940000          xcall _OS_Sched
 01A8                   .dbline 224
 01A8           ;              }
 01A8           L30:
 01A8                   .dbline 225
 01A8           ;              *err                   = OS_NO_ERR;
 01A8 2224              clr R2
 01AA F501              movw R30,R10
 01AC 2082              std z+0,R2
 01AE                   .dbline 226
 01AE           ;              pevent_return          = (OS_EVENT *)0;       /* Semaphore has been deleted               */
 01AE 4427              clr R20
 01B0 5527              clr R21
 01B2                   .dbline 227
 01B2           ;              break;
 01B2 07C0              xjmp L21
 01B4           L20:
 01B4                   .dbline 230
 01B4           ; 
 01B4           ;         default:
 01B4           ;              OS_EXIT_CRITICAL();
 01B4 0C2D              mov R16,R12
 01B6 0E940000          xcall _OS_CPU_SR_Restore
 01BA                   .dbline 231
 01BA           ;              *err                   = OS_ERR_INVALID_OPT;
 01BA 87E0              ldi R24,7
 01BC F501              movw R30,R10
 01BE 8083              std z+0,R24
 01C0                   .dbline 232
 01C0           ;              pevent_return          = pevent;
 01C0 AB01              movw R20,R22
 01C2                   .dbline 233
 01C2           ;              break;
 01C2           L21:
 01C2                   .dbline 235
 01C2           ;     }
 01C2           ;     return (pevent_return);
 01C2 8A01              movw R16,R20
 01C4                   .dbline -2
 01C4           L13:
 01C4 2196              adiw R28,1
 01C6 0E940000          xcall pop_gset5
 01CA                   .dbline 0 ; func end
 01CA 0895              ret
 01CC                   .dbsym r tasks_waiting 14 c
 01CC                   .dbsym r pevent_return 20 pS[os_event]
 01CC                   .dbsym r cpu_sr 12 c
 01CC                   .dbsym r err 10 pc
 01CC                   .dbsym r opt 20 c
 01CC                   .dbsym r pevent 22 pS[os_event]
 01CC                   .dbend
 01CC                   .dbfunc e OSSemPend _OSSemPend fV
 01CC           ;         cpu_sr -> R22
 01CC           ;            err -> R20,R21
 01CC           ;        timeout -> R12,R13
 01CC           ;         pevent -> R10,R11
                        .even
 01CC           _OSSemPend::
 01CC 0E940000          xcall push_gset4
 01D0 6901              movw R12,R18
 01D2 5801              movw R10,R16
 01D4 4885              ldd R20,y+8
 01D6 5985              ldd R21,y+9
 01D8                   .dbline -1
 01D8                   .dbline 271
 01D8           ; }
 01D8           ; #endif
 01D8           ; 
 01D8           ; /*$PAGE*/
 01D8           ; /*
 01D8           ; *********************************************************************************************************
 01D8           ; *                                           PEND ON SEMAPHORE
 01D8           ; *
 01D8           ; * Description: This function waits for a semaphore.
 01D8           ; *
 01D8           ; * Arguments  : pevent        is a pointer to the event control block associated with the desired
 01D8           ; *                            semaphore.
 01D8           ; *
 01D8           ; *              timeout       is an optional timeout period (in clock ticks).  If non-zero, your task will
 01D8           ; *                            wait for the resource up to the amount of time specified by this argument.
 01D8           ; *                            If you specify 0, however, your task will wait forever at the specified
 01D8           ; *                            semaphore or, until the resource becomes available (or the event occurs).
 01D8           ; *
 01D8           ; *              err           is a pointer to where an error message will be deposited.  Possible error
 01D8           ; *                            messages are:
 01D8           ; *
 01D8           ; *                            OS_NO_ERR           The call was successful and your task owns the resource
 01D8           ; *                                                or, the event you are waiting for occurred.
 01D8           ; *                            OS_TIMEOUT          The semaphore was not received within the specified
 01D8           ; *                                                timeout.
 01D8           ; *                            OS_ERR_EVENT_TYPE   If you didn't pass a pointer to a semaphore.
 01D8           ; *                            OS_ERR_PEND_ISR     If you called this function from an ISR and the result
 01D8           ; *                                                would lead to a suspension.
 01D8           ; *                            OS_ERR_PEVENT_NULL  If 'pevent' is a NULL pointer.
 01D8           ; *
 01D8           ; * Returns    : none
 01D8           ; *********************************************************************************************************
 01D8           ; */
 01D8           ; 
 01D8           ; void  OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
 01D8           ; {
 01D8                   .dbline 273
 01D8           ; #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
 01D8           ;     OS_CPU_SR  cpu_sr = 0;
 01D8 6627              clr R22
 01DA                   .dbline 287
 01DA           ; #endif
 01DA           ; 
 01DA           ; 
 01DA           ; 
 01DA           ; #if OS_ARG_CHK_EN > 0
 01DA           ;     if (err == (INT8U *)0) {                          /* Validate 'err'                                */
 01DA           ;         return;
 01DA           ;     }
 01DA           ;     if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
 01DA           ;         *err = OS_ERR_PEVENT_NULL;
 01DA           ;         return;
 01DA           ;     }
 01DA           ; #endif
 01DA           ;     if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
 01DA F501              movw R30,R10
 01DC 8081              ldd R24,z+0
 01DE 8330              cpi R24,3
 01E0 21F0              breq L33
 01E2                   .dbline 287
 01E2                   .dbline 288
 01E2           ;         *err = OS_ERR_EVENT_TYPE;
 01E2 81E0              ldi R24,1
 01E4 FA01              movw R30,R20
 01E6 8083              std z+0,R24
 01E8                   .dbline 289
 01E8           ;         return;
 01E8 61C0              xjmp L32
 01EA           L33:
 01EA                   .dbline 291
 01EA           ;     }
 01EA           ;     if (OSIntNesting > 0) {                           /* See if called from ISR ...                    */
 01EA 2224              clr R2
 01EC 30900000          lds R3,_OSIntNesting
 01F0 2314              cp R2,R3
 01F2 20F4              brsh L35
 01F4                   .dbline 291
 01F4                   .dbline 292
 01F4           ;         *err = OS_ERR_PEND_ISR;                       /* ... can't PEND from an ISR                    */
 01F4 82E0              ldi R24,2
 01F6 FA01              movw R30,R20
 01F8 8083              std z+0,R24
 01FA                   .dbline 293
 01FA           ;         return;
 01FA 58C0              xjmp L32
 01FC           L35:
 01FC                   .dbline 295
 01FC           ;     }
 01FC           ;     OS_ENTER_CRITICAL();
 01FC 0E940000          xcall _OS_CPU_SR_Save
 0200 602F              mov R22,R16
 0202                   .dbline 296
 0202           ;     if (pevent->OSEventCnt > 0) {                     /* If sem. is positive, resource available ...   */
 0202 F501              movw R30,R10
 0204 2380              ldd R2,z+3
 0206 3480              ldd R3,z+4
 0208 2220              tst R2
 020A 11F4              brne X6
 020C 3320              tst R3
 020E 79F0              breq L37
 0210           X6:
 0210                   .dbline 296
 0210                   .dbline 297
 0210           ;         pevent->OSEventCnt--;                         /* ... decrement semaphore only if positive.     */
 0210 C501              movw R24,R10
 0212 0396              adiw R24,3
 0214 FC01              movw R30,R24
 0216 8081              ldd R24,z+0
 0218 9181              ldd R25,z+1
 021A 0197              sbiw R24,1
 021C 9183              std z+1,R25
 021E 8083              std z+0,R24
 0220                   .dbline 298
 0220           ;         OS_EXIT_CRITICAL();
 0220 062F              mov R16,R22
 0222 0E940000          xcall _OS_CPU_SR_Restore
 0226                   .dbline 299
 0226           ;         *err = OS_NO_ERR;
 0226 2224              clr R2
 0228 FA01              movw R30,R20
 022A 2082              std z+0,R2
 022C                   .dbline 300
 022C           ;         return;
 022C 3FC0              xjmp L32
 022E           L37:
 022E                   .dbline 303
 022E           ;     }
 022E           ;                                                       /* Otherwise, must wait until event occurs       */
 022E           ;     OSTCBCur->OSTCBStat   |= OS_STAT_SEM;             /* Resource not available, pend on semaphore     */
 022E 80910000          lds R24,_OSTCBCur
 0232 90910100          lds R25,_OSTCBCur+1
 0236 0A96              adiw R24,10
 0238 FC01              movw R30,R24
 023A 8081              ldd R24,z+0
 023C 8160              ori R24,1
 023E 8083              std z+0,R24
 0240                   .dbline 304
 0240           ;     OSTCBCur->OSTCBPendTO  = FALSE;
 0240 2224              clr R2
 0242 E0910000          lds R30,_OSTCBCur
 0246 F0910100          lds R31,_OSTCBCur+1
 024A 2386              std z+11,R2
 024C                   .dbline 305
 024C           ;     OSTCBCur->OSTCBDly     = timeout;                 /* Store pend timeout in TCB                     */
 024C E0910000          lds R30,_OSTCBCur
 0250 F0910100          lds R31,_OSTCBCur+1
 0254 D186              std z+9,R13
 0256 C086              std z+8,R12
 0258                   .dbline 306
 0258           ;     OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
 0258 8501              movw R16,R10
 025A 0E940000          xcall _OS_EventTaskWait
 025E                   .dbline 307

⌨️ 快捷键说明

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