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 + -
显示快捷键?