📄 os_time.lst
字号:
\ In segment CODE, align 4, keep-with-next
92 INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U ms)
93 {
\ OSTimeDlyHMSM:
\ 00000000 10402DE9 PUSH {R4,LR}
94 INT32U ticks;
95 INT16U loops;
96
97
98 #if OS_ARG_CHK_EN > 0
99 if (hours == 0) {
\ 00000004 000050E3 CMP R0,#+0
\ 00000008 0700001A BNE ??OSTimeDlyHMSM_0
100 if (minutes == 0) {
\ 0000000C 000051E3 CMP R1,#+0
\ 00000010 0500001A BNE ??OSTimeDlyHMSM_0
101 if (seconds == 0) {
\ 00000014 000052E3 CMP R2,#+0
\ 00000018 0300001A BNE ??OSTimeDlyHMSM_0
102 if (ms == 0) {
\ 0000001C 000053E3 CMP R3,#+0
\ 00000020 0100001A BNE ??OSTimeDlyHMSM_0
103 return (OS_ERR_TIME_ZERO_DLY);
\ 00000024 5400A0E3 MOV R0,#+84
\ 00000028 290000EA B ??OSTimeDlyHMSM_1
104 }
105 }
106 }
107 }
108 if (minutes > 59) {
\ ??OSTimeDlyHMSM_0:
\ 0000002C 3C0051E3 CMP R1,#+60
\ 00000030 0100003A BCC ??OSTimeDlyHMSM_2
109 return (OS_ERR_TIME_INVALID_MINUTES); /* Validate arguments to be within range */
\ 00000034 5100A0E3 MOV R0,#+81
\ 00000038 250000EA B ??OSTimeDlyHMSM_1
110 }
111 if (seconds > 59) {
\ ??OSTimeDlyHMSM_2:
\ 0000003C 3C0052E3 CMP R2,#+60
\ 00000040 0100003A BCC ??OSTimeDlyHMSM_3
112 return (OS_ERR_TIME_INVALID_SECONDS);
\ 00000044 5200A0E3 MOV R0,#+82
\ 00000048 210000EA B ??OSTimeDlyHMSM_1
113 }
114 if (ms > 999) {
\ ??OSTimeDlyHMSM_3:
\ 0000004C FA0F53E3 CMP R3,#+1000
\ 00000050 0100003A BCC ??OSTimeDlyHMSM_4
115 return (OS_ERR_TIME_INVALID_MS);
\ 00000054 5300A0E3 MOV R0,#+83
\ 00000058 1D0000EA 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:
\ 0000005C E14EA0E3 MOV R4,#+3600
\ 00000060 3CC0A0E3 MOV R12,#+60
\ 00000064 9C0111E0 MULS R1,R12,R1
\ 00000068 941020E0 MLA R0,R4,R0,R1
\ 0000006C 002092E0 ADDS R2,R2,R0
\ 00000070 FA4FA0E3 MOV R4,#+1000
\ 00000074 FA1FA0E3 MOV R1,#+1000
\ 00000078 910310E0 MULS R0,R1,R3
\ 0000007C FA1FA0E3 MOV R1,#+1000
\ 00000080 ........ _BLF ??divu32_a,??rA??divu32_a
\ 00000084 941220E0 MLA R0,R4,R2,R1
122 loops = (INT16U)(ticks / 65536L); /* Compute the integral number of 65536 tick delays */
\ 00000088 2048B0E1 LSRS R4,R0,#+16
123 ticks = ticks % 65536L; /* Obtain the fractional number of ticks */
\ 0000008C 0008A0E1 MOV R0,R0, LSL #+16
\ 00000090 2008B0E1 MOVS R0,R0, LSR #+16
124 OSTimeDly((INT16U)ticks);
\ 00000094 0008A0E1 MOV R0,R0, LSL #+16
\ 00000098 2008B0E1 MOVS R0,R0, LSR #+16
\ 0000009C ........ BL OSTimeDly
\ 000000A0 060000EA B ??OSTimeDlyHMSM_5
125 while (loops > 0) {
126 OSTimeDly((INT16U)32768u);
\ ??OSTimeDlyHMSM_6:
\ 000000A4 800CA0E3 MOV R0,#+32768
\ 000000A8 ........ BL OSTimeDly
127 OSTimeDly((INT16U)32768u);
\ 000000AC 800CA0E3 MOV R0,#+32768
\ 000000B0 ........ BL OSTimeDly
128 loops--;
\ 000000B4 FF00A0E3 MOV R0,#+255
\ 000000B8 FF0C80E3 ORR R0,R0,#0xFF00
\ 000000BC 044090E0 ADDS R4,R0,R4
129 }
\ ??OSTimeDlyHMSM_5:
\ 000000C0 0448A0E1 MOV R4,R4, LSL #+16
\ 000000C4 2448B0E1 MOVS R4,R4, LSR #+16
\ 000000C8 010054E3 CMP R4,#+1
\ 000000CC F4FFFF2A BCS ??OSTimeDlyHMSM_6
130 return (OS_ERR_NONE);
\ 000000D0 0000A0E3 MOV R0,#+0
\ ??OSTimeDlyHMSM_1:
\ 000000D4 1080BDE8 POP {R4,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 10402DE9 PUSH {R4,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
165 #endif
166
167
168
169 if (prio >= OS_LOWEST_PRIO) {
\ 0000000C 1F0054E3 CMP R4,#+31
\ 00000010 0100003A BCC ??OSTimeDlyResume_0
170 return (OS_ERR_PRIO_INVALID);
\ 00000014 2A00A0E3 MOV R0,#+42
\ 00000018 370000EA B ??OSTimeDlyResume_1
171 }
172 OS_ENTER_CRITICAL();
\ ??OSTimeDlyResume_0:
\ 0000001C ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rA
173 ptcb = OSTCBPrioTbl[prio]; /* Make sure that task exist */
\ 00000020 0410A0E3 MOV R1,#+4
\ 00000024 D4209FE5 LDR R2,??OSTimeDlyResume_2 ;; OSTCBPrioTbl
\ 00000028 912422E0 MLA R2,R1,R4,R2
\ 0000002C 001092E5 LDR R1,[R2, #+0]
174 if (ptcb == (OS_TCB *)0) {
\ 00000030 000051E3 CMP R1,#+0
\ 00000034 0200001A BNE ??OSTimeDlyResume_3
175 OS_EXIT_CRITICAL();
\ 00000038 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
176 return (OS_ERR_TASK_NOT_EXIST); /* The task does not exist */
\ 0000003C 4300A0E3 MOV R0,#+67
\ 00000040 2D0000EA B ??OSTimeDlyResume_1
177 }
178 if (ptcb == (OS_TCB *)1) {
\ ??OSTimeDlyResume_3:
\ 00000044 010051E3 CMP R1,#+1
\ 00000048 0200001A BNE ??OSTimeDlyResume_4
179 OS_EXIT_CRITICAL();
\ 0000004C ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
180 return (OS_ERR_TASK_NOT_EXIST); /* The task does not exist */
\ 00000050 4300A0E3 MOV R0,#+67
\ 00000054 280000EA B ??OSTimeDlyResume_1
181 }
182 if (ptcb->OSTCBDly == 0) { /* See if task is delayed */
\ ??OSTimeDlyResume_4:
\ 00000058 BA22D1E1 LDRH R2,[R1, #+42]
\ 0000005C 000052E3 CMP R2,#+0
\ 00000060 0200001A BNE ??OSTimeDlyResume_5
183 OS_EXIT_CRITICAL();
\ 00000064 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
184 return (OS_ERR_TIME_NOT_DLY); /* Indicate that task was not delayed */
\ 00000068 5000A0E3 MOV R0,#+80
\ 0000006C 220000EA B ??OSTimeDlyResume_1
185 }
186
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -