📄 os_sem.lis
字号:
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 + -