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