📄 os_time.lis
字号:
00D2 9B01 movw R18,R22
00D4 00D0 rcall empy32u
00D6 1801 movw R2,R16
00D8 2901 movw R4,R18
00DA 6A2C mov R6,R10
00DC 7724 clr R7
00DE 8824 clr R8
00E0 9924 clr R9
00E2 40E1 ldi R20,16
00E4 5EE0 ldi R21,14
00E6 60E0 ldi R22,0
00E8 70E0 ldi R23,0
00EA 9A92 st -y,R9
00EC 8A92 st -y,R8
00EE 7A92 st -y,R7
00F0 6A92 st -y,R6
00F2 8A01 movw R16,R20
00F4 9B01 movw R18,R22
00F6 00D0 rcall empy32u
00F8 3801 movw R6,R16
00FA 4901 movw R8,R18
00FC 620C add R6,R2
00FE 731C adc R7,R3
0100 841C adc R8,R4
0102 951C adc R9,R5
0104 2C84 ldd R2,y+12
0106 3324 clr R3
0108 4424 clr R4
010A 5524 clr R5
010C 620C add R6,R2
010E 731C adc R7,R3
0110 841C adc R8,R4
0112 951C adc R9,R5
0114 42E3 ldi R20,50
0116 50E0 ldi R21,0
0118 60E0 ldi R22,0
011A 70E0 ldi R23,0
011C 9A92 st -y,R9
011E 8A92 st -y,R8
0120 7A92 st -y,R7
0122 6A92 st -y,R6
0124 8A01 movw R16,R20
0126 9B01 movw R18,R22
0128 00D0 rcall empy32u
012A 1801 movw R2,R16
012C 2901 movw R4,R18
012E 4AE0 ldi R20,10
0130 50E0 ldi R21,0
0132 60E0 ldi R22,0
0134 70E0 ldi R23,0
0136 6E84 ldd R6,y+14
0138 7F84 ldd R7,y+15
013A 8824 clr R8
013C 9924 clr R9
013E 640E add R6,R20
0140 751E adc R7,R21
0142 861E adc R8,R22
0144 971E adc R9,R23
0146 42E3 ldi R20,50
0148 50E0 ldi R21,0
014A 60E0 ldi R22,0
014C 70E0 ldi R23,0
014E 9A92 st -y,R9
0150 8A92 st -y,R8
0152 7A92 st -y,R7
0154 6A92 st -y,R6
0156 8A01 movw R16,R20
0158 9B01 movw R18,R22
015A 00D0 rcall empy32u
015C 48EE ldi R20,232
015E 53E0 ldi R21,3
0160 60E0 ldi R22,0
0162 70E0 ldi R23,0
0164 7A93 st -y,R23
0166 6A93 st -y,R22
0168 5A93 st -y,R21
016A 4A93 st -y,R20
016C 00D0 rcall div32u
016E 200E add R2,R16
0170 311E adc R3,R17
0172 421E adc R4,R18
0174 531E adc R5,R19
0176 FE01 movw R30,R28
0178 2082 std z+0,R2
017A 3182 std z+1,R3
017C 4282 std z+2,R4
017E 5382 std z+3,R5
0180 .dbline 99
0180 ; + OS_TICKS_PER_SEC * ((INT32U)milli + 500L / OS_TICKS_PER_SEC) / 1000L;
0180 ; loops = (INT16U)(ticks / 65536L); /* Compute the integral number of 65536 tick delays */
0180 FE01 movw R30,R28
0182 2080 ldd R2,z+0
0184 3180 ldd R3,z+1
0186 4280 ldd R4,z+2
0188 5380 ldd R5,z+3
018A 5201 movw R10,R4
018C .dbline 100
018C ; ticks = ticks % 65536L; /* Obtain the fractional number of ticks */
018C 4FEF ldi R20,255
018E 5FEF ldi R21,255
0190 60E0 ldi R22,0
0192 70E0 ldi R23,0
0194 FE01 movw R30,R28
0196 2080 ldd R2,z+0
0198 3180 ldd R3,z+1
019A 4280 ldd R4,z+2
019C 5380 ldd R5,z+3
019E 2422 and R2,R20
01A0 3522 and R3,R21
01A2 4622 and R4,R22
01A4 5722 and R5,R23
01A6 FE01 movw R30,R28
01A8 2082 std z+0,R2
01AA 3182 std z+1,R3
01AC 4282 std z+2,R4
01AE 5382 std z+3,R5
01B0 .dbline 101
01B0 ; OSTimeDly((INT16U)ticks);
01B0 FE01 movw R30,R28
01B2 0081 ldd R16,z+0
01B4 1181 ldd R17,z+1
01B6 24DF rcall _OSTimeDly
01B8 09C0 rjmp L21
01BA L20:
01BA .dbline 102
01BA .dbline 103
01BA 00E0 ldi R16,32768
01BC 10E8 ldi R17,128
01BE 20DF rcall _OSTimeDly
01C0 .dbline 104
01C0 00E0 ldi R16,32768
01C2 10E8 ldi R17,128
01C4 1DDF rcall _OSTimeDly
01C6 .dbline 105
01C6 C501 movw R24,R10
01C8 0197 sbiw R24,1
01CA 5C01 movw R10,R24
01CC .dbline 106
01CC L21:
01CC .dbline 102
01CC ; while (loops > 0) {
01CC AA20 tst R10
01CE A9F7 brne L20
01D0 BB20 tst R11
01D2 99F7 brne L20
01D4 X3:
01D4 .dbline 107
01D4 ; OSTimeDly(32768);
01D4 ; OSTimeDly(32768);
01D4 ; loops--;
01D4 ; }
01D4 ; return (OS_NO_ERR);
01D4 0027 clr R16
01D6 01C0 rjmp L8
01D8 L9:
01D8 .dbline 109
01D8 ; }
01D8 ; return (OS_TIME_ZERO_DLY);
01D8 04E5 ldi R16,84
01DA .dbline -2
01DA L8:
01DA 2496 adiw R28,4
01DC 00D0 rcall pop_gset4
01DE .dbline 0 ; func end
01DE 0895 ret
01E0 .dbsym l ticks 0 l
01E0 .dbsym r loops 10 i
01E0 .dbsym l milli 14 i
01E0 .dbsym l seconds 12 c
01E0 .dbsym r minutes 12 c
01E0 .dbsym r hours 10 c
01E0 .dbend
01E0 .dbfunc e OSTimeDlyResume _OSTimeDlyResume fc
01E0 .dbstruct 0 9 .1
01E0 .dbfield 0 OSEventType c
01E0 .dbfield 1 OSEventGrp c
01E0 .dbfield 2 OSEventCnt i
01E0 .dbfield 4 OSEventPtr pV
01E0 .dbfield 6 OSEventTbl A[3:3]c
01E0 .dbend
01E0 .dbstruct 0 16 os_tcb
01E0 .dbfield 0 OSTCBStkPtr pc
01E0 .dbfield 2 OSTCBNext pS[os_tcb]
01E0 .dbfield 4 OSTCBPrev pS[os_tcb]
01E0 .dbfield 6 OSTCBEventPtr pS[.1]
01E0 .dbfield 8 OSTCBDly i
01E0 .dbfield 10 OSTCBStat c
01E0 .dbfield 11 OSTCBPrio c
01E0 .dbfield 12 OSTCBX c
01E0 .dbfield 13 OSTCBY c
01E0 .dbfield 14 OSTCBBitX c
01E0 .dbfield 15 OSTCBBitY c
01E0 .dbend
01E0 ; cpu_sr -> R20
01E0 ; ptcb -> R22,R23
01E0 ; prio -> R22
.even
01E0 _OSTimeDlyResume::
01E0 00D0 rcall push_gset2
01E2 602F mov R22,R16
01E4 .dbline -1
01E4 .dbline 139
01E4 ; }
01E4 ; #endif
01E4 ; /*$PAGE*/
01E4 ; /*
01E4 ; *********************************************************************************************************
01E4 ; * RESUME A DELAYED TASK
01E4 ; *
01E4 ; * Description: This function is used resume a task that has been delayed through a call to either
01E4 ; * OSTimeDly() or OSTimeDlyHMSM(). Note that you MUST NOT call this function to resume a
01E4 ; * task that is waiting for an event with timeout. This situation would make the task look
01E4 ; * like a timeout occurred (unless you desire this effect). Also, you cannot resume a task
01E4 ; * that has called OSTimeDlyHMSM() with a combined time that exceeds 65535 clock ticks. In
01E4 ; * other words, if the clock tick runs at 100 Hz then, you will not be able to resume a
01E4 ; * delayed task that called OSTimeDlyHMSM(0, 10, 55, 350) or higher.
01E4 ; *
01E4 ; * (10 Minutes * 60 + 55 Seconds + 0.35) * 100 ticks/second.
01E4 ; *
01E4 ; * Arguments : prio specifies the priority of the task to resume
01E4 ; *
01E4 ; * Returns : OS_NO_ERR Task has been resumed
01E4 ; * OS_PRIO_INVALID if the priority you specify is higher that the maximum allowed
01E4 ; * (i.e. >= OS_LOWEST_PRIO)
01E4 ; * OS_TIME_NOT_DLY Task is not waiting for time to expire
01E4 ; * OS_TASK_NOT_EXIST The desired task has not been created
01E4 ; *********************************************************************************************************
01E4 ; */
01E4 ;
01E4 ; #if OS_TIME_DLY_RESUME_EN > 0
01E4 ; INT8U OSTimeDlyResume (INT8U prio)
01E4 ; {
01E4 .dbline 146
01E4 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
01E4 ; OS_CPU_SR cpu_sr;
01E4 ; #endif
01E4 ; OS_TCB *ptcb;
01E4 ;
01E4 ;
01E4 ; if (prio >= OS_LOWEST_PRIO) {
01E4 6431 cpi R22,20
01E6 10F0 brlo L24
01E8 .dbline 146
01E8 .dbline 147
01E8 ; return (OS_PRIO_INVALID);
01E8 0AE2 ldi R16,42
01EA 43C0 rjmp L23
01EC L24:
01EC .dbline 149
01EC ; }
01EC ; OS_ENTER_CRITICAL();
01EC 00D0 rcall _OS_CPU_SR_Save
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -