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

📄 os_sem.lis

📁 把UCOSII移植到AVR MEGA8上的程序 应用程序为驱动1602显示器,虽说有些简单,但可测试UCOS的运行
💻 LIS
📖 第 1 页 / 共 4 页
字号:
 0158                   .dbline 206
 0158           ;              *err = OS_ERR_INVALID_OPT;
 0158 87E0              ldi R24,7
 015A FB01              movw R30,R22
 015C 8083              std z+0,R24
 015E                   .dbline 207
 015E           ;              return (pevent);
 015E 8A01              movw R16,R20
 0160                   .dbline -2
 0160           L13:
 0160 2196              adiw R28,1
 0162 00D0              rcall pop_gset5
 0164                   .dbline 0 ; func end
 0164 0895              ret
 0166                   .dbsym r tasks_waiting 12 c
 0166                   .dbsym r cpu_sr 10 c
 0166                   .dbsym r err 22 pc
 0166                   .dbsym r opt 14 c
 0166                   .dbsym r pevent 20 pS[.1]
 0166                   .dbend
 0166                   .dbfunc e OSSemPend _OSSemPend fV
 0166           ;         cpu_sr -> R22
 0166           ;            err -> R20,R21
 0166           ;        timeout -> R12,R13
 0166           ;         pevent -> R10,R11
                        .even
 0166           _OSSemPend::
 0166 00D0              rcall push_gset4
 0168 6901              movw R12,R18
 016A 5801              movw R10,R16
 016C 4885              ldd R20,y+8
 016E 5985              ldd R21,y+9
 0170                   .dbline -1
 0170                   .dbline 244
 0170           ;     }
 0170           ; }
 0170           ; #endif
 0170           ; 
 0170           ; /*$PAGE*/
 0170           ; /*
 0170           ; *********************************************************************************************************
 0170           ; *                                           PEND ON SEMAPHORE
 0170           ; *
 0170           ; * Description: This function waits for a semaphore.
 0170           ; *
 0170           ; * Arguments  : pevent        is a pointer to the event control block associated with the desired
 0170           ; *                            semaphore.
 0170           ; *
 0170           ; *              timeout       is an optional timeout period (in clock ticks).  If non-zero, your task will
 0170           ; *                            wait for the resource up to the amount of time specified by this argument.
 0170           ; *                            If you specify 0, however, your task will wait forever at the specified
 0170           ; *                            semaphore or, until the resource becomes available (or the event occurs).
 0170           ; *
 0170           ; *              err           is a pointer to where an error message will be deposited.  Possible error
 0170           ; *                            messages are:
 0170           ; *
 0170           ; *                            OS_NO_ERR           The call was successful and your task owns the resource
 0170           ; *                                                or, the event you are waiting for occurred.
 0170           ; *                            OS_TIMEOUT          The semaphore was not received within the specified
 0170           ; *                                                timeout.
 0170           ; *                            OS_ERR_EVENT_TYPE   If you didn't pass a pointer to a semaphore.
 0170           ; *                            OS_ERR_PEND_ISR     If you called this function from an ISR and the result
 0170           ; *                                                would lead to a suspension.
 0170           ; *                            OS_ERR_PEVENT_NULL  If 'pevent' is a NULL pointer.
 0170           ; *
 0170           ; * Returns    : none
 0170           ; *********************************************************************************************************
 0170           ; */
 0170           ; 
 0170           ; void  OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
 0170           ; {
 0170                   .dbline 250
 0170           ; #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
 0170           ;     OS_CPU_SR  cpu_sr;
 0170           ; #endif    
 0170           ; 
 0170           ; 
 0170           ;     if (OSIntNesting > 0) {                           /* See if called from ISR ...                    */
 0170 2224              clr R2
 0172 30900000          lds R3,_OSIntNesting
 0176 2314              cp R2,R3
 0178 20F4              brsh L31
 017A                   .dbline 250
 017A                   .dbline 251
 017A           ;         *err = OS_ERR_PEND_ISR;                       /* ... can't PEND from an ISR                    */
 017A 82E0              ldi R24,2
 017C FA01              movw R30,R20
 017E 8083              std z+0,R24
 0180                   .dbline 252
 0180           ;         return;
 0180 49C0              rjmp L30
 0182           L31:
 0182                   .dbline 264
 0182           ;     }
 0182           ; #if OS_ARG_CHK_EN > 0
 0182           ;     if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
 0182           ;         *err = OS_ERR_PEVENT_NULL;
 0182           ;         return;
 0182           ;     }
 0182           ;     if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
 0182           ;         *err = OS_ERR_EVENT_TYPE;
 0182           ;         return;
 0182           ;     }
 0182           ; #endif
 0182           ;     OS_ENTER_CRITICAL();
 0182 00D0              rcall _OS_CPU_SR_Save
 0184 602F              mov R22,R16
 0186                   .dbline 265
 0186           ;     if (pevent->OSEventCnt > 0) {                     /* If sem. is positive, resource available ...   */
 0186 F501              movw R30,R10
 0188 2280              ldd R2,z+2
 018A 3380              ldd R3,z+3
 018C 2220              tst R2
 018E 11F4              brne X6
 0190 3320              tst R3
 0192 71F0              breq L33
 0194           X6:
 0194                   .dbline 265
 0194                   .dbline 266
 0194           ;         pevent->OSEventCnt--;                         /* ... decrement semaphore only if positive.     */
 0194 C501              movw R24,R10
 0196 0296              adiw R24,2
 0198 FC01              movw R30,R24
 019A 8081              ldd R24,z+0
 019C 9181              ldd R25,z+1
 019E 0197              sbiw R24,1
 01A0 9183              std z+1,R25
 01A2 8083              std z+0,R24
 01A4                   .dbline 267
 01A4           ;         OS_EXIT_CRITICAL();
 01A4 062F              mov R16,R22
 01A6 00D0              rcall _OS_CPU_SR_Restore
 01A8                   .dbline 268
 01A8           ;         *err = OS_NO_ERR;
 01A8 2224              clr R2
 01AA FA01              movw R30,R20
 01AC 2082              std z+0,R2
 01AE                   .dbline 269
 01AE           ;         return;
 01AE 32C0              rjmp L30
 01B0           L33:
 01B0                   .dbline 272
 01B0           ;     }
 01B0           ;                                                       /* Otherwise, must wait until event occurs       */
 01B0           ;     OSTCBCur->OSTCBStat |= OS_STAT_SEM;               /* Resource not available, pend on semaphore     */
 01B0 80910000          lds R24,_OSTCBCur
 01B4 90910100          lds R25,_OSTCBCur+1
 01B8 0A96              adiw R24,10
 01BA FC01              movw R30,R24
 01BC 8081              ldd R24,z+0
 01BE 8160              ori R24,1
 01C0 8083              std z+0,R24
 01C2                   .dbline 273
 01C2           ;     OSTCBCur->OSTCBDly   = timeout;                   /* Store pend timeout in TCB                     */
 01C2 E0910000          lds R30,_OSTCBCur
 01C6 F0910100          lds R31,_OSTCBCur+1
 01CA D186              std z+9,R13
 01CC C086              std z+8,R12
 01CE                   .dbline 274
 01CE           ;     OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
 01CE 8501              movw R16,R10
 01D0 00D0              rcall _OS_EventTaskWait
 01D2                   .dbline 275
 01D2           ;     OS_EXIT_CRITICAL();
 01D2 062F              mov R16,R22
 01D4 00D0              rcall _OS_CPU_SR_Restore
 01D6                   .dbline 276
 01D6           ;     OS_Sched();                                       /* Find next highest priority task ready         */
 01D6 00D0              rcall _OS_Sched
 01D8                   .dbline 277
 01D8           ;     OS_ENTER_CRITICAL();
 01D8 00D0              rcall _OS_CPU_SR_Save
 01DA 602F              mov R22,R16
 01DC                   .dbline 278
 01DC           ;     if (OSTCBCur->OSTCBStat & OS_STAT_SEM) {          /* Must have timed out if still waiting for event*/
 01DC E0910000          lds R30,_OSTCBCur
 01E0 F0910100          lds R31,_OSTCBCur+1
 01E4 2284              ldd R2,z+10
 01E6 20FE              sbrs R2,0
 01E8 08C0              rjmp L35
 01EA                   .dbline 278
 01EA                   .dbline 279
 01EA           ;         OS_EventTO(pevent);
 01EA 8501              movw R16,R10
 01EC 00D0              rcall _OS_EventTO
 01EE                   .dbline 280
 01EE           ;         OS_EXIT_CRITICAL();
 01EE 062F              mov R16,R22
 01F0 00D0              rcall _OS_CPU_SR_Restore
 01F2                   .dbline 281
 01F2           ;         *err = OS_TIMEOUT;                            /* Indicate that didn't get event within TO      */
 01F2 8AE0              ldi R24,10
 01F4 FA01              movw R30,R20
 01F6 8083              std z+0,R24
 01F8                   .dbline 282
 01F8           ;         return;
 01F8 0DC0              rjmp L30
 01FA           L35:
 01FA                   .dbline 284
 01FA           ;     }
 01FA           ;     OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
 01FA 2224              clr R2
 01FC 3324              clr R3
 01FE E0910000          lds R30,_OSTCBCur
 0202 F0910100          lds R31,_OSTCBCur+1
 0206 3782              std z+7,R3
 0208 2682              std z+6,R2
 020A                   .dbline 285
 020A           ;     OS_EXIT_CRITICAL();
 020A 062F              mov R16,R22
 020C 00D0              rcall _OS_CPU_SR_Restore
 020E                   .dbline 286
 020E           ;     *err = OS_NO_ERR;
 020E 2224              clr R2
 0210 FA01              movw R30,R20
 0212 2082              std z+0,R2
 0214                   .dbline -2
 0214           L30:
 0214 00D0              rcall pop_gset4
 0216                   .dbline 0 ; func end
 0216 0895              ret
 0218                   .dbsym r cpu_sr 22 c
 0218                   .dbsym r err 20 pc
 0218                   .dbsym r timeout 12 i
 0218                   .dbsym r pevent 10 pS[.1]
 0218                   .dbend
 0218                   .dbfunc e OSSemPost _OSSemPost fc
 0218           ;         cpu_sr -> R20
 0218           ;         pevent -> R22,R23
                        .even
 0218           _OSSemPost::
 0218 00D0              rcall push_gset2
 021A B801              movw R22,R16
 021C 2197              sbiw R28,1
 021E                   .dbline -1
 021E                   .dbline 308
 021E           ; }
 021E           ; /*$PAGE*/
 021E           ; /*
 021E           ; *********************************************************************************************************
 021E           ; *                                         POST TO A SEMAPHORE
 021E           ; *
 021E           ; * Description: This function signals a semaphore
 021E           ; *
 021E           ; * Arguments  : pevent        is a pointer to the event control block associated with the desired
 021E           ; *                            semaphore.
 021E           ; *
 021E           ; * Returns    : OS_NO_ERR           The call was successful and the semaphore was signaled.

⌨️ 快捷键说明

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