os_time.s

来自「将本站的UCOSFORAVR128V276版本升级到了280版」· S 代码 · 共 648 行 · 第 1/2 页

S
648
字号
	ldi R20,255
	ldi R21,255
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	movw R30,R28
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 116
;     OSTimeDly((INT16U)ticks);
	movw R30,R28
	ldd R16,z+0
	ldd R17,z+1
	xcall _OSTimeDly
	xjmp L8
L7:
	.dbline 117
	.dbline 118
	ldi R16,32768
	ldi R17,128
	xcall _OSTimeDly
	.dbline 119
	ldi R16,32768
	ldi R17,128
	xcall _OSTimeDly
	.dbline 120
	movw R24,R10
	sbiw R24,1
	movw R10,R24
	.dbline 121
L8:
	.dbline 117
;     while (loops > 0) {
	tst R10
	brne L7
	tst R11
	brne L7
X2:
	.dbline 122
;         OSTimeDly((INT16U)32768u);
;         OSTimeDly((INT16U)32768u);
;         loops--;
;     }
;     return (OS_NO_ERR);
	clr R16
	.dbline -2
L6:
	adiw R28,4
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym l ticks 0 l
	.dbsym r loops 10 i
	.dbsym l milli 14 i
	.dbsym l seconds 12 c
	.dbsym r minutes 12 c
	.dbsym r hours 10 c
	.dbend
	.dbfunc e OSTimeDlyResume _OSTimeDlyResume fc
	.dbstruct 0 8 os_event
	.dbfield 0 OSEventType c
	.dbfield 1 OSEventPtr pV
	.dbfield 3 OSEventCnt i
	.dbfield 5 OSEventGrp c
	.dbfield 6 OSEventTbl A[2:2]c
	.dbend
	.dbstruct 0 18 os_tcb
	.dbfield 0 OSTCBStkPtr pc
	.dbfield 2 OSTCBNext pS[os_tcb]
	.dbfield 4 OSTCBPrev pS[os_tcb]
	.dbfield 6 OSTCBEventPtr pS[os_event]
	.dbfield 8 OSTCBDly i
	.dbfield 10 OSTCBStat c
	.dbfield 11 OSTCBPendTO c
	.dbfield 12 OSTCBPrio c
	.dbfield 13 OSTCBX c
	.dbfield 14 OSTCBY c
	.dbfield 15 OSTCBBitX c
	.dbfield 16 OSTCBBitY c
	.dbfield 17 OSTCBDelReq c
	.dbend
;         cpu_sr -> R20
;           ptcb -> R22,R23
;           prio -> R22
	.even
_OSTimeDlyResume::
	xcall push_gset2
	mov R22,R16
	.dbline -1
	.dbline 153
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                         RESUME A DELAYED TASK
; *
; * Description: This function is used resume a task that has been delayed through a call to either
; *              OSTimeDly() or OSTimeDlyHMSM().  Note that you can call this function to resume a
; *              task that is waiting for an event with timeout.  This would make the task look
; *              like a timeout occurred.
; *
; *              Also, you cannot resume a task that has called OSTimeDlyHMSM() with a combined time that
; *              exceeds 65535 clock ticks.  In other words, if the clock tick runs at 100 Hz then, you will
; *              not be able to resume a delayed task that called OSTimeDlyHMSM(0, 10, 55, 350) or higher:
; *
; *                  (10 Minutes * 60 + 55 Seconds + 0.35) * 100 ticks/second.
; *
; * Arguments  : prio                      specifies the priority of the task to resume
; *
; * Returns    : OS_NO_ERR                 Task has been resumed
; *              OS_PRIO_INVALID           if the priority you specify is higher that the maximum allowed
; *                                        (i.e. >= OS_LOWEST_PRIO)
; *              OS_TIME_NOT_DLY           Task is not waiting for time to expire
; *              OS_TASK_NOT_EXIST         The desired task has not been created or has been assigned to a Mutex.
; *********************************************************************************************************
; */
; 
; #if OS_TIME_DLY_RESUME_EN > 0
; INT8U  OSTimeDlyResume (INT8U prio)
; {
	.dbline 156
;     OS_TCB    *ptcb;
; #if OS_CRITICAL_METHOD == 3                                    /* Storage for CPU status register      */
;     OS_CPU_SR  cpu_sr = 0;
	clr R20
	.dbline 161
; #endif
; 
; 
; 
;     if (prio >= OS_LOWEST_PRIO) {
	cpi R22,8
	brlo L11
	.dbline 161
	.dbline 162
;         return (OS_PRIO_INVALID);
	ldi R16,42
	xjmp L10
L11:
	.dbline 164
;     }
;     OS_ENTER_CRITICAL();
	xcall _OS_CPU_SR_Save
	mov R20,R16
	.dbline 165
;     ptcb = OSTCBPrioTbl[prio];                                 /* Make sure that task exist            */
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_OSTCBPrioTbl
	ldi R25,>_OSTCBPrioTbl
	add R30,R24
	adc R31,R25
	ldd R22,z+0
	ldd R23,z+1
	.dbline 166
;     if (ptcb == (OS_TCB *)0) {
	cpi R22,0
	cpc R22,R23
	brne L13
X3:
	.dbline 166
	.dbline 167
;         OS_EXIT_CRITICAL();
	mov R16,R20
	xcall _OS_CPU_SR_Restore
	.dbline 168
;         return (OS_TASK_NOT_EXIST);                            /* The task does not exist              */
	ldi R16,11
	xjmp L10
L13:
	.dbline 170
;     }
;     if (ptcb == (OS_TCB *)1) {
	cpi R22,1
	ldi R30,0
	cpc R23,R30
	brne L15
	.dbline 170
	.dbline 171
;         OS_EXIT_CRITICAL();
	mov R16,R20
	xcall _OS_CPU_SR_Restore
	.dbline 172
;         return (OS_TASK_NOT_EXIST);                            /* The task does not exist              */
	ldi R16,11
	xjmp L10
L15:
	.dbline 174
;     }
;     if (ptcb->OSTCBDly == 0) {                                 /* See if task is delayed               */
	movw R30,R22
	ldd R2,z+8
	ldd R3,z+9
	tst R2
	brne L17
	tst R3
	brne L17
X4:
	.dbline 174
	.dbline 175
;         OS_EXIT_CRITICAL();
	mov R16,R20
	xcall _OS_CPU_SR_Restore
	.dbline 176
;         return (OS_TIME_NOT_DLY);                              /* Indicate that task was not delayed   */
	ldi R16,80
	xjmp L10
L17:
	.dbline 179
;     }
; 
;     ptcb->OSTCBDly = 0;                                        /* Clear the time delay                 */
	clr R2
	clr R3
	movw R30,R22
	std z+9,R3
	std z+8,R2
	.dbline 180
;     if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {
	movw R30,R22
	ldd R24,z+10
	andi R24,55
	breq L19
	.dbline 180
	.dbline 181
;         ptcb->OSTCBStat   &= ~OS_STAT_PEND_ANY;                /* Yes, Clear status flag               */
	movw R24,R22
	adiw R24,10
	movw R30,R24
	ldd R24,z+0
	andi R24,200
	std z+0,R24
	.dbline 182
;         ptcb->OSTCBPendTO  = TRUE;                             /* Indicate PEND timeout                */
	ldi R24,1
	movw R30,R22
	std z+11,R24
	.dbline 183
	xjmp L20
L19:
	.dbline 183
;     } else {
	.dbline 184
;         ptcb->OSTCBPendTO  = FALSE;
	clr R2
	movw R30,R22
	std z+11,R2
	.dbline 185
;     }
L20:
	.dbline 186
;     if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) {  /* Is task suspended?                   */
	movw R30,R22
	ldd R2,z+10
	clr R3
	sbrc R2,3
	rjmp L21
	.dbline 186
	.dbline 187
;         OSRdyGrp               |= ptcb->OSTCBBitY;             /* No,  Make ready                      */
	movw R30,R22
	ldd R2,z+16
	lds R3,_OSRdyGrp
	or R3,R2
	sts _OSRdyGrp,R3
	.dbline 188
;         OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
	ldi R24,<_OSRdyTbl
	ldi R25,>_OSRdyTbl
	movw R30,R22
	ldd R2,z+14
	clr R3
	add R2,R24
	adc R3,R25
	movw R30,R22
	ldd R4,z+15
	movw R30,R2
	ldd R5,z+0
	or R5,R4
	std z+0,R5
	.dbline 189
;         OS_EXIT_CRITICAL();
	mov R16,R20
	xcall _OS_CPU_SR_Restore
	.dbline 190
;         OS_Sched();                                           /* See if this is new highest priority   */
	xcall _OS_Sched
	.dbline 191
	xjmp L22
L21:
	.dbline 191
;     } else {
	.dbline 192
;         OS_EXIT_CRITICAL();                                   /* Task may be suspended                 */
	mov R16,R20
	xcall _OS_CPU_SR_Restore
	.dbline 193
;     }
L22:
	.dbline 194
;     return (OS_NO_ERR);
	clr R16
	.dbline -2
L10:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r cpu_sr 20 c
	.dbsym r ptcb 22 pS[os_tcb]
	.dbsym r prio 22 c
	.dbend

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?