📄 os_flag.txt
字号:
;;;351 pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list */
00025a f8d9f8d9 LDR r0,[r9,#0] ; OSFlagFreeList
00025e 6060 STR r0,[r4,#4]
;;;352 pgrp->OSFlagFlags = (OS_FLAGS)0;
000260 f8a4f8a4 STRH r10,[r4,#8]
;;;353 OSFlagFreeList = pgrp;
000264 f8c9f8c9 STR r4,[r9,#0] ; OSFlagFreeList
;;;354 OS_EXIT_CRITICAL();
000268 4658 MOV r0,r11
00026a f7fff7ff BL OS_CPU_SR_Restore
;;;355 if (tasks_waiting == OS_TRUE) { /* Reschedule only if task(s) were waiting */
00026e 2f01 CMP r7,#1
000270 d101 BNE |L1.630|
;;;356 OS_Sched(); /* Find highest priority task ready to run */
000272 f7fff7ff BL OS_Sched
|L1.630|
;;;357 }
;;;358 *perr = OS_ERR_NONE;
000276 f885f885 STRB r10,[r5,#0]
;;;359 pgrp_return = (OS_FLAG_GRP *)0; /* Event Flag Group has been deleted */
00027a 2000 MOVS r0,#0
00027c e8bde8bd POP {r4-r12,pc}
|L1.640|
;;;360 break;
;;;361
;;;362 default:
;;;363 OS_EXIT_CRITICAL();
000280 4658 MOV r0,r11
000282 f7fff7ff BL OS_CPU_SR_Restore
;;;364 *perr = OS_ERR_INVALID_OPT;
000286 2007 MOVS r0,#7
000288 7028 STRB r0,[r5,#0]
;;;365 pgrp_return = pgrp;
00028a 4620 MOV r0,r4
;;;366 break;
;;;367 }
;;;368 return (pgrp_return);
;;;369 }
00028c e8bde8bd POP {r4-r12,pc}
;;;370 #endif
ENDP
OSFlagNameGet PROC
;;;396 INT8U OSFlagNameGet (OS_FLAG_GRP *pgrp, INT8U *pname, INT8U *perr)
;;;397 {
000290 e92de92d PUSH {r4-r8,lr}
000294 4605 MOV r5,r0
000296 460e MOV r6,r1
000298 4614 MOV r4,r2
;;;398 INT8U len;
;;;399 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;400 OS_CPU_SR cpu_sr = 0;
;;;401 #endif
;;;402
;;;403
;;;404
;;;405 #if OS_ARG_CHK_EN > 0
;;;406 if (perr == (INT8U *)0) { /* Validate 'perr' */
00029a b914 CBNZ r4,|L1.674|
;;;407 return (0);
00029c 2000 MOVS r0,#0
00029e e8bde8bd POP {r4-r8,pc}
|L1.674|
;;;408 }
;;;409 if (pgrp == (OS_FLAG_GRP *)0) { /* Is 'pgrp' a NULL pointer? */
0002a2 b925 CBNZ r5,|L1.686|
;;;410 *perr = OS_ERR_FLAG_INVALID_PGRP;
0002a4 206e MOVS r0,#0x6e
0002a6 7020 STRB r0,[r4,#0]
;;;411 return (0);
0002a8 2000 MOVS r0,#0
0002aa e8bde8bd POP {r4-r8,pc}
|L1.686|
;;;412 }
;;;413 if (pname == (INT8U *)0) { /* Is 'pname' a NULL pointer? */
0002ae b926 CBNZ r6,|L1.698|
;;;414 *perr = OS_ERR_PNAME_NULL;
0002b0 200c MOVS r0,#0xc
0002b2 7020 STRB r0,[r4,#0]
;;;415 return (0);
0002b4 2000 MOVS r0,#0
0002b6 e8bde8bd POP {r4-r8,pc}
|L1.698|
;;;416 }
;;;417 #endif
;;;418 if (OSIntNesting > 0) { /* See if trying to call from an ISR */
0002ba 4886 LDR r0,|L1.1236|
0002bc 7800 LDRB r0,[r0,#0] ; OSIntNesting
0002be b120 CBZ r0,|L1.714|
;;;419 *perr = OS_ERR_NAME_GET_ISR;
0002c0 2011 MOVS r0,#0x11
0002c2 7020 STRB r0,[r4,#0]
;;;420 return (0);
0002c4 2000 MOVS r0,#0
0002c6 e8bde8bd POP {r4-r8,pc}
|L1.714|
;;;421 }
;;;422 OS_ENTER_CRITICAL();
0002ca f7fff7ff BL OS_CPU_SR_Save
0002ce 4607 MOV r7,r0
;;;423 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {
0002d0 7828 LDRB r0,[r5,#0]
0002d2 2805 CMP r0,#5
0002d4 d007 BEQ |L1.742|
;;;424 OS_EXIT_CRITICAL();
0002d6 4638 MOV r0,r7
0002d8 f7fff7ff BL OS_CPU_SR_Restore
;;;425 *perr = OS_ERR_EVENT_TYPE;
0002dc 2001 MOVS r0,#1
0002de 7020 STRB r0,[r4,#0]
;;;426 return (0);
0002e0 2000 MOVS r0,#0
0002e2 e8bde8bd POP {r4-r8,pc}
|L1.742|
;;;427 }
;;;428 len = OS_StrCopy(pname, pgrp->OSFlagName); /* Copy name from OS_FLAG_GRP */
0002e6 f105f105 ADD r1,r5,#0xa
0002ea 4630 MOV r0,r6
0002ec f7fff7ff BL OS_StrCopy
0002f0 4605 MOV r5,r0
;;;429 OS_EXIT_CRITICAL();
0002f2 4638 MOV r0,r7
0002f4 f7fff7ff BL OS_CPU_SR_Restore
;;;430 *perr = OS_ERR_NONE;
0002f8 2000 MOVS r0,#0
0002fa 7020 STRB r0,[r4,#0]
;;;431 return (len);
0002fc 4628 MOV r0,r5
;;;432 }
0002fe e8bde8bd POP {r4-r8,pc}
;;;433 #endif
ENDP
OSFlagNameSet PROC
;;;460 void OSFlagNameSet (OS_FLAG_GRP *pgrp, INT8U *pname, INT8U *perr)
;;;461 {
000302 e92de92d PUSH {r4-r8,lr}
000306 4605 MOV r5,r0
000308 460e MOV r6,r1
00030a 4614 MOV r4,r2
;;;462 INT8U len;
;;;463 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;464 OS_CPU_SR cpu_sr = 0;
;;;465 #endif
;;;466
;;;467
;;;468
;;;469 #if OS_ARG_CHK_EN > 0
;;;470 if (perr == (INT8U *)0) { /* Validate 'perr' */
00030c 2c00 CMP r4,#0
00030e d002 BEQ |L1.790|
;;;471 return;
;;;472 }
;;;473 if (pgrp == (OS_FLAG_GRP *)0) { /* Is 'pgrp' a NULL pointer? */
000310 b91d CBNZ r5,|L1.794|
;;;474 *perr = OS_ERR_FLAG_INVALID_PGRP;
000312 206e MOVS r0,#0x6e
000314 7020 STRB r0,[r4,#0]
|L1.790|
000316 e8bde8bd POP {r4-r8,pc}
|L1.794|
;;;475 return;
;;;476 }
;;;477 if (pname == (INT8U *)0) { /* Is 'pname' a NULL pointer? */
00031a b91e CBNZ r6,|L1.804|
;;;478 *perr = OS_ERR_PNAME_NULL;
00031c 200c MOVS r0,#0xc
00031e 7020 STRB r0,[r4,#0]
000320 e8bde8bd POP {r4-r8,pc}
|L1.804|
;;;479 return;
;;;480 }
;;;481 #endif
;;;482 if (OSIntNesting > 0) { /* See if trying to call from an ISR */
000324 486b LDR r0,|L1.1236|
000326 7800 LDRB r0,[r0,#0] ; OSIntNesting
000328 b118 CBZ r0,|L1.818|
;;;483 *perr = OS_ERR_NAME_SET_ISR;
00032a 2012 MOVS r0,#0x12
00032c 7020 STRB r0,[r4,#0]
00032e e8bde8bd POP {r4-r8,pc}
|L1.818|
;;;484 return;
;;;485 }
;;;486 OS_ENTER_CRITICAL();
000332 f7fff7ff BL OS_CPU_SR_Save
000336 4607 MOV r7,r0
;;;487 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {
000338 7828 LDRB r0,[r5,#0]
00033a 2805 CMP r0,#5
00033c d006 BEQ |L1.844|
;;;488 OS_EXIT_CRITICAL();
00033e 4638 MOV r0,r7
000340 f7fff7ff BL OS_CPU_SR_Restore
;;;489 *perr = OS_ERR_EVENT_TYPE;
000344 2001 MOVS r0,#1
000346 7020 STRB r0,[r4,#0]
000348 e8bde8bd POP {r4-r8,pc}
|L1.844|
;;;490 return;
;;;491 }
;;;492 len = OS_StrLen(pname); /* Can we fit the string in the storage area? */
00034c 4630 MOV r0,r6
00034e f7fff7ff BL OS_StrLen
;;;493 if (len > (OS_FLAG_NAME_SIZE - 1)) { /* No */
000352 280f CMP r0,#0xf
000354 d906 BLS |L1.868|
;;;494 OS_EXIT_CRITICAL();
000356 4638 MOV r0,r7
000358 f7fff7ff BL OS_CPU_SR_Restore
;;;495 *perr = OS_ERR_FLAG_NAME_TOO_LONG;
00035c 2073 MOVS r0,#0x73
00035e 7020 STRB r0,[r4,#0]
000360 e8bde8bd POP {r4-r8,pc}
|L1.868|
;;;496 return;
;;;497 }
;;;498 (void)OS_StrCopy(pgrp->OSFlagName, pname); /* Yes, copy name from OS_FLAG_GRP */
000364 4631 MOV r1,r6
000366 f105f105 ADD r0,r5,#0xa
00036a f7fff7ff BL OS_StrCopy
;;;499 OS_EXIT_CRITICAL();
00036e 4638 MOV r0,r7
000370 f7fff7ff BL OS_CPU_SR_Restore
;;;500 *perr = OS_ERR_NONE;
000374 2000 MOVS r0,#0
000376 7020 STRB r0,[r4,#0]
;;;501 return;
;;;502 }
000378 e8bde8bd POP {r4-r8,pc}
;;;503 #endif
ENDP
OS_FlagBlock PROC
;;;988 static void OS_FlagBlock (OS_FLAG_GRP *pgrp, OS_FLAG_NODE *pnode, OS_FLAGS flags, INT8U wait_type, INT16U timeout)
;;;989 {
00037c b470 PUSH {r4-r6}
00037e 9c03 LDR r4,[sp,#0xc]
;;;990 OS_FLAG_NODE *pnode_next;
;;;991 INT8U y;
;;;992
;;;993
;;;994 OSTCBCur->OSTCBStat |= OS_STAT_FLAG;
000380 4d58 LDR r5,|L1.1252|
000382 f8d5f8d5 LDR r12,[r5,#0] ; OSTCBCur
000386 f89cf89c LDRB r6,[r12,#0x2c]
00038a f046f046 ORR r6,r6,#0x20
00038e f88cf88c STRB r6,[r12,#0x2c]
;;;995 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;
000392 2600 MOVS r6,#0
000394 f88cf88c STRB r6,[r12,#0x2d]
;;;996 OSTCBCur->OSTCBDly = timeout; /* Store timeout in task's TCB */
000398 f8acf8ac STRH r4,[r12,#0x2a]
;;;997 #if OS_TASK_DEL_EN > 0
;;;998 OSTCBCur->OSTCBFlagNode = pnode; /* TCB to link to node */
00039c f8ccf8cc STR r1,[r12,#0x24]
;;;999 #endif
;;;1000 pnode->OSFlagNodeFlags = flags; /* Save the flags that we need to wait for */
0003a0 820a STRH r2,[r1,#0x10]
;;;1001 pnode->OSFlagNodeWaitType = wait_type; /* Save the type of wait we are doing */
0003a2 748b STRB r3,[r1,#0x12]
;;;1002 pnode->OSFlagNodeTCB = (void *)OSTCBCur; /* Link to task's TCB */
0003a4 f8c1f8c1 STR r12,[r1,#8]
;;;1003 pnode->OSFlagNodeNext = pgrp->OSFlagWaitList; /* Add node at beginning of event flag wait list */
0003a8 6842 LDR r2,[r0,#4]
0003aa 600a STR r2,[r1,#0]
;;;1004 pnode->OSFlagNodePrev = (void *)0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -