📄 os_sem.s
字号:
rcall _OS_CPU_SR_Restore
.dbline 206
; *err = OS_ERR_INVALID_OPT;
ldi R24,7
movw R30,R22
std z+0,R24
.dbline 207
; return (pevent);
movw R16,R20
.dbline -2
L13:
adiw R28,1
rcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r tasks_waiting 12 c
.dbsym r cpu_sr 10 c
.dbsym r err 22 pc
.dbsym r opt 14 c
.dbsym r pevent 20 pS[.1]
.dbend
.dbfunc e OSSemPend _OSSemPend fV
; cpu_sr -> R22
; err -> R20,R21
; timeout -> R12,R13
; pevent -> R10,R11
.even
_OSSemPend::
rcall push_gset4
movw R12,R18
movw R10,R16
ldd R20,y+8
ldd R21,y+9
.dbline -1
.dbline 244
; }
; }
; #endif
;
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * PEND ON SEMAPHORE
; *
; * Description: This function waits for a semaphore.
; *
; * Arguments : pevent is a pointer to the event control block associated with the desired
; * semaphore.
; *
; * timeout is an optional timeout period (in clock ticks). If non-zero, your task will
; * wait for the resource up to the amount of time specified by this argument.
; * If you specify 0, however, your task will wait forever at the specified
; * semaphore or, until the resource becomes available (or the event occurs).
; *
; * err is a pointer to where an error message will be deposited. Possible error
; * messages are:
; *
; * OS_NO_ERR The call was successful and your task owns the resource
; * or, the event you are waiting for occurred.
; * OS_TIMEOUT The semaphore was not received within the specified
; * timeout.
; * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a semaphore.
; * OS_ERR_PEND_ISR If you called this function from an ISR and the result
; * would lead to a suspension.
; * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer.
; *
; * Returns : none
; *********************************************************************************************************
; */
;
; void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
; {
.dbline 250
; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; OS_CPU_SR cpu_sr;
; #endif
;
;
; if (OSIntNesting > 0) { /* See if called from ISR ... */
clr R2
lds R3,_OSIntNesting
cp R2,R3
brsh L31
.dbline 250
.dbline 251
; *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
ldi R24,2
movw R30,R20
std z+0,R24
.dbline 252
; return;
rjmp L30
L31:
.dbline 264
; }
; #if OS_ARG_CHK_EN > 0
; if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
; *err = OS_ERR_PEVENT_NULL;
; return;
; }
; if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
; *err = OS_ERR_EVENT_TYPE;
; return;
; }
; #endif
; OS_ENTER_CRITICAL();
rcall _OS_CPU_SR_Save
mov R22,R16
.dbline 265
; if (pevent->OSEventCnt > 0) { /* If sem. is positive, resource available ... */
movw R30,R10
ldd R2,z+2
ldd R3,z+3
tst R2
brne X6
tst R3
breq L33
X6:
.dbline 265
.dbline 266
; pevent->OSEventCnt--; /* ... decrement semaphore only if positive. */
movw R24,R10
adiw R24,2
movw R30,R24
ldd R24,z+0
ldd R25,z+1
sbiw R24,1
std z+1,R25
std z+0,R24
.dbline 267
; OS_EXIT_CRITICAL();
mov R16,R22
rcall _OS_CPU_SR_Restore
.dbline 268
; *err = OS_NO_ERR;
clr R2
movw R30,R20
std z+0,R2
.dbline 269
; return;
rjmp L30
L33:
.dbline 272
; }
; /* Otherwise, must wait until event occurs */
; OSTCBCur->OSTCBStat |= OS_STAT_SEM; /* Resource not available, pend on semaphore */
lds R24,_OSTCBCur
lds R25,_OSTCBCur+1
adiw R24,10
movw R30,R24
ldd R24,z+0
ori R24,1
std z+0,R24
.dbline 273
; OSTCBCur->OSTCBDly = timeout; /* Store pend timeout in TCB */
lds R30,_OSTCBCur
lds R31,_OSTCBCur+1
std z+9,R13
std z+8,R12
.dbline 274
; OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
movw R16,R10
rcall _OS_EventTaskWait
.dbline 275
; OS_EXIT_CRITICAL();
mov R16,R22
rcall _OS_CPU_SR_Restore
.dbline 276
; OS_Sched(); /* Find next highest priority task ready */
rcall _OS_Sched
.dbline 277
; OS_ENTER_CRITICAL();
rcall _OS_CPU_SR_Save
mov R22,R16
.dbline 278
; if (OSTCBCur->OSTCBStat & OS_STAT_SEM) { /* Must have timed out if still waiting for event*/
lds R30,_OSTCBCur
lds R31,_OSTCBCur+1
ldd R2,z+10
sbrs R2,0
rjmp L35
.dbline 278
.dbline 279
; OS_EventTO(pevent);
movw R16,R10
rcall _OS_EventTO
.dbline 280
; OS_EXIT_CRITICAL();
mov R16,R22
rcall _OS_CPU_SR_Restore
.dbline 281
; *err = OS_TIMEOUT; /* Indicate that didn't get event within TO */
ldi R24,10
movw R30,R20
std z+0,R24
.dbline 282
; return;
rjmp L30
L35:
.dbline 284
; }
; OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
clr R2
clr R3
lds R30,_OSTCBCur
lds R31,_OSTCBCur+1
std z+7,R3
std z+6,R2
.dbline 285
; OS_EXIT_CRITICAL();
mov R16,R22
rcall _OS_CPU_SR_Restore
.dbline 286
; *err = OS_NO_ERR;
clr R2
movw R30,R20
std z+0,R2
.dbline -2
L30:
rcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r cpu_sr 22 c
.dbsym r err 20 pc
.dbsym r timeout 12 i
.dbsym r pevent 10 pS[.1]
.dbend
.dbfunc e OSSemPost _OSSemPost fc
; cpu_sr -> R20
; pevent -> R22,R23
.even
_OSSemPost::
rcall push_gset2
movw R22,R16
sbiw R28,1
.dbline -1
.dbline 308
; }
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * POST TO A SEMAPHORE
; *
; * Description: This function signals a semaphore
; *
; * Arguments : pevent is a pointer to the event control block associated with the desired
; * semaphore.
; *
; * 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 322
; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; OS_CPU_SR cpu_sr;
; #endif
;
;
; #if OS_ARG_CHK_EN > 0
; if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
; return (OS_ERR_PEVENT_NULL);
; }
; if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
; return (OS_ERR_EVENT_TYPE);
; }
; #endif
; OS_ENTER_CRITICAL();
rcall _OS_CPU_SR_Save
mov R20,R16
.dbline 323
; if (pevent->OSEventGrp != 0x00) { /* See if any task waiting for semaphore */
movw R30,R22
ldd R2,z+1
tst R2
breq L38
.dbline 323
.dbline 324
; OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM); /* Ready highest prio task waiting on event */
ldi R24,1
std y+0,R24
clr R18
clr R19
movw R16,R22
rcall _OS_EventTaskRdy
.dbline 325
; OS_EXIT_CRITICAL();
mov R16,R20
rcall _OS_CPU_SR_Restore
.dbline 326
; OS_Sched(); /* Find highest priority task ready to run */
rcall _OS_Sched
.dbline 327
; return (OS_NO_ERR);
clr R16
rjmp L37
L38:
.dbline 329
; }
; if (pevent->OSEventCnt < 65535) { /* Make sure semaphore will not overflow */
movw R30,R22
ldd R24,z+2
ldd R25,z+3
cpi R24,255
ldi R30,255
cpc R25,R30
brsh L40
.dbline 329
.dbline 330
; pevent->OSEventCnt++; /* Increment semaphore count to register event */
movw R24,R22
adiw R24,2
movw R30,R24
ldd R24,z+0
ldd R25,z+1
adiw R24,1
std z+1,R25
std z+0,R24
.dbline 331
; OS_EXIT_CRITICAL();
mov R16,R20
rcall _OS_CPU_SR_Restore
.dbline 332
; return (OS_NO_ERR);
clr R16
rjmp L37
L40:
.dbline 334
; }
; OS_EXIT_CRITICAL(); /* Semaphore value has reached its maximum */
mov R16,R20
rcall _OS_CPU_SR_Restore
.dbline 335
; return (OS_SEM_OVF);
ldi R16,50
.dbline -2
L37:
adiw R28,1
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r cpu_sr 20 c
.dbsym r pevent 22 pS[.1]
.dbend
.dbfunc e OSSemQuery _OSSemQuery fc
.dbstruct 0 6 .2
.dbfield 0 OSCnt i
.dbfield 2 OSEventTbl A[3:3]c
.dbfield 5 OSEventGrp c
.dbend
; cpu_sr -> R20
; pdest -> R12,R13
; psrc -> R14,R15
; pdata -> R22,R23
; pevent -> R10,R11
.even
_OSSemQuery::
rcall push_gset5
movw R22,R18
movw R10,R16
.dbline -1
.dbline 357
; }
; /*
; *********************************************************************************************************
; * 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
; *
; * pdata 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.
; *********************************************************************************************************
; */
;
; #if OS_SEM_QUERY_EN > 0
; INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *pdata)
; {
.dbline 373
; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; OS_CPU_SR cpu_sr;
; #endif
; INT8U *psrc;
; INT8U *pdest;
;
;
; #if OS_ARG_CHK_EN > 0
; if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
; return (OS_ERR_PEVENT_NULL);
; }
; if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
; return (OS_ERR_EVENT_TYPE);
; }
; #endif
; OS_ENTER_CRITICAL();
rcall _OS_CPU_SR_Save
mov R20,R16
.dbline 374
; pdata->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list */
movw R30,R10
ldd R2,z+1
movw R30,R22
std z+5,R2
.dbline 375
; psrc = &pevent->OSEventTbl[0];
movw R24,R10
adiw R24,6
movw R14,R24
.dbline 376
; pdest = &pdata->OSEventTbl[0];
movw R24,R22
adiw R24,2
.dbline 378
; #if OS_EVENT_TBL_SIZE > 0
; *pdest++ = *psrc++;
movw R30,R14
movw R26,R24
ld R0,Z+
st X+,R0
.dbline 382
; #endif
;
; #if OS_EVENT_TBL_SIZE > 1
; *pdest++ = *psrc++;
ld R0,Z+
st X+,R0
.dbline 386
; #endif
;
; #if OS_EVENT_TBL_SIZE > 2
; *pdest++ = *psrc++;
ld R0,Z+
movw R14,R30
st X+,R0
movw R12,R26
.dbline 408
; #endif
;
; #if OS_EVENT_TBL_SIZE > 3
; *pdest++ = *psrc++;
; #endif
;
; #if OS_EVENT_TBL_SIZE > 4
; *pdest++ = *psrc++;
; #endif
;
; #if OS_EVENT_TBL_SIZE > 5
; *pdest++ = *psrc++;
; #endif
;
; #if OS_EVENT_TBL_SIZE > 6
; *pdest++ = *psrc++;
; #endif
;
; #if OS_EVENT_TBL_SIZE > 7
; *pdest = *psrc;
; #endif
; pdata->OSCnt = pevent->OSEventCnt; /* Get semaphore count */
movw R30,R10
ldd R2,z+2
ldd R3,z+3
movw R30,R22
std z+1,R3
std z+0,R2
.dbline 409
; OS_EXIT_CRITICAL();
rcall _OS_CPU_SR_Restore
.dbline 410
; return (OS_NO_ERR);
clr R16
.dbline -2
L42:
rcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r cpu_sr 20 c
.dbsym r pdest 12 pc
.dbsym r psrc 14 pc
.dbsym r pdata 22 pS[.2]
.dbsym r pevent 10 pS[.1]
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -