📄 os_tmr.lst
字号:
136 }
137 break;
138
139 case OS_TMR_OPT_ONE_SHOT:
140 if (dly == 0) {
\ ??OSTmrCreate_3:
\ 0000002C 4046 MOV R0,R8
\ 0000002E 0028 CMP R0,#+0
\ 00000030 05D1 BNE.N ??OSTmrCreate_5
141 *perr = OS_ERR_TMR_INVALID_DLY;
\ 00000032 8220 MOVS R0,#+130
\ 00000034 2070 STRB R0,[R4, #+0]
\ 00000036 ECE7 B.N ??OSTmrCreate_1
142 return ((OS_TMR *)0);
143 }
144 break;
145
146 default:
147 *perr = OS_ERR_TMR_INVALID_OPT;
\ ??OSTmrCreate_4:
\ 00000038 8420 MOVS R0,#+132
\ 0000003A 2070 STRB R0,[R4, #+0]
\ 0000003C E9E7 B.N ??OSTmrCreate_1
148 return ((OS_TMR *)0);
149 }
150 #endif
151 if (OSIntNesting > 0) { /* See if trying to call from an ISR */
\ ??OSTmrCreate_5:
\ 0000003E .... LDR.N R0,??DataTable6 ;; OSIntNesting
\ 00000040 0078 LDRB R0,[R0, #+0]
\ 00000042 0028 CMP R0,#+0
\ 00000044 02D0 BEQ.N ??OSTmrCreate_6
152 *perr = OS_ERR_TMR_ISR;
\ 00000046 8B20 MOVS R0,#+139
\ 00000048 2070 STRB R0,[R4, #+0]
\ 0000004A E2E7 B.N ??OSTmrCreate_1
153 return ((OS_TMR *)0);
154 }
155 OSTmr_Lock();
\ ??OSTmrCreate_6:
\ 0000004C ........ BL OSTmr_Lock
156 ptmr = OSTmr_Alloc(); /* Obtain a timer from the free pool */
\ 00000050 ........ BL OSTmr_Alloc
\ 00000054 0500 MOVS R5,R0
157 if (ptmr == (OS_TMR *)0) {
\ 00000056 04D1 BNE.N ??OSTmrCreate_7
158 OSTmr_Unlock();
\ 00000058 ........ BL OSTmr_Unlock
159 *perr = OS_ERR_TMR_NON_AVAIL;
\ 0000005C 8620 MOVS R0,#+134
\ 0000005E 2070 STRB R0,[R4, #+0]
\ 00000060 D7E7 B.N ??OSTmrCreate_1
160 return ((OS_TMR *)0);
161 }
162 ptmr->OSTmrState = OS_TMR_STATE_STOPPED; /* Indicate that timer is not running yet */
\ ??OSTmrCreate_7:
\ 00000062 3030 ADDS R0,R0,#+48
\ 00000064 0121 MOVS R1,#+1
\ 00000066 4170 STRB R1,[R0, #+1]
163 ptmr->OSTmrDly = dly;
\ 00000068 2E00 MOVS R6,R5
\ 0000006A 361D ADDS R6,R6,#+4
\ 0000006C C6F81480 STR R8,[R6, #+20]
164 ptmr->OSTmrPeriod = period;
\ 00000070 C6F81890 STR R9,[R6, #+24]
165 ptmr->OSTmrOpt = opt;
\ 00000074 0770 STRB R7,[R0, #+0]
166 ptmr->OSTmrCallback = callback;
\ 00000076 C6F800A0 STR R10,[R6, #+0]
167 ptmr->OSTmrCallbackArg = callback_arg;
\ 0000007A 0898 LDR R0,[SP, #+32]
\ 0000007C 7060 STR R0,[R6, #+4]
168 #if OS_TMR_CFG_NAME_SIZE > 0
169 if (pname !=(INT8U *)0) {
\ 0000007E 0027 MOVS R7,#+0
\ 00000080 0998 LDR R0,[SP, #+36]
\ 00000082 0028 CMP R0,#+0
\ 00000084 08D0 BEQ.N ??OSTmrCreate_8
170 len = OS_StrLen(pname); /* Copy timer name */
\ 00000086 ........ _BLF OS_StrLen,??OS_StrLen??rT
171 if (len < OS_TMR_CFG_NAME_SIZE) {
\ 0000008A 1028 CMP R0,#+16
\ 0000008C 0AD2 BCS.N ??OSTmrCreate_9
172 (void)OS_StrCopy(ptmr->OSTmrName, pname);
\ 0000008E 0999 LDR R1,[SP, #+36]
\ 00000090 2800 MOVS R0,R5
\ 00000092 2030 ADDS R0,R0,#+32
\ 00000094 ........ _BLF OS_StrCopy,??OS_StrCopy??rT
173 } else {
174 #if OS_TMR_CFG_NAME_SIZE > 1
175 ptmr->OSTmrName[0] = '#'; /* Invalid size specified */
176 ptmr->OSTmrName[1] = OS_ASCII_NUL;
177 #endif
178 *perr = OS_ERR_TMR_NAME_TOO_LONG;
179 OSTmr_Unlock();
180 return (ptmr);
181 }
182 }
183 #endif
184 OSTmr_Unlock();
\ ??OSTmrCreate_8:
\ 00000098 ........ BL OSTmr_Unlock
185 *perr = OS_ERR_NONE;
\ 0000009C 2770 STRB R7,[R4, #+0]
186 return (ptmr);
\ 0000009E 2800 MOVS R0,R5
\ ??OSTmrCreate_2:
\ 000000A0 BDE8F087 POP {R4-R10,PC} ;; return
\ ??OSTmrCreate_9:
\ 000000A4 2320 MOVS R0,#+35
\ 000000A6 3077 STRB R0,[R6, #+28]
\ 000000A8 7777 STRB R7,[R6, #+29]
\ 000000AA 8C20 MOVS R0,#+140
\ 000000AC 2070 STRB R0,[R4, #+0]
\ 000000AE ........ BL OSTmr_Unlock
\ 000000B2 2800 MOVS R0,R5
\ 000000B4 F4E7 B.N ??OSTmrCreate_2
187 }
188 #endif
189
190 /*$PAGE*/
191 /*
192 ************************************************************************************************************************
193 * DELETE A TIMER
194 *
195 * Description: This function is called by your application code to delete a timer.
196 *
197 * Arguments : ptmr Is a pointer to the timer to stop and delete.
198 *
199 * perr Is a pointer to an error code. '*perr' will contain one of the following:
200 * OS_ERR_NONE
201 * OS_ERR_TMR_INVALID 'ptmr' is a NULL pointer
202 * OS_ERR_TMR_INVALID_TYPE 'ptmr' is not pointing to an OS_TMR
203 * OS_ERR_TMR_ISR if the function was called from an ISR
204 * OS_ERR_TMR_INACTIVE if the timer was not created
205 * OS_ERR_TMR_INVALID_STATE the timer is in an invalid state
206 *
207 * Returns : OS_TRUE If the call was successful
208 * OS_FALSE If not
209 ************************************************************************************************************************
210 */
211
212 #if OS_TMR_EN > 0
\ In segment CODE, align 4, keep-with-next
213 BOOLEAN OSTmrDel (OS_TMR *ptmr,
214 INT8U *perr)
215 {
\ OSTmrDel:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 00000002 0500 MOVS R5,R0
\ 00000004 0C00 MOVS R4,R1
216 #if OS_ARG_CHK_EN > 0
217 if (perr == (INT8U *)0) { /* Validate arguments */
\ 00000006 01D1 BNE.N ??OSTmrDel_0
218 return (OS_FALSE);
\ ??OSTmrDel_1:
\ 00000008 0020 MOVS R0,#+0
\ 0000000A 30BD POP {R4,R5,PC} ;; return
219 }
220 if (ptmr == (OS_TMR *)0) {
\ ??OSTmrDel_0:
\ 0000000C 002D CMP R5,#+0
\ 0000000E 02D1 BNE.N ??OSTmrDel_2
221 *perr = OS_ERR_TMR_INVALID;
\ 00000010 8A20 MOVS R0,#+138
\ 00000012 2070 STRB R0,[R4, #+0]
\ 00000014 F8E7 B.N ??OSTmrDel_1
222 return (OS_FALSE);
223 }
224 #endif
225 if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
\ ??OSTmrDel_2:
\ 00000016 2878 LDRB R0,[R5, #+0]
\ 00000018 6428 CMP R0,#+100
\ 0000001A 02D0 BEQ.N ??OSTmrDel_3
226 *perr = OS_ERR_TMR_INVALID_TYPE;
\ 0000001C 8920 MOVS R0,#+137
\ 0000001E 2070 STRB R0,[R4, #+0]
\ 00000020 F2E7 B.N ??OSTmrDel_1
227 return (OS_FALSE);
228 }
229 if (OSIntNesting > 0) { /* See if trying to call from an ISR */
\ ??OSTmrDel_3:
\ 00000022 .... LDR.N R0,??DataTable6 ;; OSIntNesting
\ 00000024 0078 LDRB R0,[R0, #+0]
\ 00000026 0028 CMP R0,#+0
\ 00000028 02D0 BEQ.N ??OSTmrDel_4
230 *perr = OS_ERR_TMR_ISR;
\ 0000002A 8B20 MOVS R0,#+139
\ 0000002C 2070 STRB R0,[R4, #+0]
\ 0000002E EBE7 B.N ??OSTmrDel_1
231 return (OS_FALSE);
232 }
233 OSTmr_Lock();
\ ??OSTmrDel_4:
\ 00000030 ........ BL OSTmr_Lock
234 switch (ptmr->OSTmrState) {
\ 00000034 95F83100 LDRB R0,[R5, #+49]
\ 00000038 0028 CMP R0,#+0
\ 0000003A 10D0 BEQ.N ??OSTmrDel_5
\ 0000003C 401E SUBS R0,R0,#+1
\ 0000003E 0128 CMP R0,#+1
\ 00000040 04D9 BLS.N ??OSTmrDel_6
\ 00000042 801E SUBS R0,R0,#+2
\ 00000044 10D1 BNE.N ??OSTmrDel_7
235 case OS_TMR_STATE_RUNNING:
236 OSTmr_Unlink(ptmr); /* Remove from current wheel spoke */
\ 00000046 2800 MOVS R0,R5
\ 00000048 ........ BL OSTmr_Unlink
237 OSTmr_Free(ptmr); /* Return timer to free list of timers */
238 OSTmr_Unlock();
239 *perr = OS_ERR_NONE;
240 return (OS_TRUE);
241
242 case OS_TMR_STATE_STOPPED: /* Timer has not started or ... */
243 case OS_TMR_STATE_COMPLETED: /* ... timer has completed the ONE-SHOT time */
244 OSTmr_Free(ptmr); /* Return timer to free list of timers */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -