?? os_q.txt
字號:
;;;237 *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
00010e 200f MOVS r0,#0xf
000110 7028 STRB r0,[r5,#0]
;;;238 return (pevent);
000112 4620 MOV r0,r4
000114 e8bde8bd POP {r4-r12,pc}
|L1.280|
;;;239 }
;;;240 OS_ENTER_CRITICAL();
000118 f7fff7ff BL OS_CPU_SR_Save
00011c 4683 MOV r11,r0
;;;241 if (pevent->OSEventGrp != 0) { /* See if any tasks waiting on queue */
00011e 7aa1 LDRB r1,[r4,#0xa]
000120 b109 CBZ r1,|L1.294|
;;;242 tasks_waiting = OS_TRUE; /* Yes */
000122 2601 MOVS r6,#1
000124 e000 B |L1.296|
|L1.294|
;;;243 } else {
;;;244 tasks_waiting = OS_FALSE; /* No */
000126 2600 MOVS r6,#0
|L1.296|
;;;245 }
;;;246 switch (opt) {
000128 0038 MOVS r0,r7
00012a f8dff8df LDR r8,|L1.1116|
00012e f8dff8df LDR r9,|L1.1112|
000132 f04ff04f MOV r7,#0x3f
000136 f04ff04f MOV r10,#0
00013a d004 BEQ |L1.326|
00013c 2801 CMP r0,#1
00013e d14c BNE |L1.474|
000140 2900 CMP r1,#0
000142 d02c BEQ |L1.414|
;;;247 case OS_DEL_NO_PEND: /* Delete queue only if no task waiting */
;;;248 if (tasks_waiting == OS_FALSE) {
;;;249 #if OS_EVENT_NAME_SIZE > 1
;;;250 pevent->OSEventName[0] = '?'; /* Unknown name */
;;;251 pevent->OSEventName[1] = OS_ASCII_NUL;
;;;252 #endif
;;;253 pq = (OS_Q *)pevent->OSEventPtr; /* Return OS_Q to free list */
;;;254 pq->OSQPtr = OSQFreeList;
;;;255 OSQFreeList = pq;
;;;256 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;257 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
;;;258 pevent->OSEventCnt = 0;
;;;259 OSEventFreeList = pevent; /* Get next free event control block */
;;;260 OS_EXIT_CRITICAL();
;;;261 *perr = OS_ERR_NONE;
;;;262 pevent_return = (OS_EVENT *)0; /* Queue has been deleted */
;;;263 } else {
;;;264 OS_EXIT_CRITICAL();
;;;265 *perr = OS_ERR_TASK_WAITING;
;;;266 pevent_return = pevent;
;;;267 }
;;;268 break;
;;;269
;;;270 case OS_DEL_ALWAYS: /* Always delete the queue */
;;;271 while (pevent->OSEventGrp != 0) { /* Ready ALL tasks waiting for queue */
000144 e022 B |L1.396|
|L1.326|
000146 b9ce CBNZ r6,|L1.380|
000148 73e7 STRB r7,[r4,#0xf]
00014a f884f884 STRB r10,[r4,#0x10]
00014e 6860 LDR r0,[r4,#4]
000150 f8d8f8d8 LDR r1,[r8,#0] ; OSQFreeList
000154 6001 STR r1,[r0,#0]
000156 f8c8f8c8 STR r0,[r8,#0] ; OSQFreeList
00015a f884f884 STRB r10,[r4,#0]
00015e f8d9f8d9 LDR r0,[r9,#0] ; OSEventFreeList
000162 6060 STR r0,[r4,#4]
000164 f8a4f8a4 STRH r10,[r4,#8]
000168 f8c9f8c9 STR r4,[r9,#0] ; OSEventFreeList
00016c 4658 MOV r0,r11
00016e f7fff7ff BL OS_CPU_SR_Restore
000172 f885f885 STRB r10,[r5,#0]
000176 2000 MOVS r0,#0
000178 e8bde8bd POP {r4-r12,pc}
|L1.380|
00017c 4658 MOV r0,r11
00017e f7fff7ff BL OS_CPU_SR_Restore
000182 2049 MOVS r0,#0x49
000184 7028 STRB r0,[r5,#0]
000186 4620 MOV r0,r4
000188 e8bde8bd POP {r4-r12,pc}
|L1.396|
00018c 2300 MOVS r3,#0
00018e 2204 MOVS r2,#4
000190 4619 MOV r1,r3
000192 4620 MOV r0,r4
000194 f7fff7ff BL OS_EventTaskRdy
000198 7aa0 LDRB r0,[r4,#0xa]
00019a 2800 CMP r0,#0
00019c d1f6 BNE |L1.396|
|L1.414|
;;;272 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q, OS_STAT_PEND_OK);
;;;273 }
;;;274 #if OS_EVENT_NAME_SIZE > 1
;;;275 pevent->OSEventName[0] = '?'; /* Unknown name */
00019e 73e7 STRB r7,[r4,#0xf]
;;;276 pevent->OSEventName[1] = OS_ASCII_NUL;
0001a0 f884f884 STRB r10,[r4,#0x10]
;;;277 #endif
;;;278 pq = (OS_Q *)pevent->OSEventPtr; /* Return OS_Q to free list */
0001a4 6860 LDR r0,[r4,#4]
;;;279 pq->OSQPtr = OSQFreeList;
0001a6 f8d8f8d8 LDR r1,[r8,#0] ; OSQFreeList
0001aa 6001 STR r1,[r0,#0]
;;;280 OSQFreeList = pq;
0001ac f8c8f8c8 STR r0,[r8,#0] ; OSQFreeList
;;;281 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
0001b0 f884f884 STRB r10,[r4,#0]
;;;282 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
0001b4 f8d9f8d9 LDR r0,[r9,#0] ; OSEventFreeList
0001b8 6060 STR r0,[r4,#4]
;;;283 pevent->OSEventCnt = 0;
0001ba f8a4f8a4 STRH r10,[r4,#8]
;;;284 OSEventFreeList = pevent; /* Get next free event control block */
0001be f8c9f8c9 STR r4,[r9,#0] ; OSEventFreeList
;;;285 OS_EXIT_CRITICAL();
0001c2 4658 MOV r0,r11
0001c4 f7fff7ff BL OS_CPU_SR_Restore
;;;286 if (tasks_waiting == OS_TRUE) { /* Reschedule only if task(s) were waiting */
0001c8 2e01 CMP r6,#1
0001ca d101 BNE |L1.464|
;;;287 OS_Sched(); /* Find highest priority task ready to run */
0001cc f7fff7ff BL OS_Sched
|L1.464|
;;;288 }
;;;289 *perr = OS_ERR_NONE;
0001d0 f885f885 STRB r10,[r5,#0]
;;;290 pevent_return = (OS_EVENT *)0; /* Queue has been deleted */
0001d4 2000 MOVS r0,#0
0001d6 e8bde8bd POP {r4-r12,pc}
|L1.474|
;;;291 break;
;;;292
;;;293 default:
;;;294 OS_EXIT_CRITICAL();
0001da 4658 MOV r0,r11
0001dc f7fff7ff BL OS_CPU_SR_Restore
;;;295 *perr = OS_ERR_INVALID_OPT;
0001e0 2007 MOVS r0,#7
0001e2 7028 STRB r0,[r5,#0]
;;;296 pevent_return = pevent;
0001e4 4620 MOV r0,r4
;;;297 break;
;;;298 }
;;;299 return (pevent_return);
;;;300 }
0001e6 e8bde8bd POP {r4-r12,pc}
;;;301 #endif
ENDP
OSQFlush PROC
;;;324 INT8U OSQFlush (OS_EVENT *pevent)
;;;325 {
0001ea b510 PUSH {r4,lr}
0001ec 4604 MOV r4,r0
;;;326 OS_Q *pq;
;;;327 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;328 OS_CPU_SR cpu_sr = 0;
;;;329 #endif
;;;330
;;;331
;;;332
;;;333 #if OS_ARG_CHK_EN > 0
;;;334 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
0001ee b90c CBNZ r4,|L1.500|
;;;335 return (OS_ERR_PEVENT_NULL);
0001f0 2004 MOVS r0,#4
;;;336 }
;;;337 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
;;;338 return (OS_ERR_EVENT_TYPE);
;;;339 }
;;;340 #endif
;;;341 OS_ENTER_CRITICAL();
;;;342 pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue storage structure */
;;;343 pq->OSQIn = pq->OSQStart;
;;;344 pq->OSQOut = pq->OSQStart;
;;;345 pq->OSQEntries = 0;
;;;346 OS_EXIT_CRITICAL();
;;;347 return (OS_ERR_NONE);
;;;348 }
0001f2 bd10 POP {r4,pc}
|L1.500|
0001f4 7820 LDRB r0,[r4,#0]
0001f6 2802 CMP r0,#2
0001f8 d001 BEQ |L1.510|
0001fa 2001 MOVS r0,#1
0001fc bd10 POP {r4,pc}
|L1.510|
0001fe f7fff7ff BL OS_CPU_SR_Save
000202 6861 LDR r1,[r4,#4]
000204 684a LDR r2,[r1,#4]
000206 60ca STR r2,[r1,#0xc]
000208 684a LDR r2,[r1,#4]
00020a 610a STR r2,[r1,#0x10]
00020c 2200 MOVS r2,#0
00020e 82ca STRH r2,[r1,#0x16]
000210 f7fff7ff BL OS_CPU_SR_Restore
000214 2000 MOVS r0,#0
000216 bd10 POP {r4,pc}
;;;349 #endif
ENDP
OSQPend PROC
;;;388 void *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;389 {
000218 e92de92d PUSH {r4-r10,lr}
00021c 4605 MOV r5,r0
00021e 460f MOV r7,r1
000220 4614 MOV r4,r2
;;;390 void *pmsg;
;;;391 OS_Q *pq;
;;;392 INT8U pend_stat;
;;;393 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;394 OS_CPU_SR cpu_sr = 0;
;;;395 #endif
;;;396
;;;397
;;;398
;;;399 #if OS_ARG_CHK_EN > 0
;;;400 if (perr == (INT8U *)0) { /* Validate 'perr' */
000222 b914 CBNZ r4,|L1.554|
;;;401 return ((void *)0);
000224 2000 MOVS r0,#0
000226 e8bde8bd POP {r4-r10,pc}
|L1.554|
;;;402 }
;;;403 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
00022a b925 CBNZ r5,|L1.566|
;;;404 *perr = OS_ERR_PEVENT_NULL;
00022c 2004 MOVS r0,#4
00022e 7020 STRB r0,[r4,#0]
;;;405 return ((void *)0);
000230 2000 MOVS r0,#0
000232 e8bde8bd POP {r4-r10,pc}
|L1.566|
;;;406 }
;;;407 if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* Validate event block type */
000236 7828 LDRB r0,[r5,#0]
000238 2802 CMP r0,#2
00023a d004 BEQ |L1.582|
;;;408 *perr = OS_ERR_EVENT_TYPE;
00023c 2001 MOVS r0,#1
00023e 7020 STRB r0,[r4,#0]
;;;409 return ((void *)0);
000240 2000 MOVS r0,#0
000242 e8bde8bd POP {r4-r10,pc}
|L1.582|
;;;410 }
;;;411 #endif
;;;412 if (OSIntNesting > 0) { /* See if called from ISR ... */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -