📄 os_time.lst
字号:
\ 00000020 0500001A BNE ??OSTimeDlyHMSM_0
101 if (seconds == 0) {
\ 00000024 000056E3 CMP R6,#+0
\ 00000028 0300001A BNE ??OSTimeDlyHMSM_0
102 if (ms == 0) {
\ 0000002C 000057E3 CMP R7,#+0
\ 00000030 0100001A BNE ??OSTimeDlyHMSM_0
103 return (OS_ERR_TIME_ZERO_DLY);
\ 00000034 5400A0E3 MOV R0,#+84
\ 00000038 300000EA B ??OSTimeDlyHMSM_1
104 }
105 }
106 }
107 }
108 if (minutes > 59) {
\ ??OSTimeDlyHMSM_0:
\ 0000003C 3C0055E3 CMP R5,#+60
\ 00000040 0100003A BCC ??OSTimeDlyHMSM_2
109 return (OS_ERR_TIME_INVALID_MINUTES); /* Validate arguments to be within range */
\ 00000044 5100A0E3 MOV R0,#+81
\ 00000048 2C0000EA B ??OSTimeDlyHMSM_1
110 }
111 if (seconds > 59) {
\ ??OSTimeDlyHMSM_2:
\ 0000004C 3C0056E3 CMP R6,#+60
\ 00000050 0100003A BCC ??OSTimeDlyHMSM_3
112 return (OS_ERR_TIME_INVALID_SECONDS);
\ 00000054 5200A0E3 MOV R0,#+82
\ 00000058 280000EA B ??OSTimeDlyHMSM_1
113 }
114 if (ms > 999) {
\ ??OSTimeDlyHMSM_3:
\ 0000005C FA0F57E3 CMP R7,#+1000
\ 00000060 0100003A BCC ??OSTimeDlyHMSM_4
115 return (OS_ERR_TIME_INVALID_MS);
\ 00000064 5300A0E3 MOV R0,#+83
\ 00000068 240000EA B ??OSTimeDlyHMSM_1
116 }
117 #endif
118 /* Compute the total number of clock ticks required.. */
119 /* .. (rounded to the nearest tick) */
120 ticks = ((INT32U)hours * 3600L + (INT32U)minutes * 60L + (INT32U)seconds) * OS_TICKS_PER_SEC
121 + OS_TICKS_PER_SEC * ((INT32U)ms + 500L / OS_TICKS_PER_SEC) / 1000L;
\ ??OSTimeDlyHMSM_4:
\ 0000006C 0400B0E1 MOVS R0,R4
\ 00000070 E11EA0E3 MOV R1,#+3600
\ 00000074 0520B0E1 MOVS R2,R5
\ 00000078 3C30A0E3 MOV R3,#+60
\ 0000007C 930212E0 MULS R2,R3,R2
\ 00000080 912020E0 MLA R0,R1,R0,R2
\ 00000084 0610B0E1 MOVS R1,R6
\ 00000088 003091E0 ADDS R3,R1,R0
\ 0000008C FA2FA0E3 MOV R2,#+1000
\ 00000090 0700B0E1 MOVS R0,R7
\ 00000094 FA1FA0E3 MOV R1,#+1000
\ 00000098 910010E0 MULS R0,R1,R0
\ 0000009C FA1FA0E3 MOV R1,#+1000
\ 000000A0 ........ _BLF ??divu32_a,??rA??divu32_a
\ 000000A4 921320E0 MLA R0,R2,R3,R1
\ 000000A8 0080B0E1 MOVS R8,R0
122 loops = (INT16U)(ticks / 65536L); /* Compute the integral number of 65536 tick delays */
\ 000000AC 2808B0E1 LSRS R0,R8,#+16
\ 000000B0 0090B0E1 MOVS R9,R0
123 ticks = ticks % 65536L; /* Obtain the fractional number of ticks */
\ 000000B4 0888A0E1 MOV R8,R8, LSL #+16
\ 000000B8 2888B0E1 MOVS R8,R8, LSR #+16
124 OSTimeDly((INT16U)ticks);
\ 000000BC 0800B0E1 MOVS R0,R8
\ 000000C0 0008A0E1 MOV R0,R0, LSL #+16
\ 000000C4 2008B0E1 MOVS R0,R0, LSR #+16
\ 000000C8 ........ BL OSTimeDly
125 while (loops > 0) {
\ ??OSTimeDlyHMSM_5:
\ 000000CC 0998A0E1 MOV R9,R9, LSL #+16
\ 000000D0 2998B0E1 MOVS R9,R9, LSR #+16
\ 000000D4 010059E3 CMP R9,#+1
\ 000000D8 0700003A BCC ??OSTimeDlyHMSM_6
126 OSTimeDly((INT16U)32768u);
\ 000000DC 800CA0E3 MOV R0,#+32768
\ 000000E0 ........ BL OSTimeDly
127 OSTimeDly((INT16U)32768u);
\ 000000E4 800CA0E3 MOV R0,#+32768
\ 000000E8 ........ BL OSTimeDly
128 loops--;
\ 000000EC FF00A0E3 MOV R0,#+255
\ 000000F0 FF0C80E3 ORR R0,R0,#0xFF00
\ 000000F4 099090E0 ADDS R9,R0,R9
\ 000000F8 F3FFFFEA B ??OSTimeDlyHMSM_5
129 }
130 return (OS_ERR_NONE);
\ ??OSTimeDlyHMSM_6:
\ 000000FC 0000A0E3 MOV R0,#+0
\ ??OSTimeDlyHMSM_1:
\ 00000100 F083BDE8 POP {R4-R9,PC} ;; return
131 }
132 #endif
133 /*$PAGE*/
134 /*
135 *********************************************************************************************************
136 * RESUME A DELAYED TASK
137 *
138 * Description: This function is used resume a task that has been delayed through a call to either
139 * OSTimeDly() or OSTimeDlyHMSM(). Note that you can call this function to resume a
140 * task that is waiting for an event with timeout. This would make the task look
141 * like a timeout occurred.
142 *
143 * Also, you cannot resume a task that has called OSTimeDlyHMSM() with a combined time that
144 * exceeds 65535 clock ticks. In other words, if the clock tick runs at 100 Hz then, you will
145 * not be able to resume a delayed task that called OSTimeDlyHMSM(0, 10, 55, 350) or higher:
146 *
147 * (10 Minutes * 60 + 55 Seconds + 0.35) * 100 ticks/second.
148 *
149 * Arguments : prio specifies the priority of the task to resume
150 *
151 * Returns : OS_ERR_NONE Task has been resumed
152 * OS_ERR_PRIO_INVALID if the priority you specify is higher that the maximum allowed
153 * (i.e. >= OS_LOWEST_PRIO)
154 * OS_ERR_TIME_NOT_DLY Task is not waiting for time to expire
155 * OS_ERR_TASK_NOT_EXIST The desired task has not been created or has been assigned to a Mutex.
156 *********************************************************************************************************
157 */
158
159 #if OS_TIME_DLY_RESUME_EN > 0
\ In segment CODE, align 4, keep-with-next
160 INT8U OSTimeDlyResume (INT8U prio)
161 {
\ OSTimeDlyResume:
\ 00000000 70402DE9 PUSH {R4-R6,LR}
\ 00000004 0040B0E1 MOVS R4,R0
162 OS_TCB *ptcb;
163 #if OS_CRITICAL_METHOD == 3 /* Storage for CPU status register */
164 OS_CPU_SR cpu_sr = 0;
\ 00000008 0000A0E3 MOV R0,#+0
\ 0000000C 0060B0E1 MOVS R6,R0
165 #endif
166
167
168
169 if (prio >= OS_LOWEST_PRIO) {
\ 00000010 1F0054E3 CMP R4,#+31
\ 00000014 0100003A BCC ??OSTimeDlyResume_0
170 return (OS_ERR_PRIO_INVALID);
\ 00000018 2A00A0E3 MOV R0,#+42
\ 0000001C 3F0000EA B ??OSTimeDlyResume_1
171 }
172 OS_ENTER_CRITICAL();
\ ??OSTimeDlyResume_0:
\ 00000020 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rA
\ 00000024 0060B0E1 MOVS R6,R0
173 ptcb = OSTCBPrioTbl[prio]; /* Make sure that task exist */
\ 00000028 0400B0E1 MOVS R0,R4
\ 0000002C 0410A0E3 MOV R1,#+4
\ 00000030 EC209FE5 LDR R2,??OSTimeDlyResume_2 ;; OSTCBPrioTbl
\ 00000034 912020E0 MLA R0,R1,R0,R2
\ 00000038 000090E5 LDR R0,[R0, #+0]
\ 0000003C 0050B0E1 MOVS R5,R0
174 if (ptcb == (OS_TCB *)0) {
\ 00000040 000055E3 CMP R5,#+0
\ 00000044 0300001A BNE ??OSTimeDlyResume_3
175 OS_EXIT_CRITICAL();
\ 00000048 0600B0E1 MOVS R0,R6
\ 0000004C ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
176 return (OS_ERR_TASK_NOT_EXIST); /* The task does not exist */
\ 00000050 4300A0E3 MOV R0,#+67
\ 00000054 310000EA B ??OSTimeDlyResume_1
177 }
178 if (ptcb == (OS_TCB *)1) {
\ ??OSTimeDlyResume_3:
\ 00000058 010055E3 CMP R5,#+1
\ 0000005C 0300001A BNE ??OSTimeDlyResume_4
179 OS_EXIT_CRITICAL();
\ 00000060 0600B0E1 MOVS R0,R6
\ 00000064 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
180 return (OS_ERR_TASK_NOT_EXIST); /* The task does not exist */
\ 00000068 4300A0E3 MOV R0,#+67
\ 0000006C 2B0000EA B ??OSTimeDlyResume_1
181 }
182 if (ptcb->OSTCBDly == 0) { /* See if task is delayed */
\ ??OSTimeDlyResume_4:
\ 00000070 BA02D5E1 LDRH R0,[R5, #+42]
\ 00000074 000050E3 CMP R0,#+0
\ 00000078 0300001A BNE ??OSTimeDlyResume_5
183 OS_EXIT_CRITICAL();
\ 0000007C 0600B0E1 MOVS R0,R6
\ 00000080 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
184 return (OS_ERR_TIME_NOT_DLY); /* Indicate that task was not delayed */
\ 00000084 5000A0E3 MOV R0,#+80
\ 00000088 240000EA B ??OSTimeDlyResume_1
185 }
186
187 ptcb->OSTCBDly = 0; /* Clear the time delay */
\ ??OSTimeDlyResume_5:
\ 0000008C 0000A0E3 MOV R0,#+0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -