os_sem.lis
来自「将本站的UCOSFORAVR128V276版本升级到了280版」· LIS 代码 · 共 1,276 行 · 第 1/5 页
LIS
1,276 行
0336 ;
0336 ;
0336 ;
0336 ; #if OS_ARG_CHK_EN > 0
0336 ; if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
0336 ; return (OS_ERR_PEVENT_NULL);
0336 ; }
0336 ; if (p_sem_data == (OS_SEM_DATA *)0) { /* Validate 'p_sem_data' */
0336 ; return (OS_ERR_PDATA_NULL);
0336 ; }
0336 ; #endif
0336 ; if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
0336 EA85 ldd R30,y+10
0338 FB85 ldd R31,y+11
033A 8081 ldd R24,z+0
033C 8330 cpi R24,3
033E 11F0 breq L49
0340 .dbline 415
0340 .dbline 416
0340 ; return (OS_ERR_EVENT_TYPE);
0340 01E0 ldi R16,1
0342 26C0 xjmp L48
0344 L49:
0344 .dbline 418
0344 ; }
0344 ; OS_ENTER_CRITICAL();
0344 0E940000 xcall _OS_CPU_SR_Save
0348 402F mov R20,R16
034A .dbline 419
034A ; p_sem_data->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list */
034A EA85 ldd R30,y+10
034C FB85 ldd R31,y+11
034E 2580 ldd R2,z+5
0350 F701 movw R30,R14
0352 2482 std z+4,R2
0354 .dbline 420
0354 ; psrc = &pevent->OSEventTbl[0];
0354 8A85 ldd R24,y+10
0356 9B85 ldd R25,y+11
0358 0696 adiw R24,6
035A 5C01 movw R10,R24
035C .dbline 421
035C ; pdest = &p_sem_data->OSEventTbl[0];
035C B701 movw R22,R14
035E 6E5F subi R22,254 ; offset = 2
0360 7F4F sbci R23,255
0362 .dbline 422
0362 CC24 clr R12
0364 07C0 xjmp L54
0366 L51:
0366 .dbline 422
0366 .dbline 423
0366 F501 movw R30,R10
0368 DB01 movw R26,R22
036A 0190 ld R0,Z+
036C 5F01 movw R10,R30
036E 0D92 st X+,R0
0370 BD01 movw R22,R26
0372 .dbline 424
0372 L52:
0372 .dbline 422
0372 C394 inc R12
0374 L54:
0374 .dbline 422
0374 ; for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
0374 8C2D mov R24,R12
0376 8230 cpi R24,2
0378 B0F3 brlo L51
037A .dbline 425
037A ; *pdest++ = *psrc++;
037A ; }
037A ; p_sem_data->OSCnt = pevent->OSEventCnt; /* Get semaphore count */
037A EA85 ldd R30,y+10
037C FB85 ldd R31,y+11
037E 2380 ldd R2,z+3
0380 3480 ldd R3,z+4
0382 F701 movw R30,R14
0384 3182 std z+1,R3
0386 2082 std z+0,R2
0388 .dbline 426
0388 ; OS_EXIT_CRITICAL();
0388 042F mov R16,R20
038A 0E940000 xcall _OS_CPU_SR_Restore
038E .dbline 427
038E ; return (OS_NO_ERR);
038E 0027 clr R16
0390 .dbline -2
0390 L48:
0390 0E940000 xcall pop_gset5
0394 2496 adiw R28,4
0396 .dbline 0 ; func end
0396 0895 ret
0398 .dbsym r cpu_sr 20 c
0398 .dbsym r pdest 22 pc
0398 .dbsym r psrc 10 pc
0398 .dbsym r i 12 c
0398 .dbsym r p_sem_data 14 pS[os_sem_data]
0398 .dbsym l pevent 10 pS[os_event]
0398 .dbend
0398 .dbfunc e OSSemSet _OSSemSet fV
0398 ; cpu_sr -> R20
0398 ; err -> y+6
0398 ; cnt -> R22,R23
0398 ; pevent -> R10,R11
.even
0398 _OSSemSet::
0398 0E940000 xcall push_gset3
039C B901 movw R22,R18
039E 5801 movw R10,R16
03A0 .dbline -1
03A0 .dbline 458
03A0 ; }
03A0 ; #endif /* OS_SEM_QUERY_EN */
03A0 ;
03A0 ; /*$PAGE*/
03A0 ; /*
03A0 ; *********************************************************************************************************
03A0 ; * SET SEMAPHORE
03A0 ; *
03A0 ; * Description: This function sets the semaphore count to the value specified as an argument. Typically,
03A0 ; * this value would be 0.
03A0 ; *
03A0 ; * You would typically use this function when a semaphore is used as a signaling mechanism
03A0 ; * and, you want to reset the count value.
03A0 ; *
03A0 ; * Arguments : pevent is a pointer to the event control block
03A0 ; *
03A0 ; * cnt is the new value for the semaphore count. You would pass 0 to reset the
03A0 ; * semaphore count.
03A0 ; *
03A0 ; * err is a pointer to an error code returned by the function as follows:
03A0 ; *
03A0 ; * OS_NO_ERR The call was successful and the semaphore value was set.
03A0 ; * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a semaphore.
03A0 ; * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer.
03A0 ; * OS_ERR_TASK_WAITING If tasks are waiting on the semaphore.
03A0 ; *********************************************************************************************************
03A0 ; */
03A0 ;
03A0 ; #if OS_SEM_SET_EN > 0
03A0 ; void OSSemSet (OS_EVENT *pevent, INT16U cnt, INT8U *err)
03A0 ; {
03A0 .dbline 460
03A0 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
03A0 ; OS_CPU_SR cpu_sr = 0;
03A0 4427 clr R20
03A2 .dbline 474
03A2 ; #endif
03A2 ;
03A2 ;
03A2 ;
03A2 ; #if OS_ARG_CHK_EN > 0
03A2 ; if (err == (INT8U *)0) { /* Validate 'err' */
03A2 ; return;
03A2 ; }
03A2 ; if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
03A2 ; *err = OS_ERR_PEVENT_NULL;
03A2 ; return;
03A2 ; }
03A2 ; #endif
03A2 ; if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
03A2 F501 movw R30,R10
03A4 8081 ldd R24,z+0
03A6 8330 cpi R24,3
03A8 29F0 breq L56
03AA .dbline 474
03AA .dbline 475
03AA ; *err = OS_ERR_EVENT_TYPE;
03AA 81E0 ldi R24,1
03AC EE81 ldd R30,y+6
03AE FF81 ldd R31,y+7
03B0 8083 std z+0,R24
03B2 .dbline 476
03B2 ; return;
03B2 21C0 xjmp L55
03B4 L56:
03B4 .dbline 478
03B4 ; }
03B4 ; OS_ENTER_CRITICAL();
03B4 0E940000 xcall _OS_CPU_SR_Save
03B8 402F mov R20,R16
03BA .dbline 479
03BA ; *err = OS_NO_ERR;
03BA 2224 clr R2
03BC EE81 ldd R30,y+6
03BE FF81 ldd R31,y+7
03C0 2082 std z+0,R2
03C2 .dbline 480
03C2 ; if (pevent->OSEventCnt > 0) { /* See if semaphore already has a count */
03C2 F501 movw R30,R10
03C4 2380 ldd R2,z+3
03C6 3480 ldd R3,z+4
03C8 2220 tst R2
03CA 11F4 brne X7
03CC 3320 tst R3
03CE 21F0 breq L58
03D0 X7:
03D0 .dbline 480
03D0 .dbline 481
03D0 ; pevent->OSEventCnt = cnt; /* Yes, set it to the new value specified. */
03D0 F501 movw R30,R10
03D2 7483 std z+4,R23
03D4 6383 std z+3,R22
03D6 .dbline 482
03D6 0CC0 xjmp L59
03D8 L58:
03D8 .dbline 482
03D8 ; } else { /* No */
03D8 .dbline 483
03D8 ; if (pevent->OSEventGrp == 0) { /* See if task(s) waiting? */
03D8 F501 movw R30,R10
03DA 2580 ldd R2,z+5
03DC 2220 tst R2
03DE 21F4 brne L60
03E0 .dbline 483
03E0 .dbline 484
03E0 ; pevent->OSEventCnt = cnt; /* No, OK to set the value */
03E0 F501 movw R30,R10
03E2 7483 std z+4,R23
03E4 6383 std z+3,R22
03E6 .dbline 485
03E6 04C0 xjmp L61
03E8 L60:
03E8 .dbline 485
03E8 ; } else {
03E8 .dbline 486
03E8 ; *err = OS_ERR_TASK_WAITING;
03E8 88E0 ldi R24,8
03EA EE81 ldd R30,y+6
03EC FF81 ldd R31,y+7
03EE 8083 std z+0,R24
03F0 .dbline 487
03F0 ; }
03F0 L61:
03F0 .dbline 488
03F0 ; }
03F0 L59:
03F0 .dbline 489
03F0 ; OS_EXIT_CRITICAL();
03F0 042F mov R16,R20
03F2 0E940000 xcall _OS_CPU_SR_Restore
03F6 .dbline -2
03F6 L55:
03F6 0E940000 xcall pop_gset3
03FA .dbline 0 ; func end
03FA 0895 ret
03FC .dbsym r cpu_sr 20 c
03FC .dbsym l err 6 pc
03FC .dbsym r cnt 22 i
03FC .dbsym r pevent 10 pS[os_event]
03FC .dbend
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?