📄 os_sem.s
字号:
; * Returns : OS_NO_ERR The call was successful and the semaphore was signaled.
; * OS_SEM_OVF If the semaphore count exceeded its limit. In other words, you have
; * signalled the semaphore more often than you waited on it with either
; * OSSemAccept() or OSSemPend().
; * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a semaphore
; * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer.
; *********************************************************************************************************
; */
;
; INT8U OSSemPost (OS_EVENT *pevent)
; {
.dbline 342
; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; OS_CPU_SR cpu_sr = 0;
clr R20
.dbline 352
; #endif
;
;
;
; #if OS_ARG_CHK_EN > 0
; if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
; return (OS_ERR_PEVENT_NULL);
; }
; #endif
; if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
movw R30,R22
ldd R24,z+0
cpi R24,3
breq L42
.dbline 352
.dbline 353
; return (OS_ERR_EVENT_TYPE);
ldi R16,1
xjmp L41
L42:
.dbline 355
; }
; OS_ENTER_CRITICAL();
xcall _OS_CPU_SR_Save
mov R20,R16
.dbline 356
; if (pevent->OSEventGrp != 0) { /* See if any task waiting for semaphore*/
movw R30,R22
ldd R2,z+5
tst R2
breq L44
.dbline 356
.dbline 357
; (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM); /* Ready HPT waiting on event */
ldi R24,1
std y+0,R24
clr R18
clr R19
movw R16,R22
xcall _OS_EventTaskRdy
.dbline 358
; OS_EXIT_CRITICAL();
mov R16,R20
xcall _OS_CPU_SR_Restore
.dbline 359
; OS_Sched(); /* Find HPT ready to run */
xcall _OS_Sched
.dbline 360
; return (OS_NO_ERR);
clr R16
xjmp L41
L44:
.dbline 362
; }
; if (pevent->OSEventCnt < 65535u) { /* Make sure semaphore will not overflow */
movw R30,R22
ldd R24,z+3
ldd R25,z+4
cpi R24,255
ldi R30,255
cpc R25,R30
brsh L46
.dbline 362
.dbline 363
; pevent->OSEventCnt++; /* Increment semaphore count to register event */
movw R24,R22
adiw R24,3
movw R30,R24
ldd R24,z+0
ldd R25,z+1
adiw R24,1
std z+1,R25
std z+0,R24
.dbline 364
; OS_EXIT_CRITICAL();
mov R16,R20
xcall _OS_CPU_SR_Restore
.dbline 365
; return (OS_NO_ERR);
clr R16
xjmp L41
L46:
.dbline 367
; }
; OS_EXIT_CRITICAL(); /* Semaphore value has reached its maximum */
mov R16,R20
xcall _OS_CPU_SR_Restore
.dbline 368
; return (OS_SEM_OVF);
ldi R16,50
.dbline -2
L41:
adiw R28,1
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r cpu_sr 20 c
.dbsym r pevent 22 pS[os_event]
.dbend
.dbfunc e OSSemQuery _OSSemQuery fc
.dbstruct 0 5 os_sem_data
.dbfield 0 OSCnt i
.dbfield 2 OSEventTbl A[2:2]c
.dbfield 4 OSEventGrp c
.dbend
; cpu_sr -> R20
; pdest -> R22,R23
; psrc -> R10,R11
; i -> R12
; p_sem_data -> R14,R15
; pevent -> y+10
.even
_OSSemQuery::
xcall push_arg4
xcall push_gset5
movw R14,R18
.dbline -1
.dbline 392
; }
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * QUERY A SEMAPHORE
; *
; * Description: This function obtains information about a semaphore
; *
; * Arguments : pevent is a pointer to the event control block associated with the desired
; * semaphore
; *
; * p_sem_data is a pointer to a structure that will contain information about the
; * semaphore.
; *
; * Returns : OS_NO_ERR The call was successful and the message was sent
; * OS_ERR_EVENT_TYPE If you are attempting to obtain data from a non semaphore.
; * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer.
; * OS_ERR_PDATA_NULL If 'p_sem_data' is a NULL pointer
; *********************************************************************************************************
; */
;
; #if OS_SEM_QUERY_EN > 0
; INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *p_sem_data)
; {
.dbline 402
; #if OS_LOWEST_PRIO <= 63
; INT8U *psrc;
; INT8U *pdest;
; #else
; INT16U *psrc;
; INT16U *pdest;
; #endif
; INT8U i;
; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; OS_CPU_SR cpu_sr = 0;
clr R20
.dbline 415
; #endif
;
;
;
; #if OS_ARG_CHK_EN > 0
; if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
; return (OS_ERR_PEVENT_NULL);
; }
; if (p_sem_data == (OS_SEM_DATA *)0) { /* Validate 'p_sem_data' */
; return (OS_ERR_PDATA_NULL);
; }
; #endif
; if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
ldd R30,y+10
ldd R31,y+11
ldd R24,z+0
cpi R24,3
breq L49
.dbline 415
.dbline 416
; return (OS_ERR_EVENT_TYPE);
ldi R16,1
xjmp L48
L49:
.dbline 418
; }
; OS_ENTER_CRITICAL();
xcall _OS_CPU_SR_Save
mov R20,R16
.dbline 419
; p_sem_data->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list */
ldd R30,y+10
ldd R31,y+11
ldd R2,z+5
movw R30,R14
std z+4,R2
.dbline 420
; psrc = &pevent->OSEventTbl[0];
ldd R24,y+10
ldd R25,y+11
adiw R24,6
movw R10,R24
.dbline 421
; pdest = &p_sem_data->OSEventTbl[0];
movw R22,R14
subi R22,254 ; offset = 2
sbci R23,255
.dbline 422
clr R12
xjmp L54
L51:
.dbline 422
.dbline 423
movw R30,R10
movw R26,R22
ld R0,Z+
movw R10,R30
st X+,R0
movw R22,R26
.dbline 424
L52:
.dbline 422
inc R12
L54:
.dbline 422
; for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
mov R24,R12
cpi R24,2
brlo L51
.dbline 425
; *pdest++ = *psrc++;
; }
; p_sem_data->OSCnt = pevent->OSEventCnt; /* Get semaphore count */
ldd R30,y+10
ldd R31,y+11
ldd R2,z+3
ldd R3,z+4
movw R30,R14
std z+1,R3
std z+0,R2
.dbline 426
; OS_EXIT_CRITICAL();
mov R16,R20
xcall _OS_CPU_SR_Restore
.dbline 427
; return (OS_NO_ERR);
clr R16
.dbline -2
L48:
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r cpu_sr 20 c
.dbsym r pdest 22 pc
.dbsym r psrc 10 pc
.dbsym r i 12 c
.dbsym r p_sem_data 14 pS[os_sem_data]
.dbsym l pevent 10 pS[os_event]
.dbend
.dbfunc e OSSemSet _OSSemSet fV
; cpu_sr -> R20
; err -> y+6
; cnt -> R22,R23
; pevent -> R10,R11
.even
_OSSemSet::
xcall push_gset3
movw R22,R18
movw R10,R16
.dbline -1
.dbline 458
; }
; #endif /* OS_SEM_QUERY_EN */
;
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * SET SEMAPHORE
; *
; * Description: This function sets the semaphore count to the value specified as an argument. Typically,
; * this value would be 0.
; *
; * You would typically use this function when a semaphore is used as a signaling mechanism
; * and, you want to reset the count value.
; *
; * Arguments : pevent is a pointer to the event control block
; *
; * cnt is the new value for the semaphore count. You would pass 0 to reset the
; * semaphore count.
; *
; * err is a pointer to an error code returned by the function as follows:
; *
; * OS_NO_ERR The call was successful and the semaphore value was set.
; * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a semaphore.
; * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer.
; * OS_ERR_TASK_WAITING If tasks are waiting on the semaphore.
; *********************************************************************************************************
; */
;
; #if OS_SEM_SET_EN > 0
; void OSSemSet (OS_EVENT *pevent, INT16U cnt, INT8U *err)
; {
.dbline 460
; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; OS_CPU_SR cpu_sr = 0;
clr R20
.dbline 474
; #endif
;
;
;
; #if OS_ARG_CHK_EN > 0
; if (err == (INT8U *)0) { /* Validate 'err' */
; return;
; }
; if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
; *err = OS_ERR_PEVENT_NULL;
; return;
; }
; #endif
; if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
movw R30,R10
ldd R24,z+0
cpi R24,3
breq L56
.dbline 474
.dbline 475
; *err = OS_ERR_EVENT_TYPE;
ldi R24,1
ldd R30,y+6
ldd R31,y+7
std z+0,R24
.dbline 476
; return;
xjmp L55
L56:
.dbline 478
; }
; OS_ENTER_CRITICAL();
xcall _OS_CPU_SR_Save
mov R20,R16
.dbline 479
; *err = OS_NO_ERR;
clr R2
ldd R30,y+6
ldd R31,y+7
std z+0,R2
.dbline 480
; if (pevent->OSEventCnt > 0) { /* See if semaphore already has a count */
movw R30,R10
ldd R2,z+3
ldd R3,z+4
tst R2
brne X7
tst R3
breq L58
X7:
.dbline 480
.dbline 481
; pevent->OSEventCnt = cnt; /* Yes, set it to the new value specified. */
movw R30,R10
std z+4,R23
std z+3,R22
.dbline 482
xjmp L59
L58:
.dbline 482
; } else { /* No */
.dbline 483
; if (pevent->OSEventGrp == 0) { /* See if task(s) waiting? */
movw R30,R10
ldd R2,z+5
tst R2
brne L60
.dbline 483
.dbline 484
; pevent->OSEventCnt = cnt; /* No, OK to set the value */
movw R30,R10
std z+4,R23
std z+3,R22
.dbline 485
xjmp L61
L60:
.dbline 485
; } else {
.dbline 486
; *err = OS_ERR_TASK_WAITING;
ldi R24,8
ldd R30,y+6
ldd R31,y+7
std z+0,R24
.dbline 487
; }
L61:
.dbline 488
; }
L59:
.dbline 489
; OS_EXIT_CRITICAL();
mov R16,R20
xcall _OS_CPU_SR_Restore
.dbline -2
L55:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r cpu_sr 20 c
.dbsym l err 6 pc
.dbsym r cnt 22 i
.dbsym r pevent 10 pS[os_event]
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -