📄 os_q.txt
字号:
;;;240 OS_ENTER_CRITICAL();
;;;241 if (pevent->OSEventGrp != 0) { /* See if any tasks waiting on queue */
;;;242 tasks_waiting = OS_TRUE; /* Yes */
;;;243 } else {
;;;244 tasks_waiting = OS_FALSE; /* No */
;;;245 }
;;;246 switch (opt) {
;;;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 *err = OS_ERR_NONE;
;;;262 pevent_return = (OS_EVENT *)0; /* Queue has been deleted */
;;;263 } else {
;;;264 OS_EXIT_CRITICAL();
;;;265 *err = 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 */
;;;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 */
;;;276 pevent->OSEventName[1] = OS_ASCII_NUL;
;;;277 #endif
;;;278 pq = (OS_Q *)pevent->OSEventPtr; /* Return OS_Q to free list */
;;;279 pq->OSQPtr = OSQFreeList;
;;;280 OSQFreeList = pq;
;;;281 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;282 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
;;;283 pevent->OSEventCnt = 0;
;;;284 OSEventFreeList = pevent; /* Get next free event control block */
;;;285 OS_EXIT_CRITICAL();
;;;286 if (tasks_waiting == OS_TRUE) { /* Reschedule only if task(s) were waiting */
;;;287 OS_Sched(); /* Find highest priority task ready to run */
;;;288 }
;;;289 *err = OS_ERR_NONE;
;;;290 pevent_return = (OS_EVENT *)0; /* Queue has been deleted */
;;;291 break;
;;;292
;;;293 default:
;;;294 OS_EXIT_CRITICAL();
;;;295 *err = OS_ERR_INVALID_OPT;
;;;296 pevent_return = pevent;
;;;297 break;
;;;298 }
;;;299 return (pevent_return);
;;;300 }
000208 e12fff1e BX lr
|L1.524|
00020c e3540000 CMP r4,#0
000210 1a000003 BNE |L1.548|
000214 e3a00004 MOV r0,#4
000218 e5c60000 STRB r0,[r6,#0]
00021c e1a00004 MOV r0,r4
000220 eafffff7 B |L1.516|
|L1.548|
000224 e5d40000 LDRB r0,[r4,#0]
000228 e3500002 CMP r0,#2
00022c 0a000003 BEQ |L1.576|
000230 e3a00001 MOV r0,#1
000234 e5c60000 STRB r0,[r6,#0]
000238 e1a00004 MOV r0,r4
00023c eafffff0 B |L1.516|
|L1.576|
000240 e59f095c LDR r0,|L1.2980|
000244 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000248 e3500000 CMP r0,#0
00024c da000003 BLE |L1.608|
000250 e3a0000f MOV r0,#0xf
000254 e5c60000 STRB r0,[r6,#0]
000258 e1a00004 MOV r0,r4
00025c eaffffe8 B |L1.516|
|L1.608|
000260 ebfffffe BL OS_CPU_SR_Save
000264 e1a0a000 MOV r10,r0
000268 e5d4000a LDRB r0,[r4,#0xa]
00026c e3500000 CMP r0,#0
000270 0a000001 BEQ |L1.636|
000274 e3a07001 MOV r7,#1
000278 ea000000 B |L1.640|
|L1.636|
00027c e3a07000 MOV r7,#0
|L1.640|
000280 e3550000 CMP r5,#0
000284 0a000002 BEQ |L1.660|
000288 e3550001 CMP r5,#1
00028c 1a000048 BNE |L1.948|
000290 ea000021 B |L1.796|
|L1.660|
000294 e1a00000 MOV r0,r0
000298 e3570000 CMP r7,#0
00029c 1a000018 BNE |L1.772|
0002a0 e3a0003f MOV r0,#0x3f
0002a4 e5c4000f STRB r0,[r4,#0xf]
0002a8 e3a00000 MOV r0,#0
0002ac e5c40010 STRB r0,[r4,#0x10]
0002b0 e5948004 LDR r8,[r4,#4]
0002b4 e59f08f0 LDR r0,|L1.2988|
0002b8 e5900000 LDR r0,[r0,#0] ; OSQFreeList
0002bc e5880000 STR r0,[r8,#0]
0002c0 e59f08e4 LDR r0,|L1.2988|
0002c4 e5808000 STR r8,[r0,#0] ; OSQFreeList
0002c8 e3a00000 MOV r0,#0
0002cc e5c40000 STRB r0,[r4,#0]
0002d0 e59f08d0 LDR r0,|L1.2984|
0002d4 e5900000 LDR r0,[r0,#0] ; OSEventFreeList
0002d8 e5840004 STR r0,[r4,#4]
0002dc e3a00000 MOV r0,#0
0002e0 e1c400b8 STRH r0,[r4,#8]
0002e4 e59f08bc LDR r0,|L1.2984|
0002e8 e5804000 STR r4,[r0,#0] ; OSEventFreeList
0002ec e1a0000a MOV r0,r10
0002f0 ebfffffe BL OS_CPU_SR_Restore
0002f4 e3a00000 MOV r0,#0
0002f8 e5c60000 STRB r0,[r6,#0]
0002fc e3a09000 MOV r9,#0
000300 ea000004 B |L1.792|
|L1.772|
000304 e1a0000a MOV r0,r10
000308 ebfffffe BL OS_CPU_SR_Restore
00030c e3a00049 MOV r0,#0x49
000310 e5c60000 STRB r0,[r6,#0]
000314 e1a09004 MOV r9,r4
|L1.792|
000318 ea00002c B |L1.976|
|L1.796|
00031c e1a00000 MOV r0,r0
000320 ea000004 B |L1.824|
|L1.804|
000324 e3a03000 MOV r3,#0
000328 e3a02004 MOV r2,#4
00032c e1a01003 MOV r1,r3
000330 e1a00004 MOV r0,r4
000334 ebfffffe BL OS_EventTaskRdy
|L1.824|
000338 e5d4000a LDRB r0,[r4,#0xa]
00033c e3500000 CMP r0,#0
000340 1afffff7 BNE |L1.804|
000344 e3a0003f MOV r0,#0x3f
000348 e5c4000f STRB r0,[r4,#0xf]
00034c e3a00000 MOV r0,#0
000350 e5c40010 STRB r0,[r4,#0x10]
000354 e5948004 LDR r8,[r4,#4]
000358 e59f084c LDR r0,|L1.2988|
00035c e5900000 LDR r0,[r0,#0] ; OSQFreeList
000360 e5880000 STR r0,[r8,#0]
000364 e59f0840 LDR r0,|L1.2988|
000368 e5808000 STR r8,[r0,#0] ; OSQFreeList
00036c e3a00000 MOV r0,#0
000370 e5c40000 STRB r0,[r4,#0]
000374 e59f082c LDR r0,|L1.2984|
000378 e5900000 LDR r0,[r0,#0] ; OSEventFreeList
00037c e5840004 STR r0,[r4,#4]
000380 e3a00000 MOV r0,#0
000384 e1c400b8 STRH r0,[r4,#8]
000388 e59f0818 LDR r0,|L1.2984|
00038c e5804000 STR r4,[r0,#0] ; OSEventFreeList
000390 e1a0000a MOV r0,r10
000394 ebfffffe BL OS_CPU_SR_Restore
000398 e3570001 CMP r7,#1
00039c 1a000000 BNE |L1.932|
0003a0 ebfffffe BL OS_Sched
|L1.932|
0003a4 e3a00000 MOV r0,#0
0003a8 e5c60000 STRB r0,[r6,#0]
0003ac e3a09000 MOV r9,#0
0003b0 ea000006 B |L1.976|
|L1.948|
0003b4 e1a00000 MOV r0,r0
0003b8 e1a0000a MOV r0,r10
0003bc ebfffffe BL OS_CPU_SR_Restore
0003c0 e3a00007 MOV r0,#7
0003c4 e5c60000 STRB r0,[r6,#0]
0003c8 e1a09004 MOV r9,r4
0003cc e1a00000 MOV r0,r0
|L1.976|
0003d0 e1a00000 MOV r0,r0
0003d4 e1a00009 MOV r0,r9
0003d8 eaffff89 B |L1.516|
ENDP
OSQFlush PROC
;;;324 INT8U OSQFlush (OS_EVENT *pevent)
;;;325 {
0003dc e92d4070 PUSH {r4-r6,lr}
0003e0 e1a04000 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;
0003e4 e3a06000 MOV r6,#0
;;;329 #endif
;;;330
;;;331
;;;332
;;;333 #if OS_ARG_CHK_EN > 0
;;;334 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
0003e8 e3540000 CMP r4,#0
0003ec 1a000002 BNE |L1.1020|
;;;335 return (OS_ERR_PEVENT_NULL);
0003f0 e3a00004 MOV r0,#4
|L1.1012|
0003f4 e8bd4070 POP {r4-r6,lr}
;;;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 }
0003f8 e12fff1e BX lr
|L1.1020|
0003fc e5d40000 LDRB r0,[r4,#0]
000400 e3500002 CMP r0,#2
000404 0a000001 BEQ |L1.1040|
000408 e3a00001 MOV r0,#1
00040c eafffff8 B |L1.1012|
|L1.1040|
000410 ebfffffe BL OS_CPU_SR_Save
000414 e1a06000 MOV r6,r0
000418 e5945004 LDR r5,[r4,#4]
00041c e5950004 LDR r0,[r5,#4]
000420 e585000c STR r0,[r5,#0xc]
000424 e5950004 LDR r0,[r5,#4]
000428 e5850010 STR r0,[r5,#0x10]
00042c e3a00000 MOV r0,#0
000430 e1c501b6 STRH r0,[r5,#0x16]
000434 e1a00006 MOV r0,r6
000438 ebfffffe BL OS_CPU_SR_Restore
00043c e3a00000 MOV r0,#0
000440 eaffffeb B |L1.1012|
ENDP
OSQPend PROC
;;;388 void *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
;;;389 {
000444 e92d47f0 PUSH {r4-r10,lr}
000448 e1a04000 MOV r4,r0
00044c e1a05001 MOV r5,r1
000450 e1a06002 MOV r6,r2
;;;390 void *msg;
;;;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;
000454 e3a0a000 MOV r10,#0
;;;395 #endif
;;;396
;;;397
;;;398
;;;399 #if OS_ARG_CHK_EN > 0
;;;400 if (err == (INT8U *)0) { /* Validate 'err' */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -