os_q.txt
来自「针对STM32F103的UCOS移植」· 文本 代码 · 共 1,204 行 · 第 1/5 页
TXT
1,204 行
;;;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 *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 */
;;;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 *perr = OS_ERR_NONE;
;;;290 pevent_return = (OS_EVENT *)0; /* Queue has been deleted */
;;;291 break;
;;;292
;;;293 default:
;;;294 OS_EXIT_CRITICAL();
;;;295 *perr = OS_ERR_INVALID_OPT;
;;;296 pevent_return = pevent;
;;;297 break;
;;;298 }
;;;299 return (pevent_return);
;;;300 }
0000e8 e8bd9ff0 POP {r4-r12,pc}
|L1.236|
0000ec b924 CBNZ r4,|L1.248|
0000ee 2004 MOVS r0,#4 ;228
0000f0 7028 STRB r0,[r5,#0] ;228
0000f2 4620 MOV r0,r4 ;229
0000f4 e8bd9ff0 POP {r4-r12,pc}
|L1.248|
0000f8 7820 LDRB r0,[r4,#0] ;232
0000fa 2802 CMP r0,#2 ;232
0000fc d004 BEQ |L1.264|
0000fe 2001 MOVS r0,#1 ;233
000100 7028 STRB r0,[r5,#0] ;233
000102 4620 MOV r0,r4 ;234
000104 e8bd9ff0 POP {r4-r12,pc}
|L1.264|
000108 48d2 LDR r0,|L1.1108|
00010a 7800 LDRB r0,[r0,#0] ;236 ; OSIntNesting
00010c b120 CBZ r0,|L1.280|
00010e 200f MOVS r0,#0xf ;237
000110 7028 STRB r0,[r5,#0] ;237
000112 4620 MOV r0,r4 ;238
000114 e8bd9ff0 POP {r4-r12,pc}
|L1.280|
000118 f7fffffe BL OS_CPU_SR_Save
00011c 4683 MOV r11,r0 ;240
00011e 7aa1 LDRB r1,[r4,#0xa] ;241
000120 b109 CBZ r1,|L1.294|
000122 2601 MOVS r6,#1 ;242
000124 e000 B |L1.296|
|L1.294|
000126 2600 MOVS r6,#0 ;244
|L1.296|
000128 0038 MOVS r0,r7 ;246
00012a f8df8330 LDR r8,|L1.1116|
00012e f8df9328 LDR r9,|L1.1112|
000132 f04f073f MOV r7,#0x3f ;246
000136 f04f0a00 MOV r10,#0 ;246
00013a d004 BEQ |L1.326|
00013c 2801 CMP r0,#1 ;246
00013e d14c BNE |L1.474|
000140 2900 CMP r1,#0 ;271
000142 d02c BEQ |L1.414|
000144 e022 B |L1.396|
|L1.326|
000146 b9ce CBNZ r6,|L1.380|
000148 73e7 STRB r7,[r4,#0xf] ;250
00014a f884a010 STRB r10,[r4,#0x10] ;251
00014e 6860 LDR r0,[r4,#4] ;253
000150 f8d81000 LDR r1,[r8,#0] ;254 ; OSQFreeList
000154 6001 STR r1,[r0,#0] ;254
000156 f8c80000 STR r0,[r8,#0] ;255 ; OSQFreeList
00015a f884a000 STRB r10,[r4,#0] ;256
00015e f8d90000 LDR r0,[r9,#0] ;257 ; OSEventFreeList
000162 6060 STR r0,[r4,#4] ;257
000164 f8a4a008 STRH r10,[r4,#8] ;258
000168 f8c94000 STR r4,[r9,#0] ;259 ; OSEventFreeList
00016c 4658 MOV r0,r11 ;260
00016e f7fffffe BL OS_CPU_SR_Restore
000172 f885a000 STRB r10,[r5,#0] ;261
000176 2000 MOVS r0,#0 ;262
000178 e8bd9ff0 POP {r4-r12,pc}
|L1.380|
00017c 4658 MOV r0,r11 ;264
00017e f7fffffe BL OS_CPU_SR_Restore
000182 2049 MOVS r0,#0x49 ;265
000184 7028 STRB r0,[r5,#0] ;265
000186 4620 MOV r0,r4 ;266
000188 e8bd9ff0 POP {r4-r12,pc}
|L1.396|
00018c 2300 MOVS r3,#0 ;272
00018e 2204 MOVS r2,#4 ;272
000190 4619 MOV r1,r3 ;272
000192 4620 MOV r0,r4 ;272
000194 f7fffffe BL OS_EventTaskRdy
000198 7aa0 LDRB r0,[r4,#0xa] ;271
00019a 2800 CMP r0,#0 ;271
00019c d1f6 BNE |L1.396|
|L1.414|
00019e 73e7 STRB r7,[r4,#0xf] ;275
0001a0 f884a010 STRB r10,[r4,#0x10] ;276
0001a4 6860 LDR r0,[r4,#4] ;278
0001a6 f8d81000 LDR r1,[r8,#0] ;279 ; OSQFreeList
0001aa 6001 STR r1,[r0,#0] ;279
0001ac f8c80000 STR r0,[r8,#0] ;280 ; OSQFreeList
0001b0 f884a000 STRB r10,[r4,#0] ;281
0001b4 f8d90000 LDR r0,[r9,#0] ;282 ; OSEventFreeList
0001b8 6060 STR r0,[r4,#4] ;282
0001ba f8a4a008 STRH r10,[r4,#8] ;283
0001be f8c94000 STR r4,[r9,#0] ;284 ; OSEventFreeList
0001c2 4658 MOV r0,r11 ;285
0001c4 f7fffffe BL OS_CPU_SR_Restore
0001c8 2e01 CMP r6,#1 ;286
0001ca d101 BNE |L1.464|
0001cc f7fffffe BL OS_Sched
|L1.464|
0001d0 f885a000 STRB r10,[r5,#0] ;289
0001d4 2000 MOVS r0,#0 ;290
0001d6 e8bd9ff0 POP {r4-r12,pc}
|L1.474|
0001da 4658 MOV r0,r11 ;294
0001dc f7fffffe BL OS_CPU_SR_Restore
0001e0 2007 MOVS r0,#7 ;295
0001e2 7028 STRB r0,[r5,#0] ;295
0001e4 4620 MOV r0,r4 ;296
0001e6 e8bd9ff0 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] ;337
0001f6 2802 CMP r0,#2 ;337
0001f8 d001 BEQ |L1.510|
0001fa 2001 MOVS r0,#1 ;338
0001fc bd10 POP {r4,pc}
|L1.510|
0001fe f7fffffe BL OS_CPU_SR_Save
000202 6861 LDR r1,[r4,#4] ;342
000204 684a LDR r2,[r1,#4] ;343
000206 60ca STR r2,[r1,#0xc] ;343
000208 684a LDR r2,[r1,#4] ;344
00020a 610a STR r2,[r1,#0x10] ;344
00020c 2200 MOVS r2,#0 ;345
00020e 82ca STRH r2,[r1,#0x16] ;345
000210 f7fffffe BL OS_CPU_SR_Restore
000214 2000 MOVS r0,#0 ;347
000216 bd10 POP {r4,pc}
;;;349 #endif
ENDP
OSQPend PROC
;;;388 void *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;389 {
000218 e92d47f0 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
;;;402 }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?