📄 os_q.lst
字号:
\ 00000038 0027 MOVS R7,#+0
226 }
227 switch (opt) {
\ ??OSQDel_7:
\ 0000003A 6846 MOV R0,SP
\ 0000003C 0078 LDRB R0,[R0, #+0]
\ 0000003E 0028 CMP R0,#+0
\ 00000040 02D0 BEQ ??OSQDel_8
\ 00000042 0128 CMP R0,#+1
\ 00000044 25D0 BEQ ??OSQDel_9
\ 00000046 42E0 B ??OSQDel_10
228 case OS_DEL_NO_PEND: /* Delete queue only if no task waiting */
229 if (tasks_waiting == FALSE) {
\ ??OSQDel_8:
\ 00000048 002F CMP R7,#+0
\ 0000004A 18D1 BNE ??OSQDel_11
230 #if OS_EVENT_NAME_SIZE > 1
231 pevent->OSEventName[0] = '?'; /* Unknown name */
\ 0000004C 3F20 MOVS R0,#+63
\ 0000004E 2074 STRB R0,[R4, #+16]
232 pevent->OSEventName[1] = OS_ASCII_NUL;
\ 00000050 0020 MOVS R0,#+0
\ 00000052 6074 STRB R0,[R4, #+17]
233 #endif
234 pq = (OS_Q *)pevent->OSEventPtr; /* Return OS_Q to free list */
\ 00000054 6068 LDR R0,[R4, #+4]
235 pq->OSQPtr = OSQFreeList;
\ 00000056 .... LDR R1,??DataTable11 ;; OSQFreeList
\ 00000058 0968 LDR R1,[R1, #+0]
\ 0000005A 0160 STR R1,[R0, #+0]
236 OSQFreeList = pq;
\ 0000005C .... LDR R1,??DataTable11 ;; OSQFreeList
\ 0000005E 0860 STR R0,[R1, #+0]
237 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
\ 00000060 0020 MOVS R0,#+0
\ 00000062 2070 STRB R0,[R4, #+0]
238 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
\ 00000064 .... LDR R0,??DataTable13 ;; OSEventFreeList
\ 00000066 0068 LDR R0,[R0, #+0]
\ 00000068 6060 STR R0,[R4, #+4]
239 pevent->OSEventCnt = 0;
\ 0000006A 0020 MOVS R0,#+0
\ 0000006C 6080 STRH R0,[R4, #+2]
240 OSEventFreeList = pevent; /* Get next free event control block */
\ 0000006E .... LDR R0,??DataTable13 ;; OSEventFreeList
\ 00000070 0460 STR R4,[R0, #+0]
241 OS_EXIT_CRITICAL();
\ 00000072 3000 MOVS R0,R6
\ 00000074 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
242 *err = OS_NO_ERR;
\ ??OSQDel_12:
\ 00000078 0020 MOVS R0,#+0
\ 0000007A 2870 STRB R0,[R5, #+0]
243 return ((OS_EVENT *)0); /* Queue has been deleted */
\ 0000007C 2DE0 B ??OSQDel_2
244 } else {
245 OS_EXIT_CRITICAL();
\ ??OSQDel_11:
\ 0000007E 3000 MOVS R0,R6
\ 00000080 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
246 *err = OS_ERR_TASK_WAITING;
\ 00000084 0820 MOVS R0,#+8
\ 00000086 26E0 B.N ??OSQDel_5
247 return (pevent);
248 }
249
250 case OS_DEL_ALWAYS: /* Always delete the queue */
251 while (pevent->OSEventGrp != 0x00) { /* Ready ALL tasks waiting for queue */
252 OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q);
\ ??OSQDel_13:
\ 00000088 0422 MOVS R2,#+4
\ 0000008A 0021 MOVS R1,#+0
\ 0000008C 2000 MOVS R0,R4
\ 0000008E ........ _BLF OS_EventTaskRdy,??OS_EventTaskRdy??rT
253 }
\ ??OSQDel_9:
\ 00000092 6078 LDRB R0,[R4, #+1]
\ 00000094 0028 CMP R0,#+0
\ 00000096 F7D1 BNE ??OSQDel_13
254 #if OS_EVENT_NAME_SIZE > 1
255 pevent->OSEventName[0] = '?'; /* Unknown name */
\ 00000098 3F20 MOVS R0,#+63
\ 0000009A 2074 STRB R0,[R4, #+16]
256 pevent->OSEventName[1] = OS_ASCII_NUL;
\ 0000009C 0020 MOVS R0,#+0
\ 0000009E 6074 STRB R0,[R4, #+17]
257 #endif
258 pq = (OS_Q *)pevent->OSEventPtr; /* Return OS_Q to free list */
\ 000000A0 6068 LDR R0,[R4, #+4]
259 pq->OSQPtr = OSQFreeList;
\ 000000A2 .... LDR R1,??DataTable11 ;; OSQFreeList
\ 000000A4 0968 LDR R1,[R1, #+0]
\ 000000A6 0160 STR R1,[R0, #+0]
260 OSQFreeList = pq;
\ 000000A8 .... LDR R1,??DataTable11 ;; OSQFreeList
\ 000000AA 0860 STR R0,[R1, #+0]
261 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
\ 000000AC 0020 MOVS R0,#+0
\ 000000AE 2070 STRB R0,[R4, #+0]
262 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
\ 000000B0 .... LDR R0,??DataTable13 ;; OSEventFreeList
\ 000000B2 0068 LDR R0,[R0, #+0]
\ 000000B4 6060 STR R0,[R4, #+4]
263 pevent->OSEventCnt = 0;
\ 000000B6 0020 MOVS R0,#+0
\ 000000B8 6080 STRH R0,[R4, #+2]
264 OSEventFreeList = pevent; /* Get next free event control block */
\ 000000BA .... LDR R0,??DataTable13 ;; OSEventFreeList
\ 000000BC 0460 STR R4,[R0, #+0]
265 OS_EXIT_CRITICAL();
\ 000000BE 3000 MOVS R0,R6
\ 000000C0 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
266 if (tasks_waiting == TRUE) { /* Reschedule only if task(s) were waiting */
\ 000000C4 012F CMP R7,#+1
\ 000000C6 D7D1 BNE ??OSQDel_12
267 OS_Sched(); /* Find highest priority task ready to run */
\ 000000C8 ........ _BLF OS_Sched,??OS_Sched??rT
268 }
269 *err = OS_NO_ERR;
\ ??OSQDel_14:
\ 000000CC D4E7 B.N ??OSQDel_12
270 return ((OS_EVENT *)0); /* Queue has been deleted */
271
272 default:
273 OS_EXIT_CRITICAL();
\ ??OSQDel_10:
\ 000000CE 3000 MOVS R0,R6
\ 000000D0 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
274 *err = OS_ERR_INVALID_OPT;
\ 000000D4 0720 MOVS R0,#+7
\ ??OSQDel_5:
\ 000000D6 2870 STRB R0,[R5, #+0]
275 return (pevent);
\ 000000D8 2000 MOVS R0,R4
\ ??OSQDel_2:
\ 000000DA 01B0 ADD SP,SP,#+4
\ 000000DC F0BC POP {R4-R7}
\ 000000DE 02BC POP {R1}
\ 000000E0 0847 BX R1 ;; return
276 }
277 }
278 #endif
279
280 /*$PAGE*/
281 /*
282 *********************************************************************************************************
283 * FLUSH QUEUE
284 *
285 * Description : This function is used to flush the contents of the message queue.
286 *
287 * Arguments : none
288 *
289 * Returns : OS_NO_ERR upon success
290 * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a queue
291 * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer
292 *
293 * WARNING : You should use this function with great care because, when to flush the queue, you LOOSE
294 * the references to what the queue entries are pointing to and thus, you could cause
295 * 'memory leaks'. In other words, the data you are pointing to that's being referenced
296 * by the queue entries should, most likely, need to be de-allocated (i.e. freed).
297 *********************************************************************************************************
298 */
299
300 #if OS_Q_FLUSH_EN > 0
\ In segment CODE, align 4, keep-with-next
301 INT8U OSQFlush (OS_EVENT *pevent)
302 {
\ OSQFlush:
\ 00000000 10B5 PUSH {R4,LR}
\ 00000002 0400 MOVS R4,R0
303 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
304 OS_CPU_SR cpu_sr;
305 #endif
306 OS_Q *pq;
307
308
309 #if OS_ARG_CHK_EN > 0
310 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
\ 00000004 01D1 BNE ??OSQFlush_0
311 return (OS_ERR_PEVENT_NULL);
\ 00000006 0420 MOVS R0,#+4
\ 00000008 0FE0 B ??OSQFlush_1
312 }
313 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
\ ??OSQFlush_0:
\ 0000000A 2078 LDRB R0,[R4, #+0]
\ 0000000C 0228 CMP R0,#+2
\ 0000000E 01D0 BEQ ??OSQFlush_2
314 return (OS_ERR_EVENT_TYPE);
\ 00000010 0120 MOVS R0,#+1
\ 00000012 0AE0 B ??OSQFlush_1
315 }
316 #endif
317 OS_ENTER_CRITICAL();
\ ??OSQFlush_2:
\ 00000014 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
318 pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue storage structure */
\ 00000018 6168 LDR R1,[R4, #+4]
319 pq->OSQIn = pq->OSQStart;
\ 0000001A 4A68 LDR R2,[R1, #+4]
\ 0000001C CA60 STR R2,[R1, #+12]
320 pq->OSQOut = pq->OSQStart;
\ 0000001E 0A61 STR R2,[R1, #+16]
321 pq->OSQEntries = 0;
\ 00000020 0022 MOVS R2,#+0
\ 00000022 CA82 STRH R2,[R1, #+22]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -